1、最常用的核心包含:State、Getter、Mutation、Action

state在上一章已经讲述过了,下面继续来理解后面的几个核心

2、Getter

作用:对vuex中的数据进行过滤或者逻辑处理

  1. import { createStore } from 'vuex'
  2. export default createStore({
  3. // 所有的数据都放在这里
  4. state: {
  5. counter: 0,
  6. },
  7. // 数据过滤
  8. getters: {
  9. getCounter(state) {
  10. return state.counter > 0 ? state.counter : "counter数据异常"
  11. }
  12. },
  13. mutations: {
  14. },
  15. actions: {
  16. },
  17. modules: {
  18. }
  19. })

页面便可进行访问getCounter了

  1. <template>
  2. <h3>关于详情</h3>
  3. <p>读取counter方式1:{{ $store.state.counter }}</p>
  4. <p>读取counter方式2:{{ counter }}</p>
  5. <p>读取getCounter方式1:{{ $store.getters.getCounter }}</p>
  6. <p>读取getCounter方式2:{{ getCounter }}</p>
  7. </template>
  8. <script>
  9. // mapState是vuex所提供的快捷读取方式
  10. import { mapState, mapGetters } from 'vuex'
  11. export default {
  12. name: "AboutInfoView",
  13. // 在computed里存放vuex的数据
  14. computed: {
  15. ...mapState(["counter"]),
  16. ...mapGetters(["getCounter"])
  17. }
  18. }
  19. </script>

3、Mutation

更改store中的状态的唯一方法是提交Mutation进行数据统一修改。

  1. import { createStore } from 'vuex'
  2. export default createStore({
  3. // 所有的数据都放在这里
  4. state: {
  5. counter: 0,
  6. },
  7. // 数据过滤
  8. getters: {
  9. getCounter(state) {
  10. return state.counter > 0 ? state.counter : "counter数据异常"
  11. }
  12. },
  13. // 数据修改
  14. mutations: {
  15. addCounter(state, num) {
  16. state.counter += num;
  17. }
  18. },
  19. actions: {
  20. },
  21. modules: {
  22. }
  23. })
  1. <template>
  2. <h3>关于详情</h3>
  3. <p>读取counter方式1:{{ $store.state.counter }}</p>
  4. <p>读取counter方式2:{{ counter }}</p>
  5. <p>读取getCounter方式1:{{ $store.getters.getCounter }}</p>
  6. <p>读取getCounter方式2:{{ getCounter }}</p>
  7. <button @click="addClick">修改counter</button>
  8. </template>
  9. <script>
  10. // mapState是vuex所提供的快捷读取方式
  11. import { mapState, mapGetters, mapMutations } from 'vuex'
  12. export default {
  13. name: "AboutInfoView",
  14. methods: {
  15. ...mapMutations(["addCounter"]),
  16. addClick() {
  17. // mutations固定的调用方式1
  18. this.$store.commit("addCounter", 10);
  19. // mutations调用方式2
  20. this.addCounter(10);
  21. }
  22. },
  23. // 在computed里存放vuex的数据
  24. computed: {
  25. ...mapState(["counter"]),
  26. ...mapGetters(["getCounter"]),
  27. }
  28. }
  29. </script>

4、Action

Action类似于Mutation,不同在于:

  1. Action提交的是mutation,而不是直接变更状态,
  2. Action可以包含任意的异步操作,所以一般只有异步操作才用Action

安装一下axion进行异步测试:npm install —save axios
修改index.js:

  1. import axios from 'axios';
  2. import { createStore } from 'vuex'
  3. export default createStore({
  4. // 所有的数据都放在这里
  5. state: {
  6. counter: 0,
  7. },
  8. // 数据过滤
  9. getters: {
  10. getCounter(state) {
  11. return state.counter > 0 ? state.counter : "counter数据异常"
  12. }
  13. },
  14. // 数据修改
  15. mutations: {
  16. addCounter(state, num) {
  17. state.counter += num;
  18. }
  19. },
  20. // 为异步数据修改操作所准备的
  21. actions: {
  22. asyncAddCounter({ commit }) {
  23. axios.get("http://iwenwiki.com/api/generator/list.php")
  24. .then(res => {
  25. commit("addCounter", res.data[0]);
  26. })
  27. }
  28. },
  29. modules: {
  30. }
  31. })

修改AboutInfoView.vue页面:

  1. <template>
  2. <h3>关于详情</h3>
  3. <p>读取counter方式1:{{ $store.state.counter }}</p>
  4. <p>读取counter方式2:{{ counter }}</p>
  5. <p>读取getCounter方式1:{{ $store.getters.getCounter }}</p>
  6. <p>读取getCounter方式2:{{ getCounter }}</p>
  7. <button @click="addClick">修改counter</button>
  8. <button @click="asyncAddClick">异步修改counter</button>
  9. </template>
  10. <script>
  11. // mapState是vuex所提供的快捷读取方式
  12. import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'
  13. export default {
  14. name: "AboutInfoView",
  15. methods: {
  16. ...mapMutations(["addCounter"]),
  17. ...mapActions(["asyncAddCounter"]),
  18. addClick() {
  19. // mutations固定的调用方式1
  20. this.$store.commit("addCounter", 10);
  21. // mutations调用方式2
  22. this.addCounter(10);
  23. },
  24. asyncAddClick() {
  25. // actions固定的调用方式1
  26. this.$store.dispatch("asyncAddCounter");
  27. // mutations调用方式2
  28. this.asyncAddCounter();
  29. }
  30. },
  31. // 在computed里存放vuex的数据
  32. computed: {
  33. ...mapState(["counter"]),
  34. ...mapGetters(["getCounter"]),
  35. }
  36. }
  37. </script>

5、查看效果

image.png