vuex的使用

90 阅读1分钟

Vuex 是什么?

借用vuex官网的话来说:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

什么情况下我应该使用 Vuex?

如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。一个简单的 store 模式就足够您所需了。但是,如果您需要构建一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。引用 Redux 的作者 Dan Abramov 的话说就是:

安装

npm

npm install vuex@next --save

Yarn

yarn add vuex@next --save

vue2 中的使用

import Vuex from 'vuex'
Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

mapState 辅助函数

<template>
  <div class="vuex-one">
    <div>{{ userInfo.name }}</div>
    <div>{{ count }}</div>
  </div>
</template>


<script>
import { mapState } from "vuex";
//引入mapState辅助函数
export default {
  // computed:mapState(['userInfo'])
  computed: {
    count(){
        return 22222
    },
    ...mapState({
      userInfo: (state) => state.userInfo,
      //在computed中使用mapState将vuex中存储的数据调用过来 可以在页面中执行
    }),
  },
};
</script>

mapGetters 辅助函数

getters: {
  userNameChange(state) {
  //定义方法 ,参数是vuex中的数据
    return state.userInfo.name + '小朋友'
    //将vuex中对应的数据修改并返回出去
  },
  // 调用的时候传参
  userNickname: (state) => (type) => {
    return `${state.userInfo.nickname}-${type}`
  }
},

组件定义

computed:{
  ...mapGetters(["userNameChange", "userNickname"])
 通过mapGetters将方法从对应的模块调用过来
}

mapMutations

定义同步方法

mutations: {
  changeMyName(state, val) {
  接收两个参数一个是vuex中的state,另一个是接受用户传递的数据
    state.userInfo.name = val;
  }
},

调用mutations里面的方法

<template>
  <div class="vuex-one">
    <div>{{ userInfo.name }}</div>
    <div>{{ count }}</div>
    <div>{{ userNameChange }}</div>
    <div>{{ userNickname("人名") }}</div>
    <button @click="changName">修改名字</button>
  </div>
</template>


<script>
import { mapState, mapGetters, mapMutations } from "vuex";
//引入辅助函数
export default {
  // computed:mapState(['userInfo'])
  computed: {
    count() {
      return 22222;
    },
    ...mapState({
    //将vuex中的数据调用过来
      userInfo: (state) => state.userInfo,
    }),
    ...mapGetters(["userNameChange", "userNickname"]),
  },
  methods: {
    changName() {
      // 二选一 第一种是辅助函数,第二种是直接调用。
      this.changeMyName("修改名");
      //调用vuex方法修改数据
      this.$store.commit('changeMyName',"修改名")
     
    },
    ...mapMutations([
      "changeMyName", // 将 `this.increment()` 映射为 `this.$store.commit('increment')`
    ]),
  },
};
</script>

mapActions

定义

actions: {

    zchangeMyNameAct(context, val) {
    //定义异步方法 接收两个参数 第一个是传入同步的方法,第二个是修改的值
      setTimeout(() => {
        context.commit('changeMyName', val)
      }, 1000)
    }
  },

组件调用

<script>
import { mapState, mapGetters, mapMutations, mapActions } from "vuex";
引入辅助函数
export default {
  // computed:mapState(['userInfo'])
  computed: {
    count() {
      return 22222;
    },
    ...mapState({
      userInfo: (state) => state.userInfo,
    }),
    ...mapGetters(["userNameChange", "userNickname"]),
  },
  methods: {
    changName() {
      this.changeMyNameAct("修改名");
      //调用异步方法 接收参数 到vuex中修改数据
    },
    ...mapMutations([
      "changeMyName", // 将 `this.increment()` 映射为 `this.$store.commit('increment')`
    ]),
    ...mapActions(["changeMyNameAct"]),
    //注册异步方法
  },
};
</script>