news 2026/1/19 21:29:46

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/1/19 11:11:45

有关LangChain

从API调用到本地部署&#xff1a;LangChain模型接入全攻略 在当今AI技术飞速发展的时代&#xff0c;大型语言模型(LLM)已成为开发者工具箱中的重要组成部分。然而&#xff0c;直接将原生LLM集成到应用程序中会遇到诸多挑战。本文将带你深入了解如何使用LangChain框架接入各种模…

作者头像 李华
网站建设 2026/1/17 4:42:34

【课程设计/毕业设计】基于springboot的公司财务预算管理系统企业财务综合性管理软件【附源码、数据库、万字文档】

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

作者头像 李华
网站建设 2026/1/19 10:01:19

超越CRUD:在AI时代,用TDD和整洁代码构筑不可替代的护城河

引言&#xff1a;AI编程时代的机遇与迷思去年&#xff0c;一位刚毕业的实习生仅凭一句“帮我生成一个用户管理的RESTful API”&#xff0c;就在几秒钟内获得了GitHub Copilot生成的、结构完整的CRUD代码。而一位拥有十年经验的架构师&#xff0c;则在CodeReview中敏锐地指出了这…

作者头像 李华
网站建设 2026/1/17 19:00:38

推出新型面向 AI 加速器的高性能编程框架——PyPTO

1.简介PyPTO&#xff08;发音&#xff1a;pai p-t-o&#xff09;是 CANN 推出的一款面向 AI 加速器的高性能编程框架&#xff0c;旨在简化算子开发流程&#xff0c;同时保持高性能计算能力。该框架采用创新的 PTO&#xff08;Parallel Tensor/Tile Operation&#xff09;编程范…

作者头像 李华
网站建设 2026/1/17 19:17:19

滑坡入水模拟:一场多物理耦合的“水上芭蕾”

基于ansys/lsdyna的滑坡入水模拟dem-sph-fem耦合最近在研究滑坡入水的模拟问题&#xff0c;感觉这事儿真是个技术活儿。滑坡入水是一个典型的多物理过程&#xff0c;涉及到固体、流体以及两者之间的相互作用。为了更准确地模拟这种复杂的现象&#xff0c;我决定尝试一下DEM&…

作者头像 李华
网站建设 2026/1/18 16:30:08

用ABAQUS探索建筑结构抗震的奥秘

ABAQUS抗震&#xff0c;可建模&#xff0c;可调模型&#xff0c;钢框架及混凝土框架抗震时程分析&#xff0c;模态分析&#xff0c;连接器模拟线性非线性滞回曲线&#xff0c;接触设置。在建筑结构的抗震设计领域&#xff0c;ABAQUS是一款强大的分析工具&#xff0c;它能够帮助…

作者头像 李华