电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Vue3狀態(tài)管理的使用詳解

瀏覽:13日期:2022-09-30 13:42:44
背景

隨著Vue3的逐步應(yīng)用,對狀態(tài)管理的需求越來越多。起初是基于Vuex4進(jìn)行狀態(tài)管理的,但是Vuex4也暴露了一些問題。從個人角度來說,Vuex4類似于過渡期產(chǎn)品,對TypeScript的支持性并不完整。如果使用TypeScript編寫組件,需要遵循一定步驟后,才可以正確進(jìn)行類型推斷,并且對modules的使用上也并不友好。Vuex核心貢獻(xiàn)者Kia King也表示Vuex5已經(jīng)在計劃中,并且能提供完整的TypeScript支持,那么在Vuex5面世之前,或者直接'舍棄'Vuex的話有沒有其他狀態(tài)管理的方案?

Provide / Inject

provide和inject并不是Vue3的新特性,在Vue2中就已經(jīng)存在了。文檔中提到provide和inject綁定并不是可響應(yīng)的。然而,如果你傳入了一個可監(jiān)聽的對象,那么其對象的property還是可響應(yīng)的。

Vue3在Computed與watch的基礎(chǔ)上新增了響應(yīng)性API ref和reactive,可以更加方便provide和inject的應(yīng)用,再結(jié)合Composition API的思想,是否能實現(xiàn)一個簡易版的狀態(tài)管理?

Vue3狀態(tài)管理的使用詳解

抽離共享狀態(tài)

// src/context/calculator.tsimport { ref, inject, provide, readonly } from ’vue’;type Calculator = { count: number; increase: () => void; updateCount: (num: number) => void;};//provide的key,唯一令牌const CalculatorSymbol = Symbol();//提供者export const calculatorProvide = () => { //數(shù)目 const count = ref<number>(1); //遞增方法 const increase = () => {count.value++; }; //更新方法 const updateCount = (num: number) => {count.value = num; }; //提供的共享狀態(tài)對象 const depends = {count: readonly(count), //狀態(tài)只讀,通過方法進(jìn)行修改increase,updateCount }; //使用provide api實現(xiàn)狀態(tài)對象提供 provide(CalculatorSymbol, depends); //返回狀態(tài)對象,讓同級可調(diào)用 return depends;};//注入方法export const calculatorInject = () => { //使用inject api注入狀態(tài) const calculatorContext = inject<Calculator>(CalculatorSymbol); //未共享就注入的錯誤校驗 if (!calculatorContext) {throw new Error(’Inject must be used affer Provide’); } //返回注入的貢獻(xiàn)狀態(tài) return calculatorContext;};提供數(shù)據(jù)

相比起Vuex的全局共享,利用Provide / Inject可以實現(xiàn)全局或者局部共享,

全局共享,可以在main.ts中注入全局狀態(tài):

// src/main.tsimport { createApp, h } from ’vue’;import App from ’@/App.vue’;import { calculatorProvide } from ’@/context/calculator’;// 創(chuàng)建vue實例const app = createApp({ setup() {calculatorProvide();return () => h(App); }});// 掛載實例app.mount(’#app’);

如果只想局部共享,可以在父組件中注入狀態(tài)

// src/views/parent.vueimport { defineComponent } from 'vue';import { calculatorProvide } from ’@/context/calculator’;export default defineComponent({ name: 'parent', setup() { //共享數(shù)據(jù) calculatorProvide(); }});注入數(shù)據(jù)

子組件可以通過狀態(tài)注入,使用或修改狀態(tài)

// src/views/child.vueimport { defineComponent } from 'vue';import { calculatorInject } from ’@/context/calculator’;export default defineComponent({ name: 'child', setup() { //注入數(shù)據(jù) const { count, increase, updateCount } = calculatorInject(); }});小結(jié)

實際上,你可以將依賴注入(Provide / Inject)看作是'long range props',除了:

父組件不需要知道哪些子組件使用它provide的property 子組件不需要知道inject的property來自哪里

Vue3使依賴注入的使用更加靈活便捷,以此仿造了小型的狀態(tài)管理,個人測試上,對TypeScript的支持性比較完整

reactive

那么不使用Provide / Inject,還有別的方法可以實現(xiàn)狀態(tài)管理嗎?直接上代碼。

抽離共享狀態(tài)

// src/context/calculator.tstype Calculator = { count: number; increase: () => void; updateCount: (num: number) => void;};//共享狀態(tài)const calculatorStore = reactive<Calculator>({ count: 1, increase: () => {calculatorStore.count++; }, updateCount: (num: number) => {calculatorStore.count = num; }});export { calculatorStore };使用共享狀態(tài)

使用狀態(tài)的方法很簡單,只需要import狀態(tài)即可,需要使用狀態(tài)的組件,都需要導(dǎo)入

// src/views/any.vueimport { defineComponent } from 'vue';import { calculatorStore } from ’@/context/calculator’;export default defineComponent({ name: 'any', setup() { console.log(calculatorStore.count); }});小結(jié)

其實這個方案利用的是reactive的響應(yīng)性及import同一實例原理,相比起依賴注入來的更簡單粗暴,也能正確支持TypeScript校驗。但是依賴注入可以在不同根節(jié)點共享不同的數(shù)據(jù),而這個reactive方案永遠(yuǎn)共享的是一個實例,在某些業(yè)務(wù)場景下并不適用。

結(jié)語

首先,Vuex仍舊是更成熟全面的方案,只是針對一些簡單的狀態(tài)管理,可以嘗試換個思路解決;當(dāng)然以上的方案可能還有很多考慮不全地方,歡迎各位大神指點指點~

以上就是Vue3狀態(tài)管理的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Vue3狀態(tài)管理的使用的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 立式硫化罐-劳保用品硫化罐-厂家直销-山东鑫泰鑫硫化罐厂家 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 芜湖厨房设备_芜湖商用厨具_芜湖厨具设备-芜湖鑫环厨具有限公司 控显科技 - 工控一体机、工业显示器、工业平板电脑源头厂家 | 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | 存包柜厂家_电子存包柜_超市存包柜_超市电子存包柜_自动存包柜-洛阳中星 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 小型高低温循环试验箱-可程式高低温湿热交变试验箱-东莞市拓德环境测试设备有限公司 | 【官网】博莱特空压机,永磁变频空压机,螺杆空压机-欧能优 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 涡轮流量计_LWGY智能气体液体电池供电计量表-金湖凯铭仪表有限公司 | 散热器-电子散热器-型材散热器-电源散热片-镇江新区宏图电子散热片厂家 | 两头忙,井下装载机,伸缩臂装载机,30装载机/铲车,50装载机/铲车厂家_价格-莱州巨浪机械有限公司 | 温室大棚建设|水肥一体化|物联网系统| 书信之家_书信标准模板范文大全 最新范文网_实用的精品范文美文网 | ISO9001认证咨询_iso9001企业认证代理机构_14001|18001|16949|50430认证-艾世欧认证网 | 福州时代广告制作装饰有限公司-福州广告公司广告牌制作,福州展厅文化墙广告设计, | 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 厂厂乐-汇聚海量采购信息的B2B微营销平台-厂厂乐官网 | 水性绝缘漆_凡立水_绝缘漆树脂_环保绝缘漆-深圳维特利环保材料有限公司 | 亳州网络公司 - 亳州网站制作 - 亳州网站建设 - 亳州易天科技 | 【同风运车官网】一站式汽车托运服务平台,验车满意再付款 | 非小号行情 - 专业的区块链、数字藏品行情APP、金色财经官网 | 实验室装修_实验室设计_实验室规划设计- 上海广建净化工程公司 | Trimos测长机_测高仪_TESA_mahr,WYLER水平仪,PWB对刀仪-德瑞华测量技术(苏州)有限公司 | 亿诺千企网-企业核心产品贸易| 沈阳液压泵_沈阳液压阀_沈阳液压站-沈阳海德太科液压设备有限公司 | 郑州水质检测中心_井水检测_河南废气检测_河南中环嘉创检测 | 无尘烘箱_洁净烤箱_真空无氧烤箱_半导体烤箱_电子防潮柜-深圳市怡和兴机电 | 精密模具-双色注塑模具加工-深圳铭洋宇通| 骨灰存放架|骨灰盒寄存架|骨灰架厂家|智慧殡葬|公墓陵园管理系统|网上祭奠|告别厅智能化-厦门慈愿科技 | 东莞ERP软件_广州云ERP_中山ERP_台湾工厂erp系统-广东顺景软件科技有限公司 | 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 | 冷水机,风冷冷水机,水冷冷水机,螺杆冷水机专业制造商-上海祝松机械有限公司 | 胜为光纤光缆_光纤跳线_单模尾纤_光纤收发器_ODF光纤配线架厂家直销_北京睿创胜为科技有限公司 - 北京睿创胜为科技有限公司 | 深圳侦探联系方式_深圳小三调查取证公司_深圳小三分离机构 | 济宁工业提升门|济宁电动防火门|济宁快速堆积门-济宁市统一电动门有限公司 | 航空铝型材,7系铝型材挤压,硬质阳*氧化-余润铝制品 | 混合气体腐蚀试验箱_盐雾/硫化氢/气体腐蚀试验箱厂家-北京中科博达 | 直线模组_滚珠丝杆滑台_模组滑台厂家_万里疆科技 | SPC工作站-连杆综合检具-表盘气动量仪-内孔缺陷检测仪-杭州朗多检测仪器有限公司 |