最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年04月27日 10:15:08   作者:本杰_CHEN  
這篇文章主要介紹了Vue3狀態(tài)管理的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下

背景

隨著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)在計(jì)劃中,并且能提供完整的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的思想,是否能實(shí)現(xiàn)一個簡易版的狀態(tài)管理?

抽離共享狀態(tài)

// src/context/calculator.ts

import { 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實(shí)現(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);
  	//未共享就注入的錯誤校驗(yàn)
    if (!calculatorContext) {
        throw new Error('Inject must be used affer Provide');
    }
  	//返回注入的貢獻(xiàn)狀態(tài)
    return calculatorContext;
};

提供數(shù)據(jù)

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

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

// src/main.ts

import { createApp, h } from 'vue';
import App from '@/App.vue';
import { calculatorProvide } from '@/context/calculator';

// 創(chuàng)建vue實(shí)例
const app = createApp({
    setup() {
        calculatorProvide();
        return () => h(App);
    }
});

// 掛載實(shí)例
app.mount('#app');

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

// src/views/parent.vue

import { 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.vue

import { defineComponent } from "vue";
import { calculatorInject } from '@/context/calculator';

export default defineComponent({
  name: "child",
  setup() {
    //注入數(shù)據(jù)
    const { count, increase, updateCount } = calculatorInject();
  }
});

小結(jié)

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

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

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

reactive

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

抽離共享狀態(tài)

// src/context/calculator.ts

type 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.vue

import { defineComponent } from "vue";
import { calculatorStore } from '@/context/calculator';

export default defineComponent({
  name: "any",
  setup() {
    console.log(calculatorStore.count);
  }
});

小結(jié)

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

結(jié)語

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

以上就是Vue3狀態(tài)管理的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Vue3狀態(tài)管理的使用的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue狀態(tài)管理工具Pinia的安裝與使用教程

    Vue狀態(tài)管理工具Pinia的安裝與使用教程

    這篇文章主要介紹了Vue狀態(tài)管理工具Pinia的安裝與使用,一步一步學(xué)習(xí)如何將pinia運(yùn)用到項(xiàng)目實(shí)戰(zhàn)中去,文中有詳細(xì)的安裝教程和使用方法,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • vue通過element樹形控件實(shí)現(xiàn)樹形表格

    vue通過element樹形控件實(shí)現(xiàn)樹形表格

    這篇文章主要為大家介紹了vue?element樹形控件實(shí)現(xiàn)樹形表格,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • vue2響應(yīng)式原理之Object.defineProperty()方法的使用

    vue2響應(yīng)式原理之Object.defineProperty()方法的使用

    這篇文章主要介紹了vue2響應(yīng)式原理之Object.defineProperty()方法的使用,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Vue動態(tài)添加class可能帶來的問題解讀(被覆蓋)

    Vue動態(tài)添加class可能帶來的問題解讀(被覆蓋)

    文章討論了在使用Vue.js時(shí),通過動態(tài)class修改元素樣式時(shí)可能會遇到的問題,當(dāng)通過JavaScript動態(tài)添加類時(shí),Vue的動態(tài)class會覆蓋掉通過JavaScript添加的類,導(dǎo)致樣式丟失,這個問題在實(shí)際開發(fā)中可能會遇到,尤其是在使用第三方框架
    2024-12-12
  • 基于Vue+echarts編寫一個折線圖

    基于Vue+echarts編寫一個折線圖

    這篇文章主要為大家詳細(xì)介紹了如何利用Vue和Echarts實(shí)現(xiàn)繪制折線圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-05-05
  • vue使用require.context實(shí)現(xiàn)動態(tài)注冊路由

    vue使用require.context實(shí)現(xiàn)動態(tài)注冊路由

    這篇文章主要介紹了vue使用require.context實(shí)現(xiàn)動態(tài)注冊路由的方法,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2020-12-12
  • vue動態(tài)子組件的兩種實(shí)現(xiàn)方式

    vue動態(tài)子組件的兩種實(shí)現(xiàn)方式

    這篇文章主要介紹了vue動態(tài)子組件的兩種實(shí)現(xiàn)方式,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • vue+axios新手實(shí)踐實(shí)現(xiàn)登陸的示例代碼

    vue+axios新手實(shí)踐實(shí)現(xiàn)登陸的示例代碼

    這篇文章主要介紹了vue+axios新手實(shí)踐實(shí)現(xiàn)登陸的示例代碼,實(shí)現(xiàn)了登陸攔截,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 簡單談一談Vue中render函數(shù)

    簡單談一談Vue中render函數(shù)

    vue中的render函數(shù),它返回的是一個虛擬節(jié)點(diǎn)vnode,也就是我們要渲染的節(jié)點(diǎn),下面這篇文章主要給大家介紹了關(guān)于Vue中render函數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • vue如何使用模擬的json數(shù)據(jù)查看效果

    vue如何使用模擬的json數(shù)據(jù)查看效果

    這篇文章主要介紹了vue如何使用模擬的json數(shù)據(jù)查看效果,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論

玉树县| 长兴县| 峡江县| 晋中市| 汶川县| 辰溪县| 菏泽市| 疏勒县| 新乐市| 永和县| 皋兰县| 三台县| 马龙县| 长葛市| 舟山市| 天镇县| 乐都县| 竹溪县| 定结县| 涟水县| 会宁县| 吉林市| 广南县| 南郑县| 柯坪县| 亳州市| 泸溪县| 永平县| 永平县| 那坡县| 白河县| 罗甸县| 长阳| 井冈山市| 都江堰市| 醴陵市| 津南区| 乐亭县| 东乡| 瓮安县| 泰和县|