什么是Pinia?Pinia是Vue的存储库,允许您跨组件/页面共享状态。Pinia最初是为了探索下一个版本的Vuex而推出的产品,它融合了Vuex5核心团队的许多想法。最终,我们意识到Pinia已经实现了我们想在Vuex5中交付的大部分内容,并决定将其作为我们的官方新推荐。Pinia特点足够轻巧,Pinia重约1kb,您甚至会忘记它的存在!RemoveMutation,Actions支持同步和异步(Actions是最好的两个,写起来简单);无需手动注册Store,Store仅在需要时自动注册。如果您从不使用它,您将永远不会“注册”(不用担心);没有模块嵌套,只有Store的概念,并且Stores可以自由使用,更好的代码分割;Vue2和Vue3都支持;支持大型项目迁移时,Pinia和Vuex混合使用(亲密迁移);更完善的打字稿支持;对接Vuedevtools,Vue2、Vue3开发体验更佳;支持插件扩展功能;支持模块热更新,无需加载页面即可修改容器,可保持任何现有状态;支持服务端渲染;其中Vuex被Vuex使用,Pinia目前处于维护模式。它仍然有效,但没有添加新功能。对于新的应用项目,推荐使用Pinia。Pinia已经实现了我们想在Vuex5中提供的大部分功能,所以决定将其作为新的官方推荐(注意:网站的旧版本没有更新)如何使用Pinia1.安装npminstallpiniavue2需要额外安装npmipinia@vue/composition-api--save2.定义Store新建src/stores目录,并在其下创建index.tsPinia目录。它通常被称为商店而不是商店。这是为了强调Pinia使用多个store而不是Vuex在迁移过程中Pinia和Vuex也使用单个store。//src/stores/index.ts//引入Store定义函数import{defineStore}from'pinia'//定义Store实例并导出,useStore可以是任何东西,比如useUser,useCart//第一个参数是唯一不能Repeat的,string类型,作为区分仓库的仓库ID//第二个参数以对象的形式配置仓库的state,getters,actionsexportconstuseStore=defineStore('main',{//state推荐箭头函数,对于TS类型Inferredstate:()=>{return{name:'张三',counter:0}},getters:{},actions:{}})在main.ts中引入并挂载到根实例//src/main.tsimport{createApp}from'vue'importAppfrom'./App.vue'import{createPinia}from'pinia'//创建一个Vue应用程序实例//实例化Pinia//挂载Pinia实例作为插件示例代码如下://main.jsimport//importpiniaimport{createPinia,PiniaVuePlugin}from'pinia'Vue.use(PiniaVuePlugin)constpinia=createPinia()//需要在实例上挂载newVue({router,pinia,render:h=>h(App)}).$mount('#app')如果vue2中报如下错误,需要在vue.config.js中添加如下配置:3.State1,访问State2.修改State1,对单个参数修改statestore.counter++2,对多个参数修改statestore.$patch({counter:store.counter+1,name:'Abalam',}),对all修改statestore.$state={counter:666,name:'Paimon'}orpinia.state.value={}3.ResetState将状态重置为初始值conststore=useStore()store.$reset()4.Vue2import{mapState}from'pinia'import{useCounterStore}from'../stores/counterStore'exportdefault{computed:{...mapState(useCounterStore,['counter'])//or...mapState(useCounterStore,{myOwnName:'counter',double:store=>store.counter*2,magicValue(store){returnstore.someGetter+this.counter+this.double},}),},}四、Gettersgetter中的值具有缓存特性,类似于computed,如果值不发生变化,只会被调用如果多次使用一次1.defineGettersexportconstuseStore=defineStore('main',{state:()=>({counter:0,}),getters:{doubleCount:(state)=>state.counter*2,//自动推导ReturntypedoubleCount(state){returnstate.counter*2},//依赖getter返回参数,需要显式设置返回类型doublePlusOne():number{returnthis.doubleCount+1},},})2,使用Getters Doublecountis{{store.doubleCount}}
