為什么要使用Vuex的介紹
單向數(shù)據(jù)流
以下是一個表示“單向數(shù)據(jù)流”理念的極簡示意:
但是,當(dāng)我們的應(yīng)用遇到多個組件共享狀態(tài)時,單向數(shù)據(jù)流的簡潔性很容易被破壞:
- - 多個視圖依賴于同一狀態(tài)。
- - 來自不同視圖的行為需要變更同一狀態(tài)。
對于問題一,傳參的方法對于多層嵌套的組件將會非常繁瑣,并且對于兄弟組件間的狀態(tài)傳遞無能為力。
對于問題二,我們經(jīng)常會采用父子組件直接引用或者通過事件來變更和同步狀態(tài)的多份拷貝。以上的這些模式非常脆弱,通常會導(dǎo)致無法維護(hù)的代碼。
因此,我們?yōu)槭裁床话呀M件的共享狀態(tài)抽取出來,以一個全局單例模式管理呢?在這種模式下,我們的組件樹構(gòu)成了一個巨大的“視圖”,不管在樹的哪個位置,任何組件都能獲取狀態(tài)或者觸發(fā)行為!
另外,通過定義和隔離狀態(tài)管理中的各種概念并強制遵守一定的規(guī)則,我們的代碼將會變得更結(jié)構(gòu)化且易維護(hù)。
這就是 Vuex 背后的基本思想,借鑒了 Flux、Redux、和 The Elm Architecture。與其他模式不同的是,Vuex 是專門為 Vue.js 設(shè)計的狀態(tài)管理庫,以利用 Vue.js 的細(xì)粒度數(shù)據(jù)響應(yīng)機制來進(jìn)行高效的狀態(tài)更新。
什么情況下應(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 將會成為自然而然的選擇。引用 Redux 的作者 Dan Abramov 的話說就是:
Flux 架構(gòu)就像眼鏡:您自會知道什么時候需要它。
如果沒有使用Vuex
假設(shè)有這樣的兩個頁面,數(shù)據(jù)一樣,就是頁面布局不一樣:
代碼
Page1.vue
<template> <div> <h2>我是第一個頁面</h2> <ul class="ul_list"> <li v-for="item in items"> <p class="name">商品:{{item.name}}</p> <p class="price">價格:¥{{item.price}}</p> </li> </ul> </div> </template> <script> export default { data() { return { items: [ { name: '贛州橙子', price: '8.8' }, { name: '新疆哈密瓜', price: '2.0' }, { name: '山東大棗', price: '3.2' }, { name: '陽澄湖大閘蟹', price: '10.0' } ] } }, } </script>
Page2.vue
<template> <div> <h2>我是第二個頁面</h2> <ul class="ul_list page2"> <li v-for="item in items"> <p class="name">商品:{{item.name}}</p> <p class="price">價格:¥{{item.price}}</p> </li> </ul> </div> </template> <script> export default { data() { return { items: [ { name: '贛州橙子', price: '8.8' }, { name: '新疆哈密瓜', price: '2.0' }, { name: '山東大棗', price: '3.2' }, { name: '陽澄湖大閘蟹', price: '10.0' } ] } }, } </script>
現(xiàn)在我們可以看見上面兩個頁面里面的數(shù)據(jù)是一樣的。同一份數(shù)據(jù),我們在兩個頁面里面操作兩次感覺還行,如果有10個,20個 ……頁面需要這樣,那么這就是一個讓人奔潰的事情,而且數(shù)據(jù)的同步刷新也很痛苦。所以就需要Vuex了。簡言之:vuex就是將數(shù)據(jù)共享給多個組件共同使用,同時也將這個數(shù)據(jù)的狀態(tài)進(jìn)行了共享(一個組件改變這個數(shù)據(jù)的狀態(tài)其它組件也跟著改變)。
Vue官網(wǎng)對Vuex的解釋:
每一個 Vuex 應(yīng)用的核心就是 store(倉庫)。“store”基本上就是一個容器,它包含著你的應(yīng)用中大部分的狀態(tài) (state)。Vuex 和單純的全局對象有以下兩點不同:
- Vuex 的狀態(tài)存儲是響應(yīng)式的。當(dāng) Vue 組件從 store 中讀取狀態(tài)的時候,若 store 中的狀態(tài)發(fā)生變化,那么相應(yīng)的組件也會相應(yīng)地得到高效更新。
- 你不能直接改變 store 中的狀態(tài)。改變 store 中的狀態(tài)的唯一途徑就是顯式地提交 (commit) mutation。這樣使得我們可以方便地跟蹤每一個狀態(tài)的變化,從而讓我們能夠?qū)崿F(xiàn)一些工具幫助我們更好地了解我們的應(yīng)用。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
解讀element-ui使用el-upload,before-upload函數(shù)不好使的問題
這篇文章主要介紹了解讀element-ui使用el-upload,before-upload函數(shù)不好使的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03vue2.0 根據(jù)狀態(tài)值進(jìn)行樣式的改變展示方法
下面小編就為大家分享一篇vue2.0 根據(jù)狀態(tài)值進(jìn)行樣式的改變展示方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03axios解決高并發(fā)的方法:axios.all()與axios.spread()的操作
這篇文章主要介紹了axios解決高并發(fā)的方法:axios.all()與axios.spread()的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11vscode搭建vue環(huán)境完整圖文教程(適合新手小白)
Vue框架的優(yōu)秀設(shè)計和強大的生態(tài)系統(tǒng)成為了越來越多開發(fā)者選擇Vue的原因,在實際項目過程中一個高效的開發(fā)環(huán)境能夠大大提高開發(fā)效率,這篇文章主要給大家介紹了關(guān)于vscode搭建vue環(huán)境的相關(guān)資料,需要的朋友可以參考下2023-10-10詳解如何使用Object.defineProperty實現(xiàn)簡易的vue功能
這篇文章主要為大家介紹了如何使用Object.defineProperty實現(xiàn)簡易的vue功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04