vuex状态管理
状态管理bus
//通过在lib 创建bus.js,作为一个bus状态管理模块 import Vue from 'vue' const Bus = new Vue() export default Bus
//a.vue <template> <div> <button @click="handleClick">按我</button> </div> </template> <script> export default { methods:{ handleClick(){ this.$bus.$emit('on-click','hello') } }, mounted(){ console.log(this.$bus); } } </script>
//b.vue <template> <div class="tel"> {{message}} </div> </template> <script> export default { data(){ return { message:'' } }, mounted(){ this.$bus.$on('on-click',mes=>{ this.message = mes }) } } </script>
通过store 集中管理
- actions:异步操作处理 接口数据
- mutations:修改值
- state: 修改后值
- modules:存储特定模块的参数
入口 /index.js
import Vue from 'vue' import Vuex from 'vuex' import state from './state' import mutations from './mutations' import actions from './actions' import getters from './getters' import user from './module/user' Vue.use(Vuex) export default new Vuex.Store({ state, getters, mutations, actions, modules:{ user } })
actions
import { getAppName } from '@/api/app.js'
const actions = {
/* updateAppName({commit}){
//方法
// const commit = paramsObj.commit
getAppName().then(res=>{// 模拟异步操作
const { code, info:{appName}} = res
commit('SET_APP_NAME',appName)
console.log(res);
// commit('SET_APP_NAME',res.info.appName)
}).catch(err=>{
console.log(err);
})
} */
async updateAppName({commit}){
try{
const {info:{appName}} = await getAppName();
commit('SET_APP_NAME',appName)
}
catch(err){
console.log(err);
}
}
}
export default actions
mutations
import vue from 'vue' const mutations = { SET_APP_NAME(state,params){ // params 载赫,参数 state.appName = params }, SET_APP_VERSION(state){ vue.set(state,'appVersion','V10.0') } } export default mutations
state
const state ={ appName:'admin' } export default state
modules / user
在store内,可创建储存独立模块参数user,放至modules文件中
const state ={ userName:'tommy' } const getters ={ firstLetter: (state) =>{ return state.userName.substr(0,1) } } const mutations = { SET_USER_NAME(state,params){ state.userName =params } } const actions = { updateUserName({commit,state,rootState,dispatch}){ //提交mutations state 指代当前实例 rootstate 根state // rootState.appName //dispatch('xxx','') }, /* xxx(){ } */ } export default { namespaced:true, //只限于当前模块 getters, state , mutations, actions }
页面组件模块 store.vue
<template>
<div>
<!-- <a-input @input="inputValue" :value="inputValue"/> -->
<a-input @input="handleInput"/>
<!-- <a-input v-model="inputValue"/> -->
<p>{{inputValue}} inputValueLastLetter is {{inputValueLastLetter}}</p>
<p>{{inputValue}}</p>
<p>userName:{{userName}}</p>
<p>appName:{{appName}}</p>
<p>appNameWithVersion:{{appNameWithVersion}}</p>
<p>firstLetter:{{firstLetter}}</p>
<button @click="handleChangeAppName">修改appName</button>
<!-- <a-show :content="inputValue"/> -->
<p>{{appVersion}}</p>
<button @click="changeUserName">修改用户名</button>
<button @click="asyncChangeAppName">异步修改appName</button>
</div>
</template>
<script>
import AInput from '../components/AInput.vue'
import AShow from '../components/AShow.vue'
import { mapState ,mapGetters ,mapMutations ,mapActions} from 'vuex'
export default {
data(){
return {
inputValue:''
}
},
components:{
AInput,
AShow
},
methods:{
handleInput(val){
this.inputValue = val
},
/* handleChangeAppName(){
this.$store.commit('SET_APP_NAME',this.inputValue),
this.$store.commit('SET_APP_VERSION')
} */
...mapMutations('user',[
'SET_USER_NAME'
]),
...mapMutations([
'SET_APP_NAME',
]),
handleChangeAppName(){
this.SET_APP_NAME(this.inputValue);
},
changeUserName(){
this.SET_USER_NAME('vue-version')
},
...mapActions([
'updateAppName'
]),
asyncChangeAppName(){
this.updateAppName()
// this.$store.dispatch('updateAppName','123')
}
},
computed:{
/* ...mapState({
userName:state=>state.user.userName,
appName:state=>state.appName
}), */
/* ...mapState('user',{
userName:state => state.userName
}), */
appName(){
return this.$store.state.appName
},
/* appName:{
set:function(newValue){
this.inputValue = newValue +'....set'
},
get:function(){
return this.inputValue +'...get'
}
} */
userName(){
return this.$store.state.user.userName
},
...mapGetters('user',[
'firstLetter'
]),
/* firstLetter(){
return this.userName.substr(0,1)
}, */
...mapGetters([
'appNameWithVersion',
]),
...mapState({
appVersion:state=>state.appVersion
}),
/* appNameWithVersion(){
return this.$store.getters.appNameWithVersion
}, */
inputValueLastLetter(){
return this.inputValue.substr(-1,1)
}
}
}
</script>
初期定义store内的state,视图会渲染;后期定义响应,store内的state,需定义set、get才会渲染
因此需要在mutations中set、get所需修改的state

浙公网安备 33010602011771号