vuex的原理方法

Posted Modern world

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vuex的原理方法相关的知识,希望对你有一定的参考价值。

1.vuex图解

image-20210619101246187

总结:

state:管理项目的状态

mutations:修改状态

​ 只能执行同步操作,不能执行异步操作

actions:执行异步操作

​ 执行异步操作之后的结果,不能直接赋值给state,应该交给mutations,再通过mutations将结果交给state

2.获取state三种方式

<template>
    <div>
        <h3>vue-state01</h3>
        <h4>获取state值的方式一:原始值</h4>
        <div>count:{{ $store.state.count }}</div>
        <h4>获取state值的方式二:将state属性定义在计算属性中</h4>
        <div>count:{{ mycount }}</div>
        <h4>获取state值的方式三</h4>
        <div>count:{{ count }}</div>
    </div>
</template>

<script>
import {mapState} from \'vuex\';

export default {

  computed: {
    //第二种方式
    mycount() {
      return this.$store.state.count;
    },
    //第三种方式
    ...mapState([\'count\']),

  },
};

</script>

<style></style>

3.mutations两种方法

<template>
    <div>
        <h3>mutations修改vuex的两种方式</h3>
        <div>{{ count }}</div>
        <h4>第一种方式:原始值的修改</h4>
        <button @click = "addCount">累加2</button>
        <h4>第二种方式:</h4>
        <button @click = "minus"></button>
    </div>
</template>


<script>
import {mapState, mapMutations} from \'vuex\';

export default {
  computed: {...mapState([\'count\'])},

  methods: {
    //导入辅助函数,并且在数组中写上在store的方法名
    ...mapMutations([\'minusCount\']),
    addCount() {
      //以原始值的形式来修改仓库的数值
      this.$store.commit(\'setCount\', 2);
    },
    //以辅助函数mapMutations来修改仓库的值,1.引入辅助函数2.展开辅助函数3.在定义的方法中使用展开的方法
    minus() {
      //辅助函数的形式就不需要写在仓库中定义的方法名,直接输入payload值来修改仓库的值
      this.minusCount(2);
    },
  },
};

</script>

<style>

</style>

4.Ations两种方法

<template>
    <div>
        <h3>actions执行异步的数据最后交给mutations,actions执行异步,两种方式</h3>
        <div>count:{{ count }}</div>
        <h4>第一种方式:原始值</h4>
        <button @click = "minus01">异步1</button>
        <h4>第二种方式:mapActions</h4>
        <button @click = "minus02">异步2</button>
    </div>
</template>


<script>
import {mapState, mapActions} from \'vuex\';

export default {
  computed: {...mapState([\'count\'])},
  methods: {
    //引入mapActions辅助函数,对象名是Action中定义的方法
    ...mapActions([\'async\']),
    //原始值操作actions,通过dispatch
    minus01() {
      this.$store.dispatch(\'async\', 2);
    },
    //mapActions辅助函数操作,直接通过this点出Action中定义的async方法
    minus02() {
      this.async(2);
    },
  },
};

</script>

<style></style>

5.vuex的结构

image-20210619143606513

6.state的派生状态getter

image-20210619155511394

7.vuex四个阶段

image-20210619151320427

image-20210619151325519

image-20210619151329699

getters目的就是为了获取state中比较靠中间的值,所以在定义的时候也会相对比较长,定义getters的方法的时候也是不可避免的一直往下点点然后返回一个值。

使用getters的方法分为两种

​ 1.直接通过原生的 $store.getters.dogname调用getters中的方法,得到返回的值

​ 2.通过导入mapGetters辅助函数从vuex中,然后再计算属性中展开 ...mapGetters([\'dogname\']) 在methods中就可以直接的使用了 this.dogname

​ 换句话说展开的函数最终将getters的方法添加到了vue上,通过this就可以点出方法得到对应的state的数据

image-20210619155511394

两个computed展开是state、getters

两个mothods展开是mutations、actions

8.nameSpaced

分模块等的目的是为了方便管理,但是为了解决主模块调用子组件的mutations/getters/actions,我们添加了namespaced,如果主模块要调用子组件的这三个对象通过以下两种方法

   change1() {
      //原始的方式使用修改子模块的信息
      this.$store.commit(\'user/setUserInfo\');
    },
  
    change2() {
        //调用子模块中的setUserInfo方法,中括号相当于解析变量的名称
      this[\'user/setUserInfo\']();

为了在主模块使用子模块的辅助函数mutations、actions、getters,

1.在commit时通过添加子模块的信息来使用

2.调用子模块中的setUserInfo方法,中括号相当于解析变量的名称

以上是关于vuex的原理方法的主要内容,如果未能解决你的问题,请参考以下文章

Vue原理-vuex

vuex的原理方法

快速理解 VUEX 原理

谈谈VUEX原理

Vue 组件通信方法 — vuex

Vuex实现原理解析