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

淺談vuex actions和mutation的異曲同工

 更新時間:2018年12月13日 14:27:10   作者:color_小浣熊  
這篇文章主要介紹了淺談vuex actions和mutation的異曲同工 ,詳細的介紹了actions和mutation的使用和區(qū)別,非常具有實用價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

vuex說明:

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

包含的內(nèi)容:

  • state:驅(qū)動應(yīng)用的數(shù)據(jù)源;
  • view:以生命方式將state映射到視圖;
  • actions:響應(yīng)在view上的用戶輸入導(dǎo)致的狀態(tài)變化;

流程示意圖


但是,當(dāng)我們的應(yīng)用遇到多個組件共享狀態(tài)時,單向數(shù)據(jù)流的簡潔性很容易被破壞:

多個視圖依賴于同一狀態(tài)。

來自不同視圖的行為需要變更同一狀態(tài)。

對于問題一,傳參的方法對于多層嵌套的組件將會非常繁瑣,并且對于兄弟組件間的狀態(tài)傳遞無能為力。

對于問題二,我們經(jīng)常會采用父子組件直接引用或者通過事件來變更和同步狀態(tài)的多份拷貝。以上的這些模式非常脆弱,通常會導(dǎo)致無法維護的代碼。

因此,我們?yōu)槭裁床话呀M件的共享狀態(tài)抽取出來,以一個全局單例模式管理呢?在這種模式下,我們的組件樹構(gòu)成了一個巨大的“視圖”,不管在樹的哪個位置,任何組件都能獲取狀態(tài)或者觸發(fā)行為!

另外,通過定義和隔離狀態(tài)管理中的各種概念并強制遵守一定的規(guī)則,我們的代碼將會變得更結(jié)構(gòu)化且易維護。

適用于型單頁應(yīng)用

安裝vuex

npm i vuex

新建文件夾store,建議目錄

Actions 和 mutation

mutation:(必須是同步函數(shù))

更改store中state值的唯一方法就是提交mutation,每個 mutation 都有一個字符串的 事件類型 (type) 和 一個 回調(diào)函數(shù) (handler)。這個回調(diào)函數(shù)就是我們實際進行狀態(tài)更改的地方,并且它會接受 state 作為第一個參數(shù):

 mutations: {
  addNum(state) { 
   state.num ++
  }
}

你可以向 store.commit 傳入額外的參數(shù),即 mutation 的 載荷(payload):在大多數(shù)情況下,載荷應(yīng)該是一個對象,這樣可以包含多個字段并且記錄的 mutation 會更易讀:

 mutations: {
  addNum(state,Payload) { 
   state.num +=Payload.amount
  }
}

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

//頁面中的操作(一、不帶參數(shù))
 methods:{
  add(){
   this.$store.commit('addNum')
  }
 }
//二、帶參數(shù)的情況下
data(){
argument:{
 amount:10
},
methods:{
  add(){
   this.$store.commit('addNum',this.arguments)
  }
 }

actions

Action 類似于 mutation,不同在于:

  • Action 提交的是 mutation,而不是直接變更狀態(tài)。
  • Action 可以包含任意異步操作。
 mutations: {
  addNum(state,amount) {
   state.num +=amount
  },
  someMutation(state) {
   setTimeout(()=>{
     state.count--
   },1000)
  }
 },
 actions: {
  increment (context,args) {
      context.commit('addNum',args)
  }
 },
//另一種寫法
 actions: {
  increment ({commit},args) {
      commit('addNum',args)
  }
 }

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

分發(fā)Action

//頁面中
methods:{
  add(){
   this.$store.dispatch('increment',this.pa.amount)
  }
 },

區(qū)別:

action和mutation都可以改變state中數(shù)據(jù)的狀態(tài),但是action可以處理異步函數(shù)可以在devtool中追蹤數(shù)據(jù)變化,而mutation只可以處理同步函數(shù),當(dāng)處理異步函數(shù)的時候檢測不到數(shù)據(jù)變化;

mutation 處理同步異步

 mutations: {
//同步
  addNum(state,amount) {
   state.num +=amount
  },
//異步
  someMutation(state) {
   setTimeout(()=>{
     state.count--
   },1000)
  }
 }

頁面中操作

<template>
<div>
   <p @click="add">同步{{num}}</p>
  <p @click="reduce">異步{{count}}</p>
</div>
</template>
 methods:{
  //同步
  add(){
   this.$store.commit('increment',this.pa.amount)
  },
//異步
  reduce(){
   this.$store.commit('someMutation')
  }
 }

數(shù)據(jù)變化之前,瀏覽器中顯示,devtool中的數(shù)據(jù)狀態(tài)


當(dāng)頁面中的數(shù)據(jù)改變之后,追蹤數(shù)據(jù)


action 處理同步異步

 mutations: {
  addNum(state, amount) {
   state.num += amount
  },
  someMutation(state) {
    state.count-- 
  }
 },
 actions: {
  increment({commit}, args) {
   commit('addNum', args)
  },
  actionSomemution(context) {
   setTimeout(() => {
     context.commit('someMutation') 
   }, 1000)
  }
 }

頁面中

methods:{
  add(){
   this.$store.dispatch('increment',this.pa.amount)
  },
  reduce(){
   this.$store.dispatch('actionSomemution')
  }
 },

數(shù)據(jù)變化之前,瀏覽器中顯示,與devtool中數(shù)據(jù)顯示


操作之后數(shù)據(jù)變化,



----

小結(jié):mutation只能處理同步函數(shù),在devtools檢測不到狀態(tài)樹中數(shù)據(jù)的變化,而actions可以處理同異步數(shù)據(jù),可以在devtools檢測數(shù)據(jù)變化,這樣就好理解了

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解axios全局路由攔截的設(shè)置方法

    詳解axios全局路由攔截的設(shè)置方法

    這篇文章主要介紹了axios全局路由攔截的設(shè)置方法,axios全局路由代碼通常是在構(gòu)建axios實例注入的,本文通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • vue中路由router配置步驟詳解

    vue中路由router配置步驟詳解

    vue的主要思想是組件化開發(fā),路由用來配置組件對應(yīng)展示路徑,本文給大家介紹vue中路由router配置步驟,創(chuàng)建路由文件——使用路由——配置路由出口,使路由配置內(nèi)容展示在頁面上,感興趣的朋友跟隨小編一起看看吧
    2023-12-12
  • Vue Cli3 創(chuàng)建項目的方法步驟

    Vue Cli3 創(chuàng)建項目的方法步驟

    Vue CLI是一個用于快速Vue.js開發(fā)的完整系統(tǒng)。這篇文章主要介紹了Vue Cli3 創(chuàng)建項目的方法步驟,非常具有實用價值,需要的朋友可以參考下
    2018-10-10
  • element el-tree組件的動態(tài)加載、新增、更新節(jié)點的實現(xiàn)

    element el-tree組件的動態(tài)加載、新增、更新節(jié)點的實現(xiàn)

    這篇文章主要介紹了element el-tree組件的動態(tài)加載、新增、更新節(jié)點的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Vue?Router?實現(xiàn)登錄后跳轉(zhuǎn)到之前想要訪問的頁面

    Vue?Router?實現(xiàn)登錄后跳轉(zhuǎn)到之前想要訪問的頁面

    這篇文章主要介紹了Vue?Router?實現(xiàn)登錄后跳轉(zhuǎn)到之前相要訪問的頁面,本文僅演示路由跳轉(zhuǎn)和導(dǎo)航守衛(wèi)相關(guān)代碼的實現(xiàn),不包含具體的權(quán)限驗證和登錄請求,需要的朋友可以參考下
    2022-12-12
  • Vue Prop屬性功能與用法實例詳解

    Vue Prop屬性功能與用法實例詳解

    這篇文章主要介紹了Vue Prop屬性功能與用法,結(jié)合實例形式較為詳細的分析了vue.js中Prop屬性的功能、原理、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-02-02
  • Vue中watch的多種使用方法小結(jié)

    Vue中watch的多種使用方法小結(jié)

    Vue的watch選項提供了多種方法來觀測數(shù)據(jù)屬性的變化,讓我們能夠編寫更加優(yōu)雅和維護性更高的代碼,本文給大家介紹Vue中watch的多種使用方法小結(jié),感興趣的朋友一起看看吧
    2023-10-10
  • Django+Vue.js搭建前后端分離項目的示例

    Django+Vue.js搭建前后端分離項目的示例

    本篇文章主要介紹了Django+Vue.js搭建前后端分離項目的示例,具有一定參考價值,有興趣的可以了解一下
    2017-08-08
  • vue在history模式下打包部署問題及解決方案

    vue在history模式下打包部署問題及解決方案

    這篇文章主要介紹了vue在history模式下打包部署問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • axios模塊化封裝實例化及vue本地解決跨域方案

    axios模塊化封裝實例化及vue本地解決跨域方案

    這篇文章主要為大家介紹了axios模塊化封裝實例化及vue本地解決跨域示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05

最新評論

星子县| 兴国县| 岢岚县| 乃东县| 子长县| 恩平市| 临湘市| 吉水县| 馆陶县| 元朗区| 和平县| 秦安县| 襄汾县| 西丰县| 忻州市| 磐安县| 灵山县| 花垣县| 东兰县| 钟祥市| 大连市| 章丘市| 阿瓦提县| 宜丰县| 隆林| 宿迁市| 东辽县| 岑巩县| 台中县| 三都| 二连浩特市| 岳池县| 汾阳市| 余干县| 南涧| 磐安县| 临澧县| 潮州市| 贺州市| 鄄城县| 新竹市|