成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

vuex淺入淺出

?。?。 / 1125人閱讀

摘要:來自不同視圖的行為需要變更同一狀態(tài)。圖解后端的行為,響應(yīng)在上的用戶輸入導(dǎo)致的狀態(tài)變化。中的非常類似于事件每個都有一個字符串的事件類型和一個回調(diào)函數(shù)。

什么是Vuex?

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

Vuex采用和Redux類似的單向數(shù)據(jù)流的方式來管理數(shù)據(jù)。用戶界面負(fù)責(zé)觸發(fā)動作(Action)進(jìn)而改變對應(yīng)狀態(tài)(State),從而反映到視圖(View)上。

  new Vue({
      el: "#app",
      //state 驅(qū)動應(yīng)用的數(shù)據(jù)源
      data () {
        return { count: 0 }
      },
      //view 以聲明方式將 state 映射到視圖;
      template: "
{{ count }}
", //actions 響應(yīng)在 view 上的用戶輸入導(dǎo)致的狀態(tài)變化。 methods: { increment () { this.count++ } } })
什么是“狀態(tài)管理模式”?

讓我們從一個簡單的 Vue 計數(shù)應(yīng)用開始:

  const store = new Vuex.Store({
      //有哪些狀態(tài)
      state: {
        count: 0
      },
      actions: {
        incrementAction (store) {
          store.commit("increment")
        }
      },
      //改變,可以通過調(diào)用這個改變的方法來修改state的值
      mutations: {
        increment (state) {//這里面的方法的第一個就是state,我們可以直接修改
          state.count++
        }
      }
    })

這個狀態(tài)自管理應(yīng)用包含以下幾個部分:

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)化且易維護。
這就是 Vuex 背后的基本思想.

什么情況下我應(yīng)該使用 Vuex?

雖然 Vuex 可以幫助我們管理共享狀態(tài),但也附帶了更多的概念和框架。這需要對短期和長期效益進(jìn)行權(quán)衡。
如果您不打算開發(fā)大型單頁應(yīng)用,使用 Vuex 可能是繁瑣冗余的。確實是如此——如果您的應(yīng)用夠簡單,您最好不要使用 Vuex。一個簡單的?global event bus?就足夠您所需了。但是,如果您需要構(gòu)建是一個中大型單頁應(yīng)用,您很可能會考慮如何更好地在組件外部管理狀態(tài),Vuex 將會成為自然而然的選擇。

Vuex圖解

Backend API: 后端的API
Actions:行為,響應(yīng)在?view?上的用戶輸入導(dǎo)致的狀態(tài)變化。
Mutations: 突變,mutations, 通俗的理解,里面裝著一些改變數(shù)據(jù)方法的集合,這是Veux設(shè)計很重要的一點,就是把處理數(shù)據(jù)邏輯方法全部放在mutations里面,使得數(shù)據(jù)和視圖分離。
State: Vuex 使用單一狀態(tài)樹——是的,用一個對象就包含了全部的應(yīng)用層級狀態(tài)。至此它便作為一個“唯一數(shù)據(jù)源 (SSOT)”而存在。這也意味著,每個應(yīng)用將僅僅包含一個 store 實例。
Vue Components: Vue的組件
Devtools: 工具
Mutate: 變異,相當(dāng)于修改
Render: 提供,響應(yīng)

Commit的問題
**為什么不能直接調(diào)用mutation方法,而是必須得通過commit來提交mutation呢?
官方解釋道:
更改 Vuex 的 store 中的狀態(tài)的唯一方法是提交 mutation。Vuex 中的 mutations 非常類似于事件:每個 mutation 都有一個字符串的 事件類型 (type) 和 一個 回調(diào)函數(shù) (handler)。這個回調(diào)函數(shù)就是我們實際進(jìn)行狀態(tài)更改的地方,并且它會接受 state 作為第一個參數(shù):

const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment (state) {
      // 變更狀態(tài)
      state.count++
    }
  }
})

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

VueComponents—{Dispatch (傳入)}—>Actions—{Commit (提交)}-->Mutations—{Mutate(修改)}—>State—{Render(響應(yīng))}-->VueComponents

State: 相當(dāng)于組件里面的data,是用來存放數(shù)值。
Getter: 相當(dāng)于vue里面的computed
Actions: 相當(dāng)于vue里面的methods

  const store = new Vuex.Store({
      //有哪些狀態(tài)
      state: {
        count: 3
      },
      // 相當(dāng)于state的計算屬性
      getters: {
        evenOrOdd: state => {
          return state.count % 2 === 0 ? "even" : "odd"
        }
      },
      actions: {// 可以包含異步的代碼
        incrementAction (store, amount) {
          store.commit("increment", amount)
        },
        decrement ({ commit }) {
          commit("decrement")
        }
      },
      //改變,可以通過調(diào)用這個改變的方法來修改state的值
      mutations: {
        increment (state, amount) {//這里面的方法的第一個就是state,我們可以直接修改
          state.count += amount
        },
        decrement (state) {
          state.count--
        }
      }
    })

    var app = new Vue({
      el: "#app",
      computed: {
        counter () {
          return store.state.count
        },
        evenOrOdd () {
          return store.getters.evenOrOdd
        }
      },
      methods: {
        add () {
          store.dispatch("incrementAction", 5)
        },
        decrement () {
          store.dispatch("decrement")
        }
      }
    })

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/51531.html

相關(guān)文章

  • SegmentFault 技術(shù)周刊 Vol.16 - 淺入淺出 JavaScript 函數(shù)式編程

    摘要:函數(shù)式編程,一看這個詞,簡直就是學(xué)院派的典范。所以這期周刊,我們就重點引入的函數(shù)式編程,淺入淺出,一窺函數(shù)式編程的思想,可能讓你對編程語言的理解更加融會貫通一些。但從根本上來說,函數(shù)式編程就是關(guān)于如使用通用的可復(fù)用函數(shù)進(jìn)行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數(shù)式編程(Functional Programming),一...

    csRyan 評論0 收藏0
  • 端到端測試神器 cypress 淺入淺出

    摘要:我之前寫過關(guān)于的文章,,最近在工作中用到比較多了,頓時覺得確實是比較優(yōu)秀的一個。 我之前寫過關(guān)于cypress的文章,https://segmentfault.com/a/11...,最近在工作中用到cypress比較多了,頓時覺得cypress確實是比較優(yōu)秀的一個。 1. 軟件安裝. 2. 安裝cypress 安裝cypress客戶端:http://download.cypress...

    CarlBenjamin 評論0 收藏0
  • [譯]淺入淺出Monads

    摘要:接受另一個函數(shù)作為參數(shù),然后用接受的這個新函數(shù)處理,將結(jié)果再次傳給,最后將實例化的新對象返回??罩禉z查就是個不錯的例子這個實現(xiàn)里,只在為合法值非空時,傳入。但不論怎么變化,她們也都和一樣遵守上面提到的規(guī)則。 大多數(shù)關(guān)于monad的教程都和老太太的裹腳布一樣,又臭、又長,說不清、道不明。當(dāng)然我也不偉大,沒法保證我寫的一定更明了,更生動,甚至更屌?不過我至少可以確定,我這篇更簡潔。浪費不了...

    philadelphia 評論0 收藏0
  • 淺入淺出FlowDroid(一): 簡介&基本使用

    摘要:后文將圍繞做一些介紹。盡管如此,的使用對新手而言仍然充滿了困難。本系列文章基本為個人見解,難免有錯誤與誤解,如有客觀錯誤歡迎提出。 前言 說到Android的污點分析框架,網(wǎng)上的搜索結(jié)果大多指向靜態(tài)的FlowDroid與動態(tài)的TaintDroid。盡管由于加固、混淆等技術(shù)使得針對Android的靜態(tài)分析越來越困難,但靜態(tài)分析的無先驗分析能力無法被動態(tài)分析取代,使得靜態(tài)分析仍有發(fā)揮空間。...

    wqj97 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<