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

vue3如何使用provide實(shí)現(xiàn)狀態(tài)管理詳解

 更新時(shí)間:2021年10月17日 11:40:06   作者:bluesky108  
Vue3中有一對(duì)新增的api,provide和inject,熟悉Vue2的朋友應(yīng)該明,這篇文章主要給大家介紹了關(guān)于vue3如何使用provide實(shí)現(xiàn)狀態(tài)管理的相關(guān)資料,需要的朋友可以參考下

前言

在 Vue 生態(tài)中, Vuex 這個(gè)官方的狀態(tài)管理庫(kù)在 Vue 應(yīng)用開(kāi)發(fā)中,為我們帶來(lái)了非常便捷的功能。但是 Vuex 20K+ 的大小,也帶來(lái)了一些成本,對(duì)于項(xiàng)目規(guī)模較小的應(yīng)用來(lái)說(shuō), 引入 Vuex 只是為了存儲(chǔ)用戶信息之類的一小撮數(shù)據(jù),有點(diǎn)不值得。

Vue2.2.x 在后期就提供了 provide/inject API 來(lái)幫我們實(shí)現(xiàn)跨層級(jí)組件之間的通信。

Vue3.x 把 provide 也放到了應(yīng)用 API 上,這就更方便讓我們?cè)诖嘶A(chǔ)上,實(shí)現(xiàn)一個(gè)基礎(chǔ)的狀態(tài)管理。

如何通過(guò) provide/inject 實(shí)現(xiàn) Vuex的功能

首先我們想一下大概的邏輯,把它做成一個(gè)插件,通過(guò) use 方法注冊(cè)到應(yīng)用實(shí)例中。

在 install 方法中,通過(guò) app.provide 方法,把數(shù)據(jù)掛載到根組件上,該數(shù)據(jù)應(yīng)該是一個(gè)響應(yīng)式數(shù)據(jù),并且為了數(shù)據(jù)安全,應(yīng)該對(duì)數(shù)據(jù)的變更進(jìn)行限制,遵循單向數(shù)據(jù)流的設(shè)計(jì),不能讓用戶直接的進(jìn)行修改,所以在暴露數(shù)據(jù)時(shí),應(yīng)該對(duì)數(shù)據(jù)進(jìn)行 readonly(只讀) 處理。

實(shí)現(xiàn)類似 Vuex 的 useStore 功能,讓用戶通過(guò)此方法訪問(wèn)數(shù)據(jù)。

實(shí)現(xiàn)類似 Vuex 的 mapState、mapMutations 和 mapActions方法,簡(jiǎn)化操作。

用法直接跟 Vuex 一樣。

在應(yīng)用中注冊(cè)此插件

// main.ts
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

import store from './store'

const app = createApp(App)

app.use(router).use(store).mount('#app')

插件的入口文件

在入口文件中,直接導(dǎo)出所有方法。

// sky-vuex/index.ts
export * from './main/index'

創(chuàng)建 store ,把對(duì)應(yīng)的數(shù)據(jù)掛載到根組件上

store 本身是一個(gè)對(duì)象,包含 state 屬性和 commit、dispatch 等方法。 store 最主要的一些功能就是讓所有組件,都能拿到 store 對(duì)象,來(lái)獲取 state 中的數(shù)據(jù),以及調(diào)用相關(guān)方法來(lái)修改 state。

// sky-vuex/main/index.ts
import {inject, reactive, readonly} from 'vue'

const mainStoreSky = Symbol('main store key')

interface storeOptions {
  state?: any
  actions?: any
  mutations?: any
}

export const createStore = (options: storeOptions = {}) => { // 創(chuàng)建 store 對(duì)象
  const initOptions = {
    state: {},
    actions: {},
    mutations: {},
  }

  const mergeOptions: storeOptions = Object.assign(initOptions, options)

  const state = reactive(mergeOptions.state)

  const store = {
    state: readonly(state),
    dispatch(eventName: string, ...args: any[]) {
      mergeOptions.actions[eventName](store, ...args)
    },
    commit(eventName: string, ...args: any[]) {
      ...
    },
  }

  return {
    install(app: any) {
      app.provide(mainStoreSky, store)
    },
  }
}

export const useStore = (): any => { // 其他組件通過(guò)此方法,獲取 store 對(duì)象
  return inject(mainStoreSky)
}

實(shí)現(xiàn) mapState、mapMutations 和 mapActions方法

export const mapState = () => {
  const store = useStore()
  return store.state
}

export const mapActions = (eventName: string) => {
  const store = useStore()
  return (...args: any[]) => store.dispatch(eventName, ...args)
}

export const mapMutations = (eventName: string) => {
  const store = useStore()
  return (...args: any[]) => store.commit(eventName, ...args)
}

組件中使用

// store/index.ts
import { createStore } from '../sky-vuex/index'

export default createStore({
  state: {
    age: 18
  },
  mutations: {
    setAge(state: any, data: number) {
      state.age = data
    }
  },
})

// Home.vue
<template>
  <div class="home">
    <button @click="handleAge(23)">修改數(shù)據(jù)</button>
    <h1>{{ state.age }}</h1>
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue'
import { useStore, mapActions, mapMutations } from '@/sky-vuex/index'

export default defineComponent({
  name: 'Home',
  setup() {
    const store = useStore()

    const handleAge = mapMutations('setAge')
    // const handleAge = mapActions('setAge')

    // const handleAge = () => {
    //   store.dispatch('setAge', 5)
    // }

    return {
      state: store.state,
      handleAge,
    }
  },
})
</script>

總結(jié)

至此已經(jīng)實(shí)現(xiàn)了基礎(chǔ)的 Vuex 功能,可以自己動(dòng)手實(shí)踐一下,進(jìn)行優(yōu)化,有問(wèn)題歡迎大家提出

到此這篇關(guān)于vue3如何使用provide實(shí)現(xiàn)狀態(tài)管理的文章就介紹到這了,更多相關(guān)vue3 provide實(shí)現(xiàn)狀態(tài)管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue-router路由懶加載和權(quán)限控制詳解

    vue-router路由懶加載和權(quán)限控制詳解

    這篇文章主要介紹了vue-router路由懶加載和權(quán)限控制的相關(guān)資料
    2017-12-12
  • vue-router傳參的4種方式超詳細(xì)講解

    vue-router傳參的4種方式超詳細(xì)講解

    我們?cè)诮M件切換時(shí)經(jīng)常會(huì)有傳遞一些數(shù)據(jù)的需求,這樣就涉及到了路由傳參的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于vue-router傳參的4種超詳細(xì)方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 在vue中實(shí)現(xiàn)iframe嵌套Html頁(yè)面及注意事項(xiàng)說(shuō)明

    在vue中實(shí)現(xiàn)iframe嵌套Html頁(yè)面及注意事項(xiàng)說(shuō)明

    這篇文章主要介紹了在vue中實(shí)現(xiàn)iframe嵌套Html頁(yè)面及注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 為什么要使用Vuex的介紹

    為什么要使用Vuex的介紹

    今天小編就為大家分享一篇關(guān)于為什么要使用Vuex的介紹,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • vue-element-admin中node-sass換成dart-sass,安裝依賴報(bào)code?128多種問(wèn)題的解決方法

    vue-element-admin中node-sass換成dart-sass,安裝依賴報(bào)code?128多種問(wèn)題的解決

    這篇文章主要介紹了vue-element-admin中node-sass換成dart-sass,安裝依賴報(bào)code?128多種問(wèn)題的解決方法,本文給大家分享問(wèn)題原因分析及解決方法,需要的朋友可以參考下
    2023-02-02
  • Vue使用antd組件a-form-model實(shí)現(xiàn)數(shù)據(jù)連續(xù)添加功能

    Vue使用antd組件a-form-model實(shí)現(xiàn)數(shù)據(jù)連續(xù)添加功能

    這篇文章主要介紹了Vue使用antd組件a-form-model實(shí)現(xiàn)數(shù)據(jù)連續(xù)添加功能,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • Vue3項(xiàng)目中的hooks的使用教程

    Vue3項(xiàng)目中的hooks的使用教程

    今天我們稍微說(shuō)一下 vue3 項(xiàng)目中的 hooks 的使用,其實(shí)這個(gè) hooks 呢是和 vue2 當(dāng)中的 mixin 是類似的,學(xué)習(xí)過(guò) vue2 的小伙伴一定對(duì) mixin 一定比較熟悉,快跟隨小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • vue中的el-tooltip提示黑框遮擋問(wèn)題

    vue中的el-tooltip提示黑框遮擋問(wèn)題

    這篇文章主要介紹了vue中的el-tooltip提示黑框遮擋問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 一步一步實(shí)現(xiàn)Vue的響應(yīng)式(對(duì)象觀測(cè))

    一步一步實(shí)現(xiàn)Vue的響應(yīng)式(對(duì)象觀測(cè))

    這篇文章主要介紹了一步一步實(shí)現(xiàn)Vue的響應(yīng)式(對(duì)象觀測(cè)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • vue3更新的setup語(yǔ)法糖實(shí)例詳解

    vue3更新的setup語(yǔ)法糖實(shí)例詳解

    vue3上線已經(jīng)很久了,許多小伙伴應(yīng)該都已經(jīng)使用過(guò)vue3了,下面這篇文章主要給大家介紹了關(guān)于vue3更新的setup語(yǔ)法糖的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04

最新評(píng)論

剑河县| 宁安市| 峨山| 诸暨市| 依安县| 噶尔县| 定南县| 探索| 铜川市| 蒙自县| 东平县| 阳东县| 朝阳县| 常州市| 安岳县| 宜兰县| 岐山县| 晋宁县| 四子王旗| 临桂县| 饶阳县| 定边县| 西藏| 江源县| 广丰县| 资阳市| 阜新市| 施甸县| 林甸县| 福贡县| 宜阳县| 永清县| 英德市| 博野县| 钦州市| 沙田区| 南郑县| 蓬莱市| 北辰区| 南昌县| 乐昌市|