vuex安装及使用

vuex官网文档:点我进入

作用

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,为了解决兄弟组件或者多层组件传值问题,任何组件都可以直接访问vuex上的数据或方法。

安装

npm install vuex -S

引入

import Vue from "vue";
//引入vuex
import Vuex from "vuex";
import App from "./App.vue";
import router from "./router";
// 使用vuex
Vue.use(Vuex)

//创建vuex实例
let store = new Vuex.Store({
  state: {
    count: 0
  }
})
// 阻止显示生产模式的消息
Vue.config.productionTip = false;

new Vue({
  router,
  store, //在根实例中注册store 子组件能通过 this.$store访问
  render: h => h(App)
}).$mount("#app");

使用

Vuex 使用单一状态树(用一个对象就包含了全部的应用层级状态)。至此它便作为一个“唯一数据源 ”而存在。这也意味着,每个应用将仅仅包含一个 store 实例。

核心概念

  • State 状态 相当于data数据
  • Getter 获得者 相当于computed计算属性
  • Mutation 变化 相当于method方法 写同步方法 主要是操作data中的数据
  • Action 行动 写异步方法 Module 译模块 大型项目时所有数据都写在一个文件里代码量臃肿 不利于维护 所以可将其分成多个模块

state

Vuex 的状态存储是响应式的,从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态

//count.vue
<template>
  <div>
    计数结果为{{count}}
  </div>
</template>

<script>
export default {
  name: "Count",
  data() {
    return {};
  },
  computed: {
    count() {
      return this.$store.state.count;
    },
  },
};
</script>

mapState

当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性

创建vuex实例

let store = new Vuex.Store({
  state: {
    count: 0,
    age: 18,
    name: '孙悟空',
  },
})

使用

<template>
  <div>
    计数结果为{{count}} <br>
    年龄: {{age}}<br>
    {{name}}
  </div>
</template>

<script>
import { mapState } from "vuex";

export default {
  name: "Count",
  data() {
    return {
      str: "姓名:",
    };
  },
  computed: mapState({
    age: "age", //第一种写法
    count: (state) => state.count, //第二种
    name: function (state) {  //第三种 this指向vue实例
      return this.str + state.name;
    },
  }),
};
</script>

其中,第二种和第三种本质是一样的,只不过第二种使用了箭头函数 在使用中 要注意this的指向问题

…mapState

与局部计算属性混合使用

 computed: {
    ...mapState(["age", "count", "name"]),
    message() {
      return "组件自己定义的计算属性";
    },
  },

getter

Mutation

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation,mutation中的函数必须是同步的。

创建

//main.js
let store = new Vuex.Store({
  state: {
    count: 0,
    age: 18,
    name: '孙悟空',
  },
  mutations: {
    changeCount(state, payload) {
      let { n } = payload
      state.count += n
    }
  }
})

使用

  methods: {
    addCount() {
      this.$store.commit("changeCount", { n: 10 });
    },
    cutCount() {
      this.$store.commit("changeCount", { n: -10 });
    },
  },

使用常量替代 Mutation 事件类型

//main.js
import { CHANGECOUNT } from "./store/vuex"

  mutations: {
    [CHANGECOUNT](state, payload) {
      let { n } = payload
      state.count += n
    }
  }
//vuex.js
export const CHANGECOUNT = 'CHANGECOUNT'
//引入并使用
import { CHANGECOUNT } from "../store/vuex";

…mapMutations

<template>
  <div class="home">
    <Count />
    <button @click="CHANGECOUNT({n:5})">增加</button>
    <button @click="CHANGECOUNT({n:-5})">减少</button>
  </div>
</template>

<script>
import Count from "../components/Count";
import { CHANGECOUNT } from "../store/vuex";
import { mapMutations } from "vuex";

export default {
  name: "Home",
  components: { Count },
  data() {
    return {};
  },
  methods: {
    ...mapMutations([CHANGECOUNT]),
  },
};
</script>

action

action类似于mutation,提交的是mutation,action里可以包含异步操作。

//创建vuex实例
let store = new Vuex.Store({
  state: {
    count: 0,
    age: 18,
    name: '孙悟空',
  },
  mutations: {
    [CHANGECOUNT](state, payload) {
      let { n } = payload
      state.count += n
    }
  },
  actions: {
    increment({ commit }, payload) {
      setTimeout(() => {
        commit(CHANGECOUNT, payload)
      }, 2000)
    }
  }
})

使用

changeCount() {
      this.$store.dispatch("increment", { n: 4 });
    },
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值