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

Vuex實現(xiàn)數(shù)據(jù)共享的方法

 更新時間:2019年12月20日 09:43:10   作者:高山低谷  
Vuex 是一個專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式。這篇文章主要介紹了Vuex實現(xiàn)數(shù)據(jù)共享的方法,需要的朋友可以參考下

在用vue作為前端框架進行開發(fā)的時候,對于組件間的傳值你一定不會陌生,如果只是簡單的父子組件傳值,我想你肯定不會選擇用Vuex來進行狀態(tài)管理,但是如果你需要構(gòu)建一個中大型單頁應(yīng)用,組件間數(shù)據(jù)交互比較復(fù)雜頻繁,你很可能會考慮如何更好地在組件外部管理狀態(tài),那么Vuex 將會成為自然而然的選擇。

Vuex 是什么?

Vuex 是一個專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應(yīng)用的所有組件的狀態(tài),并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測的方式發(fā)生變化。 這是官方的一種說法。

用個人的話總結(jié)下: Vuex就是為了實現(xiàn)多組件數(shù)據(jù)共享,從而建立一個叫store的數(shù)據(jù)管理庫,將需要共享的數(shù)據(jù)存放在里面,在需要的地方可以取出來作為初始數(shù)據(jù),也可以在組件內(nèi)通過dispatch或者提交commit方法來改變該原始數(shù)據(jù)狀態(tài),從而實現(xiàn)的data的共享。

Vuex的核心

1、 State

Vuex中的數(shù)據(jù)源,我們需要保存的數(shù)據(jù)就保存在這里,可以在頁面通過this.$store.state來獲取我們定義的數(shù)據(jù)。

import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

const state = {
 number: 0
}

export default new Vuex.Store({
 state,
});

在頁面中通過this.$store.state.number 即可獲取到當前的值。

2、Getter

Vuex 允許我們在 store 中定義“getter”(可以認為是 store 的計算屬性)。就像計算屬性一樣,getter 的返回值會根據(jù)它的依賴被緩存起來,且只有當它的依賴值發(fā)生了改變才會被重新計算。

Getter 接受 state 作為其第一個參數(shù):

import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

const state = {
 number: 0
}

const getters = {
 getNumber(state) {
  return state.number + 1
 }
}
export default new Vuex.Store({
 state,
 getters,
});

在頁面你可以用兩種方式取到getters里面的值

1、通過屬性訪問

Getter 會暴露為 store.getters 對象,你可以以屬性的形式訪問這些值 如: this.$store.getters.getNumber

Getter 也可以接受其他 getter 作為第二個參數(shù):

const state = {
 number: 1
}

const getters = {
 getNumber(state) {
  return state.number + 1 // 2
 },
 getDoubNUmber(state, getters) {
  return state.number + getters.getNumber // 3
 }
}

注意: getter 在通過屬性訪問時是作為 Vue 的響應(yīng)式系統(tǒng)的一部分緩存其中的。

2、 通過方法訪問

你也可以通過讓 getter 返回一個函數(shù),來實現(xiàn)給 getter 傳參。在你對 store 里的數(shù)組進行查詢時非常有用。

const state = {
 number: 1,
 list: [1, 2, 3, 4, 5]
}

const getters = {
 getNumber(state) {
  return state.number + 1 // 2
 },
 getDoubNumber(state, getters) {
  return state.number + getters.getNumber // 3
 },
 filterNumber:(state)=>(num)=> {
  return state.list.find(item=> item%num === 0)
 } 
}
export default new Vuex.Store({
 state,
 getters,
});

注意, getter 在通過方法訪問時,每次都會去進行調(diào)用,而不會緩存結(jié)果 this.$store.getters.filterNumber(3)

3、Mutation

更改 Vuex 的 store 中的狀態(tài)的唯一方法是提交 mutation。Vuex 中的 mutation 非常類似于事件:每個 mutation 都有一個字符串的 事件類型 (type) 和 一個 回調(diào)函數(shù) (handler)。這個回調(diào)函數(shù)就是我們實際進行狀態(tài)更改的地方, 并且它會接受 state 作為第一個參數(shù) , 提交載荷(payload) 作為額外的參數(shù) ,并且在大多數(shù)情況下,載荷應(yīng)該是一個對象,這樣可以包含多個字段并且使記錄的 mutation 會更易讀:

你可以這樣寫:

const mutations = {
 increment(state, n) {
 state.number += n
 }
}

但你不能直接調(diào)用一個 mutation handler。這個選項更像是事件注冊:“當觸發(fā)一個類型為 increment 的 mutation 時,調(diào)用此函數(shù)?!币獑拘岩粋€ mutation handler,你需要以相應(yīng)的 type 調(diào)用 store.commit 方法:

this.$store.commit('increment', 1)

也可以這樣寫:

const mutations = {
 increment(state, payload) {
 state.number += payload.count
 }
}

然后:

使用 this.$store.commit('increment', {count: 1})  提交,

// 或者另一種方式是直接使用包含 type 屬性的對象進行提交:
this.$store.commit({
 type: 'increment',
 count: 1
})

特別說明:在 Vuex 中,mutation 都是同步任務(wù):為了處理異步操作,讓我們來看一看 Action。

4、 Action

Action 類似于 mutation,不同在于:

1、Action 提交的是 mutation,而不是直接變更狀態(tài)。

2、Action 可以包含任意異步操作。

雖然在頁面中通過提交commit是可以達到修改store中狀態(tài)值的目的,但是官方并不建議我們這樣做,而是讓我們?nèi)ヌ峤灰粋€action,在action中提交mutation再去修改狀態(tài)值。

const mutations = {
 increment(state) {
 state.number += 1
 }
}
const actions = {
 addNumber(context){
  context.commit('increment')
 }
}

Action 函數(shù)接受一個與 store 實例具有相同方法和屬性的 context 對象,因此你可以調(diào)用 context.commit 提交一個 mutation,或者通過 context.state 和 context.getters 來獲取 state 和 getters

addNumber( {commit} ){
 commit('increment')
}

以上這種寫法等同于:

addNumber(context){
 context.commit('increment')
}

Action 通過 store.dispatch 方法觸發(fā):

this.$store.dispatch('addNumber')

同mutation 一樣你也可以在action的時候傳遞參數(shù)

const mutations = {
 increment(state, number) {
 state.number += number
 }
}
const actions = {
 addNumber(context, number){
  context.commit('increment', number)
 }
 或者:
 addNumber( {commit}, number){
  commit('increment', number)
 }
}

觸發(fā)方法: this.$store.dispatch('addNumber', 10)

關(guān)于在action 處理異步操作可以看下面這個例子:

const actions = {
 getData({commit}) {
  return new Promise((resolve, reject)=> {
   setTimeout(()=>{
   commit('getList')
   resolve()
   }, 1000)
  })
 }
}

然后再

this.$store.dispatch('getData').then(() => {
 // ...
})

完整 實例:

import Vue from "vue";
import Vuex from "vuex";
import { resolve, reject } from "any-promise";
Vue.use(Vuex);
const state = {
 number: 1,
 list: [1, 2, 3, 4, 5]
}
const getters = {
 getNumber(state) {
  return state.number + 1 // 2
 },
 getDoubNumber(state, getters) {
  return state.number + getters.getNumber // 3
 },
 filterNumber:(state)=>(num)=> {
  return state.list.find(item=> item%num === 0)
 } 
}
const mutations = {
 increment(state, n) {
 state.number += n
 },
 getList(state) {
 state.list = state.list.forEach((item)=> item*2)
 }
}
const actions = {
 addNumber( {commit} , n){
  commit('increment', n)
 },
 getData({commit}) {
  return new Promise((resolve, reject)=> {
   setTimeout(()=>{
   commit('getList')
   resolve()
   }, 1000)
  })
 }
}
export default new Vuex.Store({
 state,
 getters,
 mutations,
 actions
});

關(guān)于 Vuex中mapState、mapGetters、mapMutations、mapActions的用法

要用 首先得引入:

import { mapState, mapGetters, mapMutations, mapActions } from 'vuex';

這玩意兒其實就是Vuex 內(nèi)置的輔助函數(shù),方便我們獲取store里面的數(shù)據(jù)和方法

computed: {
 ...mapState([
 'number'
 ])
}
// 使用對象展開運算符將 getter 混入 computed 對象中
computed: {
 ...mapGetters([
  'getNumber',
  'getDoubNumber',
  // ...
 ])
} 
methods: {
 ...mapMutations([
  'increment', // 將 `this.increment()` 映射為 `this.$store.commit('increment')`
 ...mapMutations({
  add: 'increment' // 將 `this.add()` 映射為 `this.$store.commit('increment')`
 })
} 
methods: {
 ...mapActions([
  'addNumber', // 將 `this.addNumber()` 映射為 `this.$store.dispatch('addNumber')`
  // `mapActions` 也支持載荷:
  'addNumber' // 將 `this.addNumber(amount)` 映射為 `this.$store.dispatch('addNumber', amount)`
 ]),
 ...mapActions({
  requestData: 'getData' // 將 `this.requestData()` 映射為 `this.$store.dispatch('getData')`
 })
 }


以上是對Vuex實現(xiàn)狀態(tài)管理的一個整個過程的理解,參考官方文檔,然后自己寫一遍,比較容易明白其中的道理,后面有時間想寫React里面關(guān)于Redux實現(xiàn)狀態(tài)管理的一個過程,對比其中,其實他們思想差不多, 只不過redux實現(xiàn)過程更多點,敬請期待!

相關(guān)文章

  • Vuepress使用vue組件實現(xiàn)頁面改造

    Vuepress使用vue組件實現(xiàn)頁面改造

    這篇文章主要為大家介紹了Vuepress使用vue組件實現(xiàn)頁面改造示例過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • vuex中五大屬性和使用說明(包括輔助函數(shù))

    vuex中五大屬性和使用說明(包括輔助函數(shù))

    這篇文章主要介紹了vuex中五大屬性和使用說明(包括輔助函數(shù)),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Vue+element-ui添加自定義右鍵菜單的方法示例

    Vue+element-ui添加自定義右鍵菜單的方法示例

    這篇文章主要給大家介紹了關(guān)于Vue+element-ui添加自定義右鍵菜單的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • vue深度優(yōu)先遍歷多層數(shù)組對象方式(相當于多棵樹、三級樹)

    vue深度優(yōu)先遍歷多層數(shù)組對象方式(相當于多棵樹、三級樹)

    這篇文章主要介紹了vue深度優(yōu)先遍歷多層數(shù)組對象方式(相當于多棵樹、三級樹),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue項目開啟gzip壓縮功能簡單實例

    vue項目開啟gzip壓縮功能簡單實例

    這篇文章主要給大家介紹了關(guān)于vue項目開啟gzip壓縮功能的相關(guān)資料,gizp壓縮是一種http請求優(yōu)化方式,通過減少文件體積來提高加載速度,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • vue實現(xiàn)web滾動條分頁

    vue實現(xiàn)web滾動條分頁

    這篇文章主要為大家詳細介紹了vue實現(xiàn)web滾動條分頁,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Element 的 el-table 表格實現(xiàn)單元格合并功能

    Element 的 el-table 表格實現(xiàn)單元格合并功能

    這篇文章主要介紹了Element 的 el-table 表格實現(xiàn)單元格合并功能,本文通過示例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2024-07-07
  • vue中數(shù)組加Key方式

    vue中數(shù)組加Key方式

    這篇文章主要介紹了vue中數(shù)組加Key方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Vue兩個版本的區(qū)別和使用方法(更深層次了解)

    Vue兩個版本的區(qū)別和使用方法(更深層次了解)

    在我們使用 vue時,我們可以引用兩個不同版本的 Vue,分別是 Vue完整版(vue.js)和 Vue(vue.runtime.js )非完整版,那么它們的區(qū)別是什么呢,今天我們就來分析下這兩個不同版本之間的區(qū)別,一起看看吧
    2020-02-02
  • Vue項目打包、合并及壓縮優(yōu)化網(wǎng)頁響應(yīng)速度

    Vue項目打包、合并及壓縮優(yōu)化網(wǎng)頁響應(yīng)速度

    網(wǎng)站頁面的響應(yīng)速度與用戶體驗息息相關(guān),直接影響到用戶是否愿意繼續(xù)訪問你的網(wǎng)站,所以這篇文章主要給大家介紹了關(guān)于Vue項目打包、合并及壓縮優(yōu)化網(wǎng)頁響應(yīng)速度的相關(guān)資料,需要的朋友可以參考下
    2021-07-07

最新評論

马鞍山市| 米脂县| 莱西市| 城口县| 保德县| 天长市| 姚安县| 伽师县| 呼和浩特市| 洛阳市| 南宁市| 湖州市| 新昌县| 莱阳市| 天峻县| 松原市| 道孚县| 镇远县| 灵石县| 乌拉特中旗| 龙川县| 丽江市| 灵宝市| 华安县| 定兴县| 潞城市| 碌曲县| 湘西| 永和县| 宁蒗| 红河县| 慈利县| 洪湖市| 集安市| 拉孜县| 乌拉特后旗| 金山区| 深圳市| 景谷| 清丰县| 称多县|