news 2026/5/30 15:57:50

Vue3 进阶,新特性 defineOptions/defineModel+Pinia 状态管理全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue3 进阶,新特性 defineOptions/defineModel+Pinia 状态管理全解析

Vue3.3 + 新增了defineOptionsdefineModel等实用语法糖,而Pinia则是 Vue3 官方推荐的状态管理工具(替代 Vuex)。

一、Vue3.3 新特性:语法糖简化开发

Vue3.3 推出了多个语法糖,核心是减少模板代码、提升开发效率。

1.defineOptions:简化组件选项

在 Vue3 中,组件的nameinheritAttrs等选项需要单独写在export default中,defineOptions可以直接在<script setup>中定义这些选项。
用法示例:

<script setup> // 直接在setup中定义组件选项 defineOptions({ name: 'MyComponent', // 组件名(用于keep-alive等场景) inheritAttrs: false // 禁止属性继承到根元素 }) </script>

替代的旧写法:

<script setup> // 旧写法:需要额外写export default </script> <script> export default { name: 'MyComponent', inheritAttrs: false } </script>

2.defineModel:简化双向绑定(v-model

在 Vue3 中,子组件实现v-model需要同时处理propsemitdefineModel可以一行代码实现双向绑定。
用法示例:
子组件(Input.vue):

<script setup> // 用defineModel定义双向绑定的属性 const modelValue = defineModel() </script> <template> <!-- 直接绑定到输入框 --> <input v-model="modelValue" /> </template>

父组件:

<script setup> import Input from './Input.vue' import { ref } from 'vue' const msg = ref('') </script> <template> <!-- 直接使用v-model --> <Input v-model="msg" /> <p>输入内容:{{ msg }}</p> </template>

替代的旧写法:

<!-- 子组件旧写法 --> <script setup> const props = defineProps(['modelValue']) const emit = defineEmits(['update:modelValue']) </script> <template> <input :value="props.modelValue" @input="emit('update:modelValue', $event.target.value)" /> </template>

二、Pinia:Vue3 官方状态管理工具

Pinia 是 Vue3 官方推荐的状态管理库,相比 Vuex 更轻量、更简洁,原生支持 TypeScript,是 Vue3 项目的首选。

1. 什么是 Pinia?

Pinia 可以理解为Vuex 的升级版,核心特点:

  • Mutations:直接在Action中修改状态;
  • 更简洁的 API:仅需defineStore定义仓库;
  • 原生支持 TS:类型提示更友好;
  • 轻量:打包体积仅 1KB 左右。

2. 手动添加 Pinia 到 Vue 项目

步骤 1:安装 Pinia

npminstallpinia

步骤 2:在入口文件注册 Pinia

// main.jsimport{createApp}from'vue'import{createPinia}from'pinia'// 引入PiniaimportAppfrom'./App.vue'constapp=createApp(App)app.use(createPinia())// 注册Piniaapp.mount('#app')

3. Pinia 的基本语法:defineStore

通过defineStore定义一个 “仓库(Store)”,每个仓库管理一块全局状态。
示例:定义用户仓库(userStore)

// src/stores/user.jsimport{defineStore}from'pinia'import{ref}from'vue'// 第一个参数:仓库唯一标识;第二个参数:仓库配置exportconstuseUserStore=defineStore('user',()=>{// 1. 状态(对应Vuex的state)constuserInfo=ref(null)consttoken=ref('')// 2. 计算属性(对应Vuex的getters)constisLogin=()=>{return!!token.value}// 3. 方法(对应Vuex的actions,支持异步)constlogin=async(form)=>{// 模拟接口请求constres=awaitnewPromise(resolve=>{setTimeout(()=>{resolve({userInfo:{name:'张三',age:20},token:'pinia_token_123'})},1000)})// 直接修改状态(无需Mutations)userInfo.value=res.userInfo token.value=res.token}constlogout=()=>{userInfo.value=nulltoken.value=''}// 返回需要暴露的状态、计算属性、方法return{userInfo,token,isLogin,login,logout}})

4. 在组件中使用 Pinia

在组件中通过useUserStore获取仓库实例,直接使用状态和方法。

<script setup> import { useUserStore } from '@/stores/user' // 获取仓库实例 const userStore = useUserStore() // 调用仓库方法 const handleLogin = async () => { await userStore.login({ username: 'zhangsan', password: '123' }) } </script> <template> <div v-if="userStore.isLogin()"> <p>用户名:{{ userStore.userInfo?.name }}</p> <button @click="userStore.logout">退出登录</button> </div> <button v-else @click="handleLogin">登录</button> </template>

5.Action异步写法

Pinia 的Action支持异步操作(直接写async/await),无需像 Vuex 那样区分同步 / 异步。

// src/stores/article.jsexportconstuseArticleStore=defineStore('article',()=>{constarticleList=ref([])// 异步Action:请求文章列表constfetchArticleList=async()=>{constres=awaitfetch('https://api.example.com/article/list')constdata=awaitres.json()articleList.value=data.list}return{articleList,fetchArticleList}})

6.storeToRefs:解构响应式状态

直接解构 Pinia 仓库的状态会丢失响应式,storeToRefs可以保留响应式。

<script setup> import { useUserStore } from '@/stores/user' import { storeToRefs } from 'pinia' // 引入storeToRefs const userStore = useUserStore() // 解构响应式状态 const { userInfo, token } = storeToRefs(userStore) // 方法直接解构(无需storeToRefs) const { login, logout } = userStore </script>

7. Pinia 持久化:状态本地存储

Pinia 默认不会持久化状态(刷新后丢失),可以用pinia-plugin-persistedstate插件实现本地存储。

步骤 1:安装插件

npminstallpinia-plugin-persistedstate

步骤 2:注册插件

// main.jsimport{createApp}from'vue'import{createPinia}from'pinia'importpiniaPluginPersistedstatefrom'pinia-plugin-persistedstate'// 引入插件importAppfrom'./App.vue'constpinia=createPinia()pinia.use(piniaPluginPersistedstate)// 注册插件createApp(App).use(pinia).mount('#app')

步骤 3:开启仓库持久化

// src/stores/user.jsexportconstuseUserStore=defineStore('user',()=>{// ...状态和方法},{persist:true// 开启持久化})

三、注意

想要了解更多有关Pinia的请点击这个链接到官网学习
想要学习持久化插件的更多内容的请点击这个链接

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 18:07:11

18.0环实现线程和进程的监控(ObRegisterCallbacks函数)-Windows驱动

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;17.过保护读内存&#xff08;通过内核&#xff08;驱动&#xff09;apc的方式附…

作者头像 李华
网站建设 2026/5/21 1:25:12

内容负责人必读:构建企业GEO优化体系的几大关键

在AI驱动的信息检索时代&#xff0c;GEO优化&#xff08;Generative Engine Optimization&#xff09; 已经成为品牌和内容负责人必须掌握的核心策略。与传统搜索引擎优化&#xff08;SEO&#xff09;侧重于提升网站在搜索结果页面中的排名不同&#xff0c;GEO优化专注于让内容…

作者头像 李华
网站建设 2026/5/22 0:38:07

Java毕设项目:基于SpringBoot+Vue技术的医院运营管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/23 1:20:21

拒绝宕机与丢包:电鱼智能 RK3568 应对工业 EMC 挑战的硬核加固方案

什么是 电鱼智能 RK3568&#xff1f;电鱼智能 RK3568 是一款专为工业控制与网关应用设计的核心计算平台。它搭载 4 核 A55 处理器&#xff0c;支持 ECC 内存纠错&#xff0c;内置 1TOPS NPU。其关键特性在于针对工业场景优化的引脚排布与电气特性&#xff0c;支持宽温工作&…

作者头像 李华