• vuex的使用


    定义

    专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应 用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方 式,且适用于任意组件间通信。

    应用场景

    多个组件应用与同一个状态,多个组件变更同一状态。

    store创建

    定义

    概念:每一个Vuex应用的核心就是Store(仓库),我们可以说Store是一个容器,Store里面的状态与单纯的全局变量是不一样的,无法直接改变Store中的状态。想要改变状态需通过mutation去修改。

    结构

    创建文件夹store与src根目录下,建立index.js。需包含actions,mutations,state结构如下:

    1. // 引入vue
    2. import Vue from 'vue'
    3. // 引入vuex
    4. import Vuex from 'vuex'
    5. // 应用vue插件
    6. Vue.use(Vuex)
    7. // actions响应组件中的动作
    8. const actions = {
    9. }
    10. // mutations操作数据state
    11. const mutations = {
    12. }
    13. // 准备state存储数据
    14. const state = {
    15. //状态对象
    16. }
    17. // 创建store并导出
    18. const store = new Vuex.Store({
    19. actions,
    20. mutations,
    21. state,
    22. })
    23. //默认导出store
    24. export default store

    引入store

    在main.js中引入store,全局组件都可以使用vuex。

    1. import store from './store'
    2. new Vue({
    3. render: h => h(App),
    4. store,
    5. // 安装全局事件总线
    6. beforeCreate(){
    7. Vue.prototype.$bus = this
    8. }
    9. }).$mount('#app')

    状态的核心概念

    state

    state是状态数据,可以通过this.$store.state来直接获取状态,也可以利用vuex提供的mapState辅助函数将state映射到计算属性(computed)中去。

    代码示例:

    1. const state = {
    2. sum:0,
    3. realname:'张三',
    4. age:19
    5. }

    插值引用:{{$store.state.sum}}

    actions

    Action 提交的是 mutation,而不是直接变更状态。Action 可以包含任意异步操作。

    actions响应组件中的动作

    context 上下文,value组件传递过来的值

    可以包含定时器,ajax代码,有业务逻辑使用action,无业务逻辑直接使用mutations

    1. const actions = {
    2. sumwait(context,value){
    3. setTimeout(()=>{
    4. context.commit('JIA',value);
    5. },2000)
    6. }
    7. }

    在组件中使用: $store.dispatch('对应的 action 回调名') 触发。示范:

    this.$store.dispatch('sumwait',1)// 'sumwait' 为action的动作,1为触发的值

     mutations

    更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的事件类型 (type)和一个回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数。

    代码案例:

    1. const mutations = {
    2. JIA(state,value){
    3. state.sum = state.sum+value;
    4. },
    5. JIAN(state,value){
    6. state.sum = state.sum-value;
    7. },
    8. }

    组件中触发:this.$store.commit('JIA',this.num);

    此时的mutations 无业务逻辑,就是更改状态。

    getters

    有时候我们需要从 store 中的 state 中派生出一些状态,例如对列表进行过滤并计数,也就是对状态在加工:

    代码案例:

    1. const getters = {
    2. bigNum(state){
    3. return state.sum*10
    4. }
    5. }

    组件中调用数据:{{$store.getters.bigNum}}

    数据映射(mapState和mapGetters)

    mapState(mapGetters)生成计算属性,从state中读取状态(对象形式)

    案例代码:

    1. computed: {
    2. // mapState生成计算属性,从state中读取状态(对象形式)
    3. // ...mapState({realname:'realname',age:'age'})
    4. //数组形式
    5. ...mapState(['realname','age']),
    6. ...mapGetters(['bigNum'])
    7. },

    当前组件读取:{{realname}}

    数据映射(mapMutations和mapActions)

    借助mapMutations生成对应的方法,方法中会调用commit去联系mutations(对象写法)

    1. methods: {
    2. ...mapMutations({increment:'JIA',decrement:'JIAN'}),//对象形式
    3. // ...mapMutations([‘increment’,’decrement’]),//数组形式,注意store需要有同名的mutations
    4. }

    传值需要: 

    模块化编码(modules)

    Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割在模块中使用:namespaced: true, 命名空间,添加之后,当前模块下的标识符可以和其它模块相同,用于解决不同模块的命名冲突问题

    代码实例:

    1. const countOptions = {
    2. namespaced:true,
    3. state:{
    4. sum:0,
    5. realname:'张三',
    6. age:19,
    7. },
    8. actions:{
    9. sumwait(context,value){
    10. setTimeout(()=>{
    11. context.commit('JIA',value);
    12. },2000)
    13. }
    14. },
    15. mutations:{
    16. JIA(state,value){
    17. state.sum = state.sum+value;
    18. },
    19. JIAN(state,value){
    20. state.sum = state.sum-value;
    21. },
    22. },
    23. getters:{
    24. bigNum(state){
    25. return state.sum*10
    26. }
    27. }
    28. }
    29. const store = new Vuex.Store({
    30. modules:{
    31. countOptions
    32. }
    33. })
    34. 组件调用(加上命名空间):
    35. computed: {
    36. ...mapState('countOptions',['realname','age','sum']),
    37. ...mapGetters('countOptions',['bigNum'])
    38. },
    39. methods: {
    40. ...mapMutations('countOptions',{jia:'JIA',difference:'JIAN'}),
    41. sumwait(){
    42. this.$store.dispatch('countOptions/sumwait',this.num)
    43. }
    44. },

  • 相关阅读:
    手写一个线程池,带你学习ThreadPoolExecutor线程池实现原理
    SpringMVC实现文件的上传(CommonsMultipartResolver和StanderServletMultipartResolver)
    安防监控/视频汇聚/云存储/AI智能视频分析平台EasyCVR显示CPU过载,该如何解决?
    【C++】友元函数 ( 友元函数简介 | 友元函数声明 | 友元函数语法 | 友元函数声明不受访问控制限制 | 友元函数参数要求 )
    计算机毕业设计(附源码)python志愿者活动管理平台
    java---哈希表插入和查询---数组模拟(每日一道算法2022.8.18)
    动态生成表格
    RTSP 和 RTMP原理 & 通过ffmpeg实现将本地摄像头推流到RTSP服务器
    走好数据中台最后一公里,为什么说数据服务API是数据中台的标配?
    React-Hooks详解
  • 原文地址:https://blog.csdn.net/m0_59359854/article/details/126384478