news 2026/6/15 12:10:56

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/6/15 14:03:08

50、CNN的概述介绍

CNN的概述 卷积层&#xff1a; 卷积核&#xff08;小的矩阵&#xff09;进行点乘求和池化层&#xff1a; 提取特征&#xff08;最大值提取、平均提取&#xff09;全连接&#xff1a;判断分类 卷积之后为什么需要池化呢? 因为信息太多了&#xff0c;计算量太大&#xff0c;我…

作者头像 李华
网站建设 2026/6/15 13:09:41

51、卷积层(计算规则)

卷积层&#xff08;计算规则&#xff09;线性的矩阵点乘求和&#xff08;先点积&#xff08;同位置相乘&#xff09;&#xff0c;再求和&#xff09;卷积核叫做Filter。简称F经过卷积核之后的输出图像叫做特征图问题点边缘被计算的很少&#xff0c;就只有最开始的那一次被计算到…

作者头像 李华
网站建设 2026/6/15 13:10:21

基于改进鹈鹕算法(IPOA)优化BP神经网络的智能数据回归预测模型——IPOA-BP模型及其评...

基于改进鹈鹕算法(IPOA)优化BP神经网络的数据回归预测(IPOA-BP) 鹈鹕算法是2022年提出的新算法 目前应用较少 改进的鹈鹕算法在知网检索结果更是少之又少 具体改进点为&#xff1a;种群初始化、引入反向差分进化和加入萤火虫扰动 算法注释清楚 每一行都有说明 基于MATLAB环境 …

作者头像 李华
网站建设 2026/6/15 14:03:29

MTPA数值求解的两种方法

MTPA数值求解两种方法在电机控制领域&#xff0c;MTPA&#xff08;Maximum Torque Per Ampere&#xff09;是个让人又爱又恨的技术指标。这玩意儿说白了就是在给定电流条件下榨出最大转矩&#xff0c;听着像不像在超市抢特价鸡蛋——如何在有限的预算&#xff08;电流&#xff…

作者头像 李华
网站建设 2026/6/15 13:18:15

【课程设计/毕业设计】基于Java的高效仓库管理系统设计与实现基于java零售与仓储管理系统的设计与实现【附源码、数据库、万字文档】

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

作者头像 李华