游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

我把vue3项目中的vuex去除了,改用pinia

  Pinia
  pinia目前已经是vue官方正式的状态库。适用于vue2和vue3,本文只描述vue3的写法。
  pinia的优势
  相对于以前的vuex,pinia具有以下优势更简单的写法,代码更清晰简洁,支持compositionapi和optionsapi语法更完善的typescript支持,无需创建自定义复杂的包装类型来支持TypeScript,所有内容都是类型化的,并且API的设计方式尽可能利用TS类型推断非常轻量,只有1kb的大小不需要再注入魔法字符串等进行调用安装yarnaddpiniaornpminstallpinia定义、使用store
  创建一个pinia并传递给vue应用import{createPinia}frompiniaimport{createApp}fromvueimportAppfrom。app。vuecreateApp(App)。use(createPinia())。mount(app)定义store
  store的定义是通过defineStore这个函数,
  它需要一个唯一的名称,该名称可以作为第一个参数传递,也可以用id熟悉传递。import{defineStore}frompiniaexportconstuseMainStoredefineStore(main,{otheroptions。。。})import{defineStore}frompiniaexportconstuseMainStoredefineStore({id:mainotheroptions。。。})
  该id是必要的,主要是用于vuedevtools使用storeimport{useMainStore}fromstoresmainexportdefaultdefineComponent({setup(){conststoreuseMainStore()return{store,}},})
  上述代码中,useMainStore实例化后的,我们就可以在store上访问state、getters、actions等(pinia中没有mutations)。
  该store是一个reactive对象,所以不需要。value,也不能对其进行解构使用,否则失去响应性(类似props)。
  storeToRefs
  如果一定要对其进行解构使用,可以使用storeToRefs,类似vue3中的toRefsimport{storeToRefs}frompiniaexportdefaultdefineComponent({setup(){conststoreuseMainStore()const{user,company}storeToRefs(store)return{user,company}},})state定义state
  在pinia中,定义state是在函数中返回state初始状态import{defineStore}frompiniaconstuseMainStoredefineStore(main,{state:()({teacherName:艾伦,userList:〔{name:小明,age:18},{name:小李,age:15},{name:小白,age:16},〕,}),})exportdefaultuseMainStore访问state
  可以通过store实例直接访问importuseMainStorefromstoremainexportdefaultdefineComponent({setup(){constmainStoreuseMainStore()constteacherNamecomputed(()mainStore。teacherName)constuserListcomputed(()mainStore。userList)return{teacherName,userList,}},})
  也可以直接修改状态importuseMainStorefromstoremainexportdefaultdefineComponent({setup(){constmainStoreuseMainStore()functionchange(){mainStore。teacherName米利mainStore。userList。push({name:小琪,age:19})}return{change}},})
  虽然可以直接修改,但是出于代码结构来说,全局的状态管理还是不要直接在各个组件处随意修改状态,应放于action中统一方法修改(没有mutation了)重置状态
  可以通过调用store上的方法将状态重置为初始状态constmainStoreuseMainStore()mainStore。reset()patch
  修改state还可以通过使用patch方法
  patch可以同时修改多个值,举个例子importuseMainStorefromstoremainexportdefaultdefineComponent({setup(){constmainStoreuseMainStore()mainStore。patch({teacherName:德普,userList:〔{name:小明,age:18},{name:小李,age:15},〕})return{}},})
  但是,这种写法的在修改数组时,例如我只想要把userList的中第一项小明的age改为20,也需要传入整个包括所有成员的数组,这无疑增加了书写成本和风险,于是一般都推荐使用以下的传入一个函数的写法mainStore。patch((state){state。teacherName德普state。userList〔0〕。age20})监听订阅state
  通过store。subscribe()的方法,
  该方法的第一个参数接受一个回调函数,该函数可以在state变化时触发constsubscribemainStore。subscribe((mutation,state){console。log(mutation)console。log(state)})
  如上所示,该回调函数的两个参数
  其中state是mainStore实例,而mutation打印如下
  可以发现,打印结果的mutation对象主要包含三个属性events:是这次state改变的具体数据,包括改变前的值和改变后的值等等数据storeId:是当前store的idtype:type表示这次变化是通过什么产生的,主要有三个分别是direct:通过action变化的patchobject:通过patch传递对象的方式改变的patchfunction:通过patch传递函数的方式改变的
  停止监听
  上面代码中,调用mainStore。subscribe返回的值(即上方示例的subscribe变量)可以停止订阅subscribe()
  store。subscribe()的方法的第二个参数options对象,是各种配置参数,包括
  detached属性,其值是一个布尔值,默认是false,正常情况下,当订阅所在的组件被卸载时,订阅将被停止删除,如果设置detached值为true时,即使所在组件被卸载,订阅依然可以生效。
  其他属性主要还有immediate、deep、flush等等,和vue3watch的对应参数效果一样。getter定义getter
  getter是store中的state计算值,以defineStore中的getters属性定义
  getters属性的值是一个函数,该函数的第一个参数是stateconstuseMainStoredefineStore(main,{state:()({user:{name:小明,age:7,},}),getters:{userInfo:(state){state。user。name}今年{state。user。age}岁了,这里想要正确推断参数state的类型,则定义state时需要使用箭头函数定义},})
  上面代码中,getters的值是箭头函数,当getters的值是普通函数时,可以通过this访问整个store实例(如下)
  但是如果是普通函数,想要通过this获取state的值并希望this的类型能正确推断,同时希望函数的返回值类型正确推断,我们需要声明函数的返回类型。getters:{userDesc:(state){state。user。name}今年{state。user。age}岁了,userBesidesDesc():string{需注明类型return{this。user。age}岁的{this。user。name}可以使用this获取值},returnUserInfo(){returnthis。userDesc也可以使用this获取其他getters},},访问getterimportuseMainStorefromstoremainexportdefaultdefineComponent({setup(){constmainStoreuseMainStore()constuserDesccomputed(()mainStore。userDesc)constuserBesidesDesccomputed(()mainStore。userBesidesDesc)constreturnUserInfocomputed(()mainStore。returnUserInfo)return{userDesc,userBesidesDesc,returnUserInfo,}},})action定义action
  action是store中的方法,支持同步或异步。
  action定义的函数可以是普通函数从而可以通过this访问整个store实例,同时该函数可以传入任意参数并返回任何数据constuseMainStoredefineStore(main,{state:()({count:0,}),actions:{add(){this。count},addCountNum(num:number){this。countnum},},})调用actionsetup(){constmainStoreuseMainStore()functionmainAction(){mainStore。addCount()}functionaddCountTwo(){mainStore。addCountNum(2)}return{mainAction,addCountTwo}},监听订阅action
  通过store。onAction(),可以监听action的动作及结果等
  该函数可以接收一个回调函数作为参数,回调函数的参数中有五个属性,具体如下constunsubscribemainStore。onAction(({name,action函数的名称store,store实例,这里是mainStoreargs,action函数参数数组after,钩子函数,在action函数执行完成返回或者resolves后执行onError,钩子函数,在action函数报错或者rejects后执行}){})
  举个例子,
  首先,定义一个storeimport{defineStore}frompiniaconstuseMainStoredefineStore(main,{state:()({user:{name:小明,age:7,},}),actions:{subscribeAction(name:string,age:number,manualError?:boolean){returnnewPromise((resolve,reject){console。log(subscribeAction函数执行)if(manualError){reject(手动报错)}else{this。user。namenamethis。user。ageageresolve({this。user。name}今年{this。user。age}岁了)}})},},})exportdefaultuseMainStore
  然后在setup中使用importuseMainStorefromstoremainimport{ref,defineComponent,computed}fromvueexportdefaultdefineComponent({setup(){constmainStoreuseMainStore()functionsubscribeNormal(){mainStore。subscribeAction(小李,18,false)}functionsubscribeError(){mainStore。subscribeAction(小白,17,true)}constunsubscribemainStore。onAction(({name,action函数的名称store,store实例,这里是mainStoreargs,action函数参数数组after,钩子函数,在action函数执行完成返回或者resolves后执行onError,钩子函数,在action函数报错或者rejects后执行}){console。log(action的函数名,name)console。log(参数数组,args)console。log(store实例,store)after((result){console。log(onActionafter函数,result)})onError(error{console。log(错误捕获,error)})})return{subscribeNormal,subscribeError,}},})
  如上,在setup中,调用了subscribeNormal函数后,页面打印如下
  调用了subscribeError函数后,页面打印如下
  同样,可以通过调用mainStore。onAction返回的值来手动停止订阅,在上面代码的例子中,即是unsubscribe()手动停止订阅
  store。onAction默认在所在组件卸载时会被自动删除,可以通过传递第二个参数true,来将action订阅和所在组件分开(即组件卸载时,订阅依然有效)mainStore。onAction(callback,true)store使用位置
  在组件中使用时,useStore()在大多数情况下都可以在调用后开箱即用。
  在其他地方使用时,需确保在pinia激活使用后(app。use(createPinia()))才能使用useStore()
  例如在路由守卫中import{createRouter}fromvuerouterimportuseMainStorefromstoremainconstroutercreateRouter({。。。})报错constmainStoreuseMainStore()router。beforeEach((to){正常使用constmainStoreuseMainStore()})
  在store中也可以访问其他storeimport{defineStore}frompiniaimport{useUserStore}from。userexportconstuseMainStoredefineStore(main,{getters:{otherGetter(state){constuserStoreuseUserStore()returnuserStore。datastate。data},},actions:{asyncfetchUserInfo(){constuserStoreuseUserStore()if(userStore。userInfo){。。。}},},})pinia插件
  piniastore支持扩展,通过pinia插件我们可以实现以下给store添加新属性给store添加新选项给store添加新方法包装已存在的方法修改甚至删除actions。。。
  例如可以写一个简单的插件来给所有store添加一个静态属性import{createPinia}frompiniaconstpiniacreatePinia()传递一个返回函数pinia。use(()({env:dev}))app。use(pinia)
  然后,在所有其他的store都可以访问到上面添加的env属性setup(){constmainStoreuseMainStore()console。log(mainStore。env)dev}插件函数
  从上方代码可以发现,pinia插件是一个函数,这个函数有一个可选参数import{PiniaPluginContext}frompiniafunctionmyPiniaPlugin(context:PiniaPluginContext){console。log(context)}
  context打印出来主要有app:当前应用Vue。createApp()创建的appoptions:defineStore配置的数据pinia:当前通过createPinia()创建的pinia实例store:当前store实例
  通过context我们可以在store上设置属性pinia。use(({store}){store。envdev})
  这样,在所有其他的store都可以访问到上面添加的env属性
  pinia的store是通过reactive包装的,可以自动解包它包含的任何ref对象pinia。use(({store}){store。envref(dev)})
  通过上面插件,访问store的env时不需要。value,就可以直接访问setup(){constmainStoreuseMainStore()console。log(mainStore。env)不需要加。value}添加外部属性
  当需要添加来自其他库或不需要响应式的数据时,应该用markRaw()包装传递的对象,例如
  markRaw来自vue3,可以标记一个对象,使其永远不会转换为proxy。返回对象本身。import{markRaw}fromvueimport{router}from。routerimport{axios}fromaxiospinia。use(({store}){store。routermarkRaw(router)store。axiosmarkRaw(axios)})在插件内部使用subscribe、onActionpinia。use(({store}){store。subscribe((){reacttostorechanges})store。onAction((){reacttostoreactions})})新属性的typescript支持
  当通过插件添加新属性时,可以扩展PiniaCustomProperties接口
  可以用设置get,set或者简单声明值的类型,以此来安全地写入和读取新加的属性importpiniadeclaremodulepinia{exportinterfacePiniaCustomProperties{setenv(value:stringRefstring)getenv():string或者env:string}}

OPPOAce2官宣更多硬件参数90Hz刷新率,立体声双扬声IT之家4月10日消息今日上午OPPO官方宣布新款OPPOAce2更多硬件参数:将支持90Hz刷新率、180Hz触控采样率;支持4D恒冷散热、4D游戏振感2。0;搭载立体声双扬……外观公布!OPPOAce2开启预约骁龙86565W超级闪充感谢IT之家网友Ryzen7的线索投递!IT之家4月9日消息OPPOAce2现已开启预约,搭载高通骁龙865处理器,支持65W超级闪充,将于4月13日正式发布。工信……OPPOAce2正式亮相高通骁龙865,185gIT之家4月8日消息OPPO官博刚刚发布全新OPPOAce2海报,新品外观正式亮相。Ace2搭载骁龙865处理器,并采用轻薄机身设计,整机重量仅为185g。此外OPPO宣布5G……ColorOS7正式版开放升级IT之家4月8日消息据ColorOS官方微博,ColorOS7正式版现已开放升级,首批适配Reno、RenoAce、Reno10倍变焦版等机型,详情见下图:升级方式……NBA历史上圣诞大战的精彩时刻202122赛季将是NBA在圣诞节的第74届比赛。联盟从1947年开始进行圣诞比赛,并将在这个节日举行五场比赛。本赛季的圣诞比赛有前MVP得主(吉安尼斯安特托昆博、詹姆斯……赵明麒麟985定位麒麟820与990之间,主推3000元左右IT之家4月16日消息昨日下午,荣耀正式发布了旗舰手机荣耀30系列。其中,荣耀30首发了麒麟9855G旗舰芯片。麒麟985处理器采用134八核CPU架构,搭配全新的MailG7……重庆谈判,毛泽东不满蒋介石安排的住所,一国军高官说住我家吧1945年8月15日,八年抗战胜利,举国欢腾,然而,蒋介石却似乎无心与民同乐。作为政治家的他,他考虑的是如何独享胜利果实。但他更清楚,如果自己争夺全部抗战成果,共产党方面……赵明荣耀30系列囊括三款麒麟5G芯片,在5G手机市场全面布局IT之家4月16日消息荣耀30系列手机于昨日正式发布。新品发布结束后,华为荣耀业务部总裁赵明接受了IT之家等媒体的线上采访,针对大家关注的问题进行了深度解析。赵明表示,荣……荣耀Play4T开启预约48MP主摄4000mAh电池,11IT之家4月16日消息荣耀Play4T系列于4月9日正式发布。除已经开售的荣耀Play4TPro外,荣耀Play4T现已开启预约。荣耀Play4T采用6。39英寸魅眼屏,……微信Android版7。0。20内测版支持平板手机同时登录感谢IT之家网友戒赌吧老哥的线索投递!IT之家10月21日消息今日,微信Android版迎来7。0。20内测版更新,新版支持在设置中开启青少年模式,还可以在会话的表情面板……消息称腾讯QQ接入华为HMS,无需挂后台也能收到消息感谢IT之家网友spaceboat的线索投递!IT之家10月21日消息根据网友皮蛋棒棒糖发现,最新的腾讯QQ8。4。10安卓版本已经接入了华为HMS移动服务,该网友称,后……阿根廷这点球有问题吗?慢动作逐帧显示有瑕疵让人难以信服君子报仇4年未晚!4年前的世界杯小组赛中03输球,4年后的世界杯淘汰赛中,阿根廷人如数奉还,把30的比分还给了克罗地亚人。3球大胜对手,阿根廷队切瓜砍菜般赢得异常轻松,仿佛这两……
巅峰时期的林书豪究竟什么水平?正面击败科比,登上时代周刊2012年2月10日,湖人背靠背挑战尼克斯。赛前记者询问科比怎么看待最近在美国大火的尼克斯球员林书豪,结果科比回复:林书豪是谁?我不认识他。两个小时以后,小人物林书……深圳塘朗山有40多只野猴遇见时切勿靠近或投喂央广网深圳10月20日消息(记者彭艺娑)近日,到深圳塘朗山公园看猴子成为不少市民游园的项目。对此,塘朗山公园园方表示,希望市民与动物和谐共处,遇见野猴时切莫靠近或投喂食物。……荣耀入门机型X7a的高清渲染图和主要规格信息曝光IT之家12月24日消息,国外爆料人士Evleaks分享了荣耀入门机型X7a的高清渲染图和主要规格信息。该机采用水滴式居中打孔设计,正面下巴边框相比较前代有所收窄,机身背面相机……当我从华为换到小米之后,我后悔了吗?前段时间,我的华为mate30pro摔破了屏幕,维修需要一千六百多。想着华为也用两年了,干脆换一台新的手机。由于华为的拍照我实在喜欢不上,就想换台拍照牛X一点的手机,刚好……该不该因为作业而体罚6岁孩子孩子还有3个多月就6岁,正好赶在6岁的时候就上一年级,一直希望孩子能有个快乐的童年,所以平时经常带孩子出去跟朋友带娃聚聚,可能是平时玩的多玩野了吧,平时学习起来效率很低,一到写……豪取7连胜!东部冠军势不可挡,双探花轰53分,亚历山大空砍3北京时间11月15日上午8:30,NBA常规赛的较量正在激烈进行之中,波士顿凯尔特人坐镇主场迎击俄克拉荷马城雷霆队。本场比赛之前,凯尔特人队的战绩为10胜3负,排名东部第2,仅……大朋E4游戏级PCVR头显发布3499元起,采用6DoF视觉IT之家12月22日消息,大朋VR全新的6DoF游戏级PCVR产品大朋E4近期发布,其中,标准版售价3499元,企业版售价4699元。大朋VRE4采用1680万色RGB全……国羽世界冠军夫妇秀合体!李雪芮产后亮相,眼神温柔散发母性光辉近期,伦敦奥运会羽毛球女单冠军李雪芮再次出现在公众的视野当中,她在社交媒体上公布了一则喜讯,自己即将成为重庆大学体育学院一名教师,而更让网友和重大师生兴奋的是李雪芮和丈夫乔斌夫……市占率再提升!53家券商进入基金代销百强,华泰蝉联一哥,平安点蓝字关注,不迷路来源:券商中国11月10日,中基协披露了2022年三季度公募基金保有规模百强名单。今年三季度,在基金保有规模整体缩水的背景下,券商渠道的市场……费舍尔巅峰期姚明,搭档科比艾弗森那样的后卫,保底拿三冠老鱼费舍尔认为,尽管姚明称不上超巨,不过巅峰期搭档科比、艾弗森那样的超级后卫,绝对是当时冠军最有力的竞争者,姚明打法灵活多样,篮下还能够抗衡奥尼尔,保底拿三冠是没问题的。……清华黑科技登Science子刊封面圆管上贴个膜,秒变3D复杂编辑:David【新智元导读】要把复杂3D零件装在曲面上,怎么装最方便?清华团队新研究登上Science子刊在工业实践中,零件和电子设备的装配,是复杂机械设备正常运转的关……逆流而上非洲之王传音这三年随着中国企业的发展,出海成为了一个热门话题。作为国内手机品牌成功出海的典型,传音控股(以下简称传音)主攻海外市场,在非洲、巴基斯坦、孟加拉国的智能机市场的占有率均排名第一……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网