亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

詳解vuex 漸進式教程實例代碼

2024-05-06 16:47:32
字體:
來源:轉載
供稿:網友

vuex 漸進式教程,從入門級帶你慢慢深入使用vuex。

Vuex 是什么?

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

vuex官網: vuex.vuejs.org/zh/guide/

安裝

安裝vue-cli:

cnpm install -g vue-cli vue init webpack vuex

安裝vuex

cnpm i vuex --save

1.初級使用方法

// main.jsimport Vue from 'vue'import App from './App'import router from './router'import Vuex from 'vuex' // 引入vuexVue.config.productionTip = falseVue.use(Vuex);let store = new Vuex.Store({ // store 對象 state:{  count:0 }})/* eslint-disable no-new */new Vue({ el: '#app', router, store, //使用store,這可以把 store 的實例注入所有的子組件 components: { App }, template: '<App/>'})

此時可以在組件中使用 this.$store.state.count 獲取store中state的值。如: 

// 在組件的computed中使用 computed:{   count(){   return this.$store.state.count;   } }

想想一下當項目比較大的時候數據繁瑣,如果按照上述方法使用vuex,當你打開main.js你看的到場景是比較混亂的,各種數據繁雜在一起,不便于日后的維護。請看下一步:

2.中級使用方法: modules 模塊化

state用法

2.1 在main.js中刪除下述這部分代碼

let store = new Vuex.Store({ // store 對象 state:{  count:0 }})

2.2. 在src目錄下新建store文件夾并在該文件夾下新建index.js文件。 在 store/index.js寫入:

import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({ strict:true, // 開啟嚴格模式 確保state 中的數據只能 mutations 修改 state:{  count:0 }})export default store;

對應的main.js應該寫入:

import store from './store'

寫到這里,我們在組件里就可以獲取到store里的state的值了

2.3 為了方便測試直接在HelloWorld.vue 中使用store

<template> <div class="hello">  <h2>{{count}}</h2> </div></template><script>export default { name: 'HelloWorld', computed:{   count(){    return this.$store.state.count;   } }}</script>

很多時候咱們要對state里的值進行操作,在vuex提供了一個方法mutations

mutations用法(使用mutations可以修改state的值)

在sore/index.js寫入:

//... state:{  count:0 }, mutations:{ // 更改數據的方法  add(state){   state.count++  },  //提交載荷用法//   add(state,n){ //   state.count += n//  },  sub(state){   state.count--  } }...//

組件(HelloWorld.vue)中使用mutations里對應的方法:

<template> <div class="hello">  <button @click="add">+</button>  <h2>{{count}}</h2>  <button @click="sub">-</button> </div></template><script>export default { name: 'HelloWorld', computed:{   count(){    return this.$store.state.count;   } },  methods:{  add(){   this.$store.commit('add');  },    //提交載荷用法  // add(){   //  this.$store.commit('add',10);  // },    //對象風格的提交方式  //  store.commit({  //   type: 'add',  //   n: 10  //   })    sub(){   this.$store.commit('sub');  } }}</script>

此時就可以對count進行修改了。

當你想異步操作的時候,由于mutation必須是同步的這一點,此時不能采用mutation對state 進行修改。action派上用場了,action就是一個函數集合,在里面怎么操作都可以,只要最后觸發mutation 就可以了。

注解mutation不能異步操作的原因:

mutations: {  add (state) {   api.callAsyncMethod(() => {  state.count++  }) }}

現在想象,我們正在 debug 一個 app 并且觀察 devtool 中的 mutation 日志。每一條 mutation 被記錄,devtools 都需要捕捉到前一狀態和后一狀態的快照。然而,在上面的例子中 mutation 中的異步函數中的回調讓這不可能完成:因為當 mutation 觸發的時候,回調函數還沒有被調用,devtools 不知道什么時候回調函數實際上被調用——實質上任何在回調函數中進行的狀態的改變都是不可追蹤的。

Action 用法

在sore/index.js寫入:

 mutations:{ // 更改數據的方法add(state){   state.count++  },  sub(state){   state.count--  } },++++ actions:{  add(context){ // context 與 store 實例具有相同方法和屬性(但不是store 實例)   setTimeout(()=>{    context.commit('add');   },1000)  } }++++

組件(HelloWorld.vue)中使用getters里對應的方法:

<template> <div class="hello">  <button @click="add">+</button>  ++++  <button @click="add_action">action +</button>  ++++  <h2>{{count}}</h2>  <button @click="sub">-</button>  <div>   test: {{doneTodos[0].text}} <br>   length: {{doneTodosLength}}  </div> </div></template>export default { methods:{  add(){   this.$store.commit('add');   // console.log(this);  },  sub(){   this.$store.commit('sub');  },  ++++  add_action(){   this.$store.dispatch('add');  }  ++++ }}

看到這里有沒有想過當我們使用state中某一個數據時,我們只想用該數據中符合條件的數據。比如:

state:{  count:0,  todos: [   { id: 1, text: 'text1--true', done: true },   { id: 2, text: 'text2--false', done: false }  ] }

此時我們只想獲取state.todos中done為true的數據時我們應該怎么獲?。?/p>

可能會有以下兩種方案:

1.每個在組件中首先獲取todos,然后使用filter方法過濾;

2.寫一個公共函數在每個組件中調用以下;

如果用到todos中done為true的組件很多,這兩種方法都是很不理想的。Vuex為此為我們引入了一個方法Getter。

Getter 用法

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

在sore/index.js寫入:

mutations:{ // 更改數據的方法  add(state){   state.count++  },  sub(state){   state.count--  } }, +++ getters:{ // 用法類似組件中的 computed, 可以認為是store的計算屬性  doneTodos:state => { // Getter 接受 state 作為其第一個參數:   return state.todos.filter(todo => todo.done) // -> [{ id: 1, text: 'text1--true', done: true }]  },  // Getter 也可以接受其他 getter 作為第二個參數  doneTodosLength:(state,getters) => {   return getters.doneTodos.length // -> 1  }, +++ }

組件(HelloWorld.vue)中使用getters里對應的方法:

<template> <div class="hello">  <button @click="add">+</button>  <h2>{{count}}</h2>  <button @click="sub">-</button>+++  <div>   test: {{doneTodos[0].text}} <br>   length: {{doneTodosLength}}  </div>+++   </div></template><script>export default { //...  computed:{  +++    doneTodos(){     return this.$store.getters.doneTodos // -> [{ id: 1, text: 'text1--true', done: true }]    },    doneTodosLength(){     return this.$store.getters.doneTodosLength // -> 1    }  +++ }}</script>

本篇代碼地址: github.com/xioasa/vue-…

總結

以上所述是小編給大家介紹的vuex 漸進式教程實例代碼,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品第二页| 久久99青青精品免费观看| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲精品少妇网址| www.亚洲一二| 久久久欧美一区二区| 亚洲国产欧美一区| 欧美一级电影久久| 91色琪琪电影亚洲精品久久| 美女啪啪无遮挡免费久久网站| 在线免费观看羞羞视频一区二区| 国产成+人+综合+亚洲欧洲| 91wwwcom在线观看| 欧美国产日韩中文字幕在线| 国产精品自在线| xxxx性欧美| 国产精品人成电影在线观看| 成人久久久久久久| 日韩中文字幕网| 91精品国产色综合久久不卡98| 亚洲天堂av女优| 国产精品免费一区| 2019中文字幕免费视频| 国产精品成人在线| 2021久久精品国产99国产精品| 日韩小视频在线| 韩国精品美女www爽爽爽视频| 57pao成人永久免费视频| 色偷偷av一区二区三区| 57pao国产成人免费| 亚洲欧美日本伦理| 亚洲精品久久久久中文字幕二区| 国产精品精品一区二区三区午夜版| 欧美日韩国产精品一区| 日韩欧美亚洲综合| 国产91在线播放| 日韩欧中文字幕| 亚洲一区亚洲二区亚洲三区| 亚洲精品国产综合区久久久久久久| 久久成人精品视频| 在线成人中文字幕| 精品欧美国产一区二区三区| 国产在线精品成人一区二区三区| 91成人福利在线| 亚洲视频精品在线| 欧美三级xxx| 日韩中文第一页| 国产精品一区二区久久| 日韩在线视频导航| 久久久久国产一区二区三区| 亚洲国产成人在线播放| 亚洲色图欧美制服丝袜另类第一页| 欧洲亚洲在线视频| 日韩视频在线免费观看| 精品调教chinesegay| 亚洲aⅴ日韩av电影在线观看| 欧美影院久久久| 欧美日韩成人在线播放| 欧美精品videofree1080p| 热re91久久精品国99热蜜臀| 国产精品免费观看在线| 国产日韩欧美成人| 国产成人精品在线| 中文字幕成人精品久久不卡| 91日韩在线视频| 欧美电影免费观看高清完整| 亚洲电影免费观看高清完整版在线观看| 国产噜噜噜噜噜久久久久久久久| 欧美成人一区二区三区电影| 国产精品日韩电影| 一区二区三区四区精品| 日韩免费高清在线观看| 欧美孕妇孕交黑巨大网站| 日韩av第一页| 成人国产精品久久久| 国产精品中文字幕久久久| 国产精品入口福利| 一区二区三区黄色| 日韩美女视频免费在线观看| 国产日韩精品电影| 全亚洲最色的网站在线观看| 欧美精品制服第一页| 国产精品黄色影片导航在线观看| 中文字幕亚洲无线码a| 亚洲黄色www| 日韩的一区二区| 日韩高清av一区二区三区| 黄色精品在线看| 91在线观看免费网站| 国内精品一区二区三区| 国产视频精品免费播放| 国产日韩欧美一二三区| 2021久久精品国产99国产精品| 亚洲欧美国产一本综合首页| 免费不卡欧美自拍视频| 亚洲第一色在线| 91亚洲精品久久久久久久久久久久| 久久69精品久久久久久国产越南| 欧美成年人视频网站| 国产亚洲欧美另类中文| 国产91露脸中文字幕在线| 97视频国产在线| 性色av一区二区三区免费| 一区二区亚洲欧洲国产日韩| 亚洲国产精品成人一区二区| 欧美另类在线观看| 亚洲精品免费在线视频| 欧美xxxx做受欧美| 欧美最猛黑人xxxx黑人猛叫黄| 在线观看视频亚洲| 亚洲国产精品久久91精品| 国产精品女视频| 亚洲最大的成人网| 亚洲va欧美va在线观看| 97超级碰在线看视频免费在线看| 成人h猎奇视频网站| 国产精品91一区| 中文字幕精品一区久久久久| 亚洲福利视频网站| 国产视频精品va久久久久久| 欧美洲成人男女午夜视频| 欧美黄色性视频| 欧美限制级电影在线观看| 欧美在线视频在线播放完整版免费观看| 亚洲精品视频免费| 国产欧美韩国高清| 国产精品福利观看| 性色av一区二区三区免费| 91av福利视频| 91在线精品播放| 中文字幕在线视频日韩| 97视频在线观看网址| 日韩av不卡在线| 欧美国产日韩一区二区| 中文字幕精品国产| 国内精品伊人久久| 欧美电影《睫毛膏》| 性色av一区二区三区| 亚洲日本aⅴ片在线观看香蕉| 欧洲永久精品大片ww免费漫画| 精品无人区太爽高潮在线播放| 中文字幕久热精品在线视频| 久久中国妇女中文字幕| 欧美激情亚洲自拍| 欧美亚洲另类在线| 成人黄色在线播放| 久久精品免费电影| 亚洲图片在区色| 另类天堂视频在线观看| 亚洲аv电影天堂网| 91久久精品在线| 热99精品只有里视频精品| 亚洲美女www午夜| 国内精品一区二区三区四区| 亚洲欧洲美洲在线综合| 欧美激情视频网站| 日韩激情视频在线播放| 这里只有精品视频在线| 亚洲精品视频在线观看视频| 久久99久国产精品黄毛片入口| 成人激情视频在线播放| 日本中文字幕成人| 中文字幕亚洲一区二区三区五十路| 日韩在线视频线视频免费网站|