Vuex中五个属性以及使用方法详解
作者:摆烂的胡萝卜
Vuex介绍
vuex是专门为Vue.js应用程序开发的状态管理模式。它采用集中式存储,管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
state 数据存贮
getter state的计算属性
mutation 更改state中状态的逻辑 同步操作
action 提交mutation 异步操作
model 模块化
state基本数据,存储变量
使用方法:
可以通过this.$store.state 获得Vuex的state,如下:
// src/store/index const store = new Vuex.Store({ state: { number:66 } }) const app = new Vue({ //.. store, computed: { count: function(){ return this.$store.state.number } }, // this.$store.state.number }) // 每当 store.state.number 发生变化, 都会重新求取计算属性,并且触发更新相关联的 DOM。
mapState辅助函数
// 在需要使用的文件里 import { mapState } from 'vuex' export default { // ... methods:{ ...mapState({ myNumber: 'number' }), } }
mutations
提交mutation是更改Vuex中的store中的状态的唯一方法。
mutation必须是同步的,如果要异步需要使用action。
每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数,提交载荷作为第二个参数。(提交荷载在大多数情况下应该是一个对象),提交荷载也可以省略的。
const store = new Vuex.Store({ state: { number: 1 }, mutations: { //无提交载荷 Submit(state) { state.number++ } //提交载荷 SubmitN(state, payload) { state.number += payload.num } } })
使用方法;
你不能直接调用一个 mutation handler。这个选项更像是事件注册:“当触发一个类型为 Submit 的 mutation 时,调用此函数。”要唤醒一个 mutation handler,你需要以相应的 type 调用 store.commit 方法:
//无提交载荷 this.$store.commit('Submit') //提交载荷 this.$store.commit('SubmitN', { num: 66 })
mapMutations 辅助函数
与其他辅助函数类似,你可以在组件中使用 this.$store.commit(‘xxx’) 提交 mutation,或者使用 mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用。
// 在需要使用的文件里 import { mapMutations } from 'vuex' export default { methods:{ ...mapMutations({ mySubmit: 'Submit', mySubmitN: 'SubmitN'}), }
actions
Action 类似于 mutation,不同在于:
Action 提交的是 mutation,而不是直接变更状态。
Action 可以包含任意异步操作。
const store = new Vuex.Store({ state: { number: 0 }, mutations: { submit (state) { state.number++ } }, actions: { submit (context) { setInterval(function(){ context.commit('submit') }, 1000) } } })
注意:Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。
使用方法:
分发actions,即Action 通过 store.dispatch 方法触发:
this.$store.dispatch('increment')
mapActions辅助函数
你在组件中使用 this.$store.dispatch('xxx') 分发 action,或者使用 mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用
import { mapActions } from 'vuex' export default { //.. methods: { ...mapActions([ 'submit' ]), ...mapActions({ add: 'submit' }) } }
Modules
使用单一状态树,导致应用的所有状态集中到一个很大的对象。但是,当应用变得很大时,store 对象会变得臃肿不堪。
为了解决以上问题,Vuex 允许我们将 store 分割到模块(module)。每个模块拥有自己的 state、mutation、action、getters、甚至是嵌套子模块——从上至下进行类似的分割:
import Vue from 'vue' import Vuex from 'vuex' import getters from './getters' import app from './modules/app' import settings from './modules/settings' import user from './modules/user' Vue.use(Vuex) const store = new Vuex.Store({ modules: { app, settings, user }, getters }) export default store
使用模块化的state,mutations,action,需在使用方法前加模块名
如:
this.$store.state.user.number
this.$store.commit(‘user/xxx’)
this.$store.dispatch(‘user/xxx’)
getters
import Vue from 'vue' import Vuex from 'vuex' import getters from './getters' Vue.use(Vuex) const store = new Vuex.Store({ getters }) export default store
const getters = { sidebar: state => state.app.sidebar, device: state => state.app.device, token: state => state.user.token, username: state => state.user.username, empno: state => state.user.empno } export default getters
使用:this.$store.grtters.sidber , this.$store.grtters.device ,以此类推
mapGetters
import { mapGetters } from 'vuex' // mapGetters的作用:把getters映射为计算属性 computed: { ...mapGetters(['getPartList']), // ...mapGetters({ // calcList: 'getPartList' // }), // calcList () { // // 注意:获取getters的值,不需要加括号(当属性使用) // return this.$store.getters.getPartList // }, }
总结
到此这篇关于Vuex中五个属性以及使用方法详解的文章就介绍到这了,更多相关Vuex五大属性及使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!