一、状态管理(vuex)简介
vuex是专为vue.js应用程序开发的状态管理模式。它采用集中存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。vuex也集成刀vue的官方调试工具devtools extension,提供了诸如零配置的time-travel调试、状态快照导入导出等高级调试功能。
二、状态管理核心
状态管理有5个核心,分别是state、getter、mutation、action以及module。分别简单的介绍一下它们:
-
1、state
state为单一状态树,在state中需要定义我们所需要管理的数组、对象、字符串等等,只有在这里定义了,在vue.js的组件中才能获取你定义的这个对象的状态。
-
2、getter
getter有点类似vue.js的计算属性,当我们需要从store的state中派生出一些状态,那么我们就需要使用getter,getter会接收state作为第一个参数,而且getter的返回值会根据它的依赖被缓存起来,只有getter中的依赖值(state中的某个需要派生状态的值)发生改变的时候才会被重新计算。
如果不需要缓存的话,需要写成方法 -
3、mutation
更改store中state状态的唯一方法就是提交mutation,就很类似事件。每个mutation都有一个字符串类型的事件类型和一个回调函数,我们需要改变state的值就要在回调函数中改变。我们要执行这个回调函数,那么我们需要执行一个相应的调用方法:store.commit。
-
4、action
action可以提交mutation,在action中可以执行store.commit,而且action中可以有任何的异步操作。在页面中如果我们要嗲用这个action,则需要执行store.dispatch
-
5、module
module其实只是解决了当state中很复杂臃肿的时候,module可以将store分割成模块,每个模块中拥有自己的state、mutation、action和getter。
三、实例
首先建立一个vue.js项目,然后引入vuex
npm install vuex --save
而后建立一个 store 文件夹,建立一个 index.js。 在index.js中引入 vue
和 vuex
在有需要的时候可以引入 axios。
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {
userList: [1, 2, 3, 4]
}
const getters = {
getUrlParams: () => () => {
let url = location.search;
let theRequest = {};
if (url.indexOf("?") != -1) {
var str = url.substr(1), strs;
strs = str.split("&");
for (var i = 0; i < strs.length; i++) {
theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
}
}
return theRequest;
},
getUserList: (state) => {
//注:这里会缓存,只有执行了 actions,这里的缓存才会更新
return state.userList;
}
}
const mutations = {
setUserList(state, data){
// 如果这里的 userList 接口返回,可以用axios请求
state.userList=data;
}
}
const actions = {
commitUserList:({commit}, userList) => commit('setUserList',userList)
}
const store = new Vuex.Store({
state: state,
getters: getters,
mutations: mutations,
actions: actions
})
export default store;
这样一个简单的 store 就已经完成了。
在界面中我们要怎么使用这个建立的状态管理呢:
- 首先在main.js 引入 store:
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store'
//实例化 vue
new Vue({
el: '#app',
store,
router,
components: { App },
template: '<App/>'
})
- 然后在
components
目录 新建组件index.vue
, 组件里面就可以如下写:
<template>
<ul>
<li v-for="(user, index) in userList">{{index}} --- {{user}}</li>
</ul>
<div @click="updateUserList()">更新用户列表</div>
</template>
<script>
export default {
name: "index",
data() {
return{
userList: this.$store.getters.getUserList;//引入state中的对象
}
},
methods:{
updateUserList () {
var item=['a':'b','c':'d'];
this.$store.dispatch('setUserList', item);
}
}
}
</script>
- router 里面设置访问地址
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router);
export default new Router({
mode: 'history', //目前使用 history 模式
routes: [
{
path: '/',
name: 'index',
component: resolve => require.ensure([], () => resolve(require('@/components/index.vue')), 'index')
}
]
})
相关文章