Vuex

131 阅读2分钟

Vuex是什么?


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

Vuex的工作原理


Snipaste_2022-08-20_17-05-44.png

  • Vue Compoments:vue组件。展示页面。负责接收用户的行为交互。
  • dispatch:用户操作行为触发的方法。是唯一可以执行actions的方法。
  • actions:进行用户操作的处理,可包含同步或异步任务。
  • commit:状态改变提交操作的方法。是唯一可以执行mutations的方法。
  • mutations:状态改变的方法。是vuex提供的修改state的唯一方法。该方法只能同步进行,且里包含的方法名全局唯一。
  • state: vuex状态管理的数据容器对象。提供唯一的公共数据源。所有需要共享的数据都需要放在state中,并且它们是唯一的。

Vuex的核心概念


1. State

提供唯一的公共数据源。所有需要共享的数据都需要放在state中

//创建store数据源,提供唯一公共数据
const store = new Vuex.Store({
    state: { count: 0 }
})

组件访问state中数据的第一种方式

this.$store.state.全局数据名称

组件访问state中数据的第二种方式

//1. 从Vuex中按需导入mapState函数
//2. 通过mapState函数将当前组件所需要的全局数据映射为当前组件的computed计算属性:
import { mapState } from 'vuex'
computed: {
    ...mapState(['count'])
}

2. Mutation

用于改变Store中的数据

  1. 只能通过Mutation来修改store中的数据。
  2. 通过这种方法虽然操作起来比较繁琐,但是可以集中管理所有数据的变化。
//定义Mutation
const store = new Vuex.Store({
    state: {
        count: 0
    },
    mutation: {
        方法名(state,其他参数...){
            //改变state.count状态
        }//参数列表中的第一个参数state为固定形参,可通过state得到所有的公共数据。
    }
})

组件触发Mutation的第一种方式

this.$store.commit('方法名',其他参数)

组件触发Mutation的第二种方式

//1. 从vuex中按需导入mapState函数
//2. 通过mapMutations函数将当前组件所需要的全局方法映射为当前组件的methods方法:
import { mapMutations } from 'vuex'
methods: {
    ...mapMutations(['方法名'])
}

3. Action

用于处理异步任务,如果通过异步操作变更数据则必须通过Action,而不能使用Mutation,但在Action中还是要通过触发Mutation的方式间接的变更数据

//定义Action
const store = new Vuex.Store({
    state: {
        count: 0
    },
    mutation: {
        方法名1(state,其他参数...){
        
        }
    },
    cations: {
        方法名2(context,其他参数...){
            setTimeout(()=>{
                context.commit('方法名1',其他参数...)  //调用Mutation中的方法,间接修改数据
                ////参数列表中的第一个参数context为固定形参,可通过context得到mutation中的所有方法
            },2000)
        }
    }
})

组件触发Action的第一种方式

this.$store.dispatch('方法名',其他参数...)

组件触发Action的第二种方式

//1. 从vuex中按需导入mapActions函数
//2. 通过mapActions函数将当前组件所需要的全局方法映射为当前组件的methods方法:
import { mapActions } from 'vuex'
methods: {
    ...mapActions(['方法名'])
}

4. Getter

用于对Store加工处理形成新的数据

  • 不会修改Store中的原数据。只起到一个包装器的作用。
  • 可以对Store中的已有数据进行加工形成新的数据,类似于vue的计算属性。
  • 当Store中的数据发生变化时,Getter中的数据也会跟着变化。
//定义Getter
const store = new Vuex.Store({
    state: {
        count: 0
    },
    getters: {
        方法名(state) {
            return '当前的count值为' + state.count
        }
    }
})

组件触发Getter的第一种方式

this.$store.getters.方法名

组件触发Getter的第二种方式

//1. 从vuex中按需导入mapGetters函数
//2. 通过mapGetters函数将当前组件所需要的全局方法映射为当前组件的computed计算属性:
import { mapGetters } from 'vuex'
computed: {
    ...mapGetters(['方法名'])
}