<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在 Vue 中實現集中式狀態(資料)管理的一個 Vue 外掛,對 vue 應用中多個元件的共用狀態進行集中式的管理(讀寫),也是一種元件間通訊的方式,且適用於任意元件間通訊
新建 Count.vue 元件,並在 App.vue 中註冊參照
<template> <div> <Count/> </div> </template> <script> import Count from "@/components/Count"; export default { name: 'App', components: {Count}, } </script> <style> </style>
我們主要關注 Count.vue
<template> <div class="category"> <h1>當前求和為:{{ sum }}</h1> <select v-model="n"> <!--這裡的value前有冒號,否則value值是字串--> <option :value="1">1</option> <option :value="2">2</option> <option :value="3">3</option> </select> <!--v-model.number收集到的資料強轉為number--> <!-- <select v-model.number="n"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> </select>--> <button @click="increment">+</button> <button @click="decrement">-</button> <button @click="incrementOdd">當前和為奇數再加</button> <button @click="incrementWait">等一等再加</button> </div> </template> <script> export default { name: "Count", data() { return { n: 1,//使用者選擇的數位 sum: 0,//當前和 } }, methods: { increment() { this.sum += this.n }, decrement() { this.sum -= this.n }, incrementOdd() { if (this.sum % 2) { this.sum += this.n } }, incrementWait() { setTimeout(() => { this.sum += this.n }, 500) } } } </script> <style scoped> select, button { margin-right: 5px; } </style>
注意:
vue2 中要使用 vuex 的 3 版本
vue3 中要使用 vuex 的 4 版本
因為我們使用的是 vue2 所以我們需要安裝 vuex 的 3 版本
index.js
//該檔案用於建立vuex中最為核心的store //引入vuex import Vuex from 'vuex' //引入vue import Vue from "vue"; //應用vuex外掛 Vue.use(Vuex) //準備actions;用於相應元件中的動作 const actions = {} //準備mutations;用於運算元據(state) const mutations = {} //準備state;用於儲存資料 const state = {} //建立並暴露store export default new Vuex.Store({ actions:actions, mutations,//key和value重名了,簡寫 state,//key和value重名了,簡寫 });
3、main.js 中引入剛才寫好的 store
...... //引入store //import store from './store/index' import store from './store' ...... //建立vm new Vue({ el: "#app", //store:store store,//觸發簡寫形式 ...... })
執行專案,我們可以列印 vm 和 vc,可以看到 $store
我們將求和的案例改為 vuex 版本
1、首先把資料交給 state
所以我們把 Count 元件中的資料 sum 變數剪下走放到 index.js 中的 state 中,同時 Count 元件中的方法,例如加法 increment 中使用 this.$store.dispatch("方法名",變數) 來替代原來的方法。這樣就走完了流程圖中以下部分
Count.vue
<template> <div class="category"> <h1>當前求和為:{{$store.state.sum}}</h1> ...... </div> </template> <script> export default { name: "Count", data() { return { n: 1,//使用者選擇的數位 } }, methods: { increment() { this.$store.dispatch("jia",this.n); } ...... } } </script>
同時 index.js 中的 action 中新增對應的方法名,從圖上的流程圖來看,actions 中的東西會交到 mutations 中處理,所以需要手動呼叫 commit方法
mutation 中也需要增加同樣的方法名,這裡可以都改成大寫,做個區分。方法中第一個引數就是 state,方法中處理真實邏輯即可
index.js
//該檔案用於建立vuex中最為核心的store //引入vuex import Vuex from 'vuex' //引入vue import Vue from "vue"; //應用vuex外掛 Vue.use(Vuex) //準備actions;用於相應元件中的動作 const actions = { /*jia:function () { }*/ //簡寫為: jia(context,value){ console.log("actions中的jia被呼叫了",context,value); context.commit("JIA",value) } } //準備mutations;用於運算元據(state) const mutations = { JIA(state,value){ console.log("mutations中的JIA被呼叫了",state,value); state.sum += value; } } //準備state;用於儲存資料 const state = { sum: 0,//當前和 } //建立並暴露store export default new Vuex.Store({ actions:actions, mutations,//key和value重名了,簡寫 state,//key和value重名了,簡寫 });
log 輸出:
執行程式:
我們根據以上思路完善其他方法
Count.vue
<template> <div class="category"> <h1>當前求和為:{{$store.state.sum}}</h1> <select v-model="n"> <!--這裡的value前有冒號,否則value值是字串--> <option :value="1">1</option> <option :value="2">2</option> <option :value="3">3</option> </select> <button @click="increment">+</button> <button @click="decrement">-</button> <button @click="incrementOdd">當前和為奇數再加</button> <button @click="incrementWait">等一等再加</button> </div> </template> <script> export default { name: "Count", data() { return { n: 1,//使用者選擇的數位 } }, methods: { increment() { this.$store.dispatch("jia",this.n); }, decrement() { this.$store.commit("JIAN",this.n); }, incrementOdd() { this.$store.dispatch("jiaOdd",this.n); }, incrementWait() { this.$store.dispatch("jiaWait",this.n); } } } </script> <style scoped> select, button { margin-right: 5px; } </style>
index.js
//該檔案用於建立vuex中最為核心的store //引入vuex import Vuex from 'vuex' //引入vue import Vue from "vue"; //應用vuex外掛 Vue.use(Vuex) //準備actions;用於相應元件中的動作 const actions = { /*jia:function () { }*/ //簡寫為: jia(context,value){ console.log("actions中的jia被呼叫了"); context.commit("JIA",value) }, jiaOdd(context,value){ console.log("actions中的jianOdd被呼叫了"); if(context.state.sum % 2){ context.commit("JIA",value) } }, jiaWait(context,value){ console.log("actions中的jianWait被呼叫了"); setTimeout(() => { context.commit("JIA",value) }, 500) } } //準備mutations;用於運算元據(state) const mutations = { JIA(state,value){ console.log("mutations中的JIA被呼叫了",state,value); state.sum += value; }, JIAN(state,value){ console.log("mutations中的JIAN被呼叫了",state,value); state.sum -= value; } } //準備state;用於儲存資料 const state = { sum: 0,//當前和 } //建立並暴露store export default new Vuex.Store({ actions:actions, mutations,//key和value重名了,簡寫 state,//key和value重名了,簡寫 });
到此為止,功能就實現了,你發現了嗎,這裡做了些優化,由於 index.js 中的 jia、jian方法裡邊什麼都沒做,直接就 commit 給了 mutation,而 vc 是可以直接對話 Mutations 的,如下圖:
所以我們把 index.js 中 actions 中的 jian方法去掉,在 Count 中直接呼叫 mutation 中的方法,也就是我們把 jian方法去掉,在 Count 的 decrement 方法中直接呼叫 commit 了
decrement() { this.$store.commit("JIAN",this.n); },
若沒有網路請求或其他業務邏輯,元件中也可以越過 actions,即不寫 dispatch,直接編寫 commit
index.js 中的上下文有什麼作用?我們可以列印下 context:
可以看到其中有dispatch、commit、state這些熟悉的身影。我們用 jiaOdd 舉例,當方法邏輯處理複雜時,可以繼續 dispatch 其他方法來分擔。而有了 state 我們可以拿到其中的 sum 值:
jiaOdd(context,value){ console.log("actions中的jianOdd被呼叫了",context); if(context.state.sum % 2){ context.commit("JIA",value) } context.dispatch("demo",value) }, demo() { //處理一些事情 },
到此這篇關於Vue Vuex搭建vuex環境及vuex求和案例分享的文章就介紹到這了,更多相關Vue Vuex 搭建內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45