• 状态管理库-vuex


    vuex介绍


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

    state

    存储在 Vuex 中的数据和 Vue 实例中的 data 遵循相同的规则,以下代码会进行展示state具体使用

    getter

    作为state派生的属性

    computed: {
      doneTodosCount () {
        return this.$store.state.todos.filter(todo => todo.done).length
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果有多个组件需要用到此属性,我们要么复制这个函数,或者抽取到一个共享函数然后在多处导入它——无论哪种方式都不是很理想。

    这时就可以使用getter

    1.Getter 接受 state 作为其第一个参数:
    
    const store = new Vuex.Store({
      state: {
        todos: [
          { id: 1, text: '...', done: true },
          { id: 2, text: '...', done: false }
        ]
      },
      getters: {
        doneTodos: state => {
          return state.todos.filter(todo => todo.done)
        }
      }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    访问方式

    store.getters.doneTodos // -> [{ id: 1, text: '...', done: true }]
    
    • 1

    2.Getter 也可以接受其他 getter 作为第二个参数:

    getters: {
      // ...
      doneTodosCount: (state, getters) => {
        return getters.doneTodos.length
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    访问方式

    store.getters.doneTodosCount // -> 1
    
    • 1

    注:在组件中使用

    computed: {
      doneTodosCount () {
        return this.$store.getters.doneTodosCount
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    mutation

    更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。

    改变count的状态

    const store = new Vuex.Store({
      state: {
        count: 1
      },
      mutations: {
        increment (state) {
          // 变更状态
          state.count++
        }
      }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    跟getter调用方式不同

    store.commit('increment')
    
    • 1
    // mutation-types.js
    export const SOME_MUTATION = 'SOME_MUTATION'
    
    • 1
    • 2
    // store.js
    import Vuex from 'vuex'
    import { SOME_MUTATION } from './mutation-types'
    
    const store = new Vuex.Store({
      state: { ... },
      mutations: {
        // 我们可以使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名
        [SOME_MUTATION] (state) {
          // mutate state
        }
      }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    使用常量替代 mutation 事件类型在各种 Flux 实现中是很常见的模式。这样可以使 linter 之类的工具发挥作用,同时把这些常量放在单独的文件中可以让你的代码合作者对整个 app 包含的 mutation 一目了然:组件中提交 Mutation,在 Vuex 中,mutation 都是同步事务
    你可以在组件中使用 this.$store.commit(‘xxx’) 提交 mutation,或者使用 mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用(需要在根节点注入 store)。

    import { mapMutations } from 'vuex'
    
    export default {
      // ...
      methods: {
        ...mapMutations([
          'increment', // 将 `this.increment()` 映射为 `this.$store.commit('increment')`
    
          // `mapMutations` 也支持载荷:
          'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.commit('incrementBy', amount)`
        ]),
        ...mapMutations({
          add: 'increment' // 将 `this.add()` 映射为 `this.$store.commit('increment')`
        })
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    action

    Action 类似于 mutation,不同在于:

    • Action 提交的是 mutation,而不是直接变更状态。
    • Action 可以包含任意异步操作。
    const store = createStore({
      state: {
        count: 0
      },
      mutations: {
        increment (state) {
          state.count++
        }
      },
      actions: {
        increment (context) {
          context.commit('increment')
        }
      }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    Action 通过 store.dispatch 方法触发:

    store.dispatch('increment')
    
    • 1
  • 相关阅读:
    java基于springboot+vue学生考勤签到请假管理系统84y43
    三对角矩阵原理及C++实现
    【日拱一卒行而不辍20220930】自制操作系统
    Matlab时间序列趋势分析与预测技术
    【SpringBoot】静态资源的访问
    MySQL日志管理、备份与恢复
    NodeMCU ESP8266 外设的 Arduino API 接口介绍
    ArkTS初始用体验
    心累了那就学学Git吧
    三维重建-第三方库介绍
  • 原文地址:https://blog.csdn.net/xiao_zhu_ting_feng/article/details/126033300