Vuex 使用分享
核心使用部分
- state 狀態、資料
- mutations 行為
- actions 動作 (此處不做討論,因為沒有涉及到非同步操作)
- getters 基於資料的一些返回值
CODE
定義(建立)
謹記一句話:不要為了使用狀態管理工具(Redux、Vuex、Mobx、Flux...)而用狀態管理工具!
這裡我的Team Leader給我舉了一個例子:Google郵箱的未讀數。
在很多地方都要用到,需要全域性維護一份,這樣有利於保持資料的統一性,不至於在某個地方讀了一封郵件之後將未讀數減一後,還要通知別處,全域性引用一個值,就不會存在這個問題,狀態管理工具就是實現這一點的
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
//定義User類
class User {
constructor(info){
this.info = info;
}
}
//定義資料
const state = {
users:[]
}
//定義行為
const mutations = {
addUser(state,info){
state.users.push(new User(info));
},
updateUser(state,id,toUpdate){
const {users} = state;
const length = users.length;
for(const i = 0;i<length;i++){
let u = users[i];
if(u.id === id){
users[i] = {u,...toUpdate};
break;
}
}
},
removeUser(state,id){
const {users} = state;
const index = users.findIndex(v=>v.id===id);
users.splice(index,1);
},
findUser(state,id){
return state.users.find(v=>v.id===id);
}
}
//定義getters
const getters = {
userCount:state=>state.users.length,
//其實getUser也可以定義在此處,如下
curUser:state=>id=>state.users.find(v=>v.id===id)
}
//定義資料倉儲 - store
const store = new Vuex.store({
state,
mutations,
getters
});
export default store;
複製程式碼
好的基礎是成功的一半!
繫結 & 使用
<-----------------------------------以下為繫結------------------------------>
import Vue from 'vue';
import store from './store';
window.$vm = new Vue({
el:"#app",
store,//在入口檔案處,將store掛在Vue例項上,可以全域性使用
});
<-----------------------------------以下為使用------------------------------>
<template>
<div>
<input
type="text"
placeholder="please input user's infomation..."
v-model="info"/>
<button @click="addUser">AddUser</button>
<ul>
<li v-for="u in $store.state.users">{{u.info}}</li>
</ul>
<div>
<span>current user information:</span>
<span>{{curUser.info}}</span>
</div>
</div>
</template>
<script>
export default {
name:"App",
data(){
return {
info:"",
curUser:{info:""}
}
},
methods:{
addUser(){
$vm.$store.commit("addUser",this.info);
},
//remove、update、find 大同小異,就不一一列舉
// 值得一體的是 find 既可以使用 mutations 獲得,也可以通過getters 得到
findUser(id){
this.curUser = $vm.$store.commit("findUser",id);
// or
this.curUser = $vm.$store.getters.curUser(id);
}
}
}
</script>
複製程式碼
結語
作為入門級別,需要持續啃文件……
(程式碼就是直接在掘金編輯器內手敲的一些臨時組織的程式碼,僅為了展示、會議和記錄自己的使用方式和過程,並不一定能執行,想要測試的朋友,最好還是在自己的IDE內搭建專案實現功能最好。)