1、为什么要用vuex
在vue组件通信的过程中,我们通信的目的往往就是在组件之间传递数据或组件的状态(这里将数据和状态统称为状态),进而更改状态。但可以看到如果我们通过最基本的方式来
进行通信,一旦需要管理的状态多了,代码就会变得十分混乱。对所有状态的管理便会显得力不从心,尤其是多人合作的时候。此时vuex出现了,他就是帮助我们把公用的状态全抽出来放
在vuex的容器中,然后根据一定的规则来进行管理。
2、概念
3、基本使用
cnpm i vuex --save
import store from ‘./store‘ new Vue({ router, i18n, store, el: ‘#app‘, render: h => h(App) })
import Vue from ‘vue‘ import Vuex from ‘vuex‘ import state from ‘./state‘ import actions from ‘./actions‘ import mutations from ‘./mutations‘ Vue.use(Vuex) export default new Vuex.Store({ state, actions, mutations })
export default { count: 1, }
export default { // 改变状态的执行者 用于同步更改状态 stateMutationsAdd(state, payLoad) { // 第一个参数是state 第二个参数是调用mutations时传入的参数 state.count += payLoad; }, stateMutationsReduce(state, payLoad) { state.count -= payLoad; } }
export default { // actions并不直接更改状态 而是发起mutations来更改状态 stateAsyncReduce(context) { // context 是一个与 store 实例具有相同方法和属性的 context 对象 // 这个异步操作 我们可以发送http请求、定时器、 setTimeout(() => { context.commit("stateMutationsReduce", 5)//不能用this.$store,为undefined }, 1000) } }
<template> <div class="home"> <div class="block"> <h1>vuex的基本使用</h1> <el-button size="mini" type="primary" @click="reduceNumber">-</el-button> {{count}} <el-button size="mini" type="primary" @click="addNumber">+</el-button> <h1>vuex练习结束</h1> </div> </div> </template> <script> export default { name: "home", data() { return {}; }, computed: { count() { return this.$store.state.count; } }, methods: { /** * [addNumber 对count数据进行增加操作 采用同步方式] * @return {[type]} [description] */ addNumber() { // 第一个参数是同步方法的名称 第二个参数是传递给方法的数据 this.$store.commit("stateMutationsAdd", 10); }, /** * [reduceNumber 对count数据进行减少操作 采用异步方式] * @return {[type]} [description] */ reduceNumber() { // dispatch返回的是actions执行的结果,是一个promise对象,如果异步操作之后还需要其他操作,可以使用.then/.catch等 this.$store.dispatch("stateAsyncReduce"); } }, mounted() {} }; </script>
点击 + 进行同步增加
点击-进行异步减少,每隔1s减少5
export default { count: 1, }
export const STATE_MUTATIONS_ADD = ‘stateMutationsAdd‘ export const STATE_MUTATIONS_REDUCE = ‘stateMutationsReduce‘
import { STATE_MUTATIONS_ADD, STATE_MUTATIONS_REDUCE } from ‘./mutation-types‘ export default { // 改变状态的执行者 用于同步更改状态 [STATE_MUTATIONS_ADD](state, payLoad) { // 第一个参数是state 第二个参数是调用mutations时传入的参数 state.count += payLoad; }, [STATE_MUTATIONS_REDUCE](state, payLoad) { state.count -= payLoad; } }
import { STATE_MUTATIONS_ADD, STATE_MUTATIONS_REDUCE } from ‘./mutation-types‘ export default { // actions并不直接更改状态 而是发起mutations来更改状态 stateAsyncReduce(context) { // context 是一个与 store 实例具有相同方法和属性的 context 对象 // 这个异步操作 我们可以发送http请求、定时器、 setTimeout(() => { context.commit(STATE_MUTATIONS_REDUCE, 5)//不能用this.$store,为undefined }, 1000) } }
<template> <div class="home"> <div class="block"> <h1>vuex的基本使用</h1> <el-button size="mini" type="primary" @click="reduceNumber">-</el-button> {{count}} <el-button size="mini" type="primary" @click="addNumber">+</el-button> <h1>vuex练习结束</h1> </div> </div> </template> <script> import { STATE_MUTATIONS_ADD, STATE_MUTATIONS_REDUCE } from "../store/mutation-types"; export default { name: "home", data() { return {}; }, computed: { count() { return this.$store.state.count; } }, methods: { /** * [addNumber 对count数据进行增加操作 采用同步方式] * @return {[type]} [description] */ addNumber() { // 第一个参数是同步方法的名称 第二个参数是传递给方法的数据 this.$store.commit(STATE_MUTATIONS_ADD, 10); }, /** * [reduceNumber 对count数据进行减少操作 采用异步方式] * @return {[type]} [description] */ reduceNumber() { // dispatch返回的是actions执行的结果,是一个promise对象,如果异步操作之后还需要其他操作,可以使用.then/.catch等 this.$store.dispatch("stateAsyncReduce"); } }, mounted() {} }; </script>
4、遇到的问题
原文:https://www.cnblogs.com/wxh0929/p/11984417.html