当前位置:   article > 正文

Vuex的理解和应用

getters sate => state.

1.Vuex概念

  • Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。
  • 通俗的讲,Vue组件中有各种data变量,它就是一个状态,当应用程序足够庞大时,如果将这些状态集中管理就会非常方便,于是Vuex便应运而生。

2. Vuex五大核心

  • State(必须)
    • State是Vuex中唯一的数据源。在Vuex中定义,可以全局使用,一般在computed计算属性中获取,在页面中渲染。
    • 定义:
    1. // store.js
    2. store: {
    3. count: 2
    4. }
    • 获取
    1. // 方法1:正常获取
    2. computed: {
    3. count () {
    4. return this.$store.state.count;
    5. }
    6. }
    7. // 方法2: mapState辅助函数
    8. import { mapState } from 'vuex'
    9. computed: mapSate({
    10. count: state=>state.count// 箭头函数
    11. count: 'count', // 字符串传参
    12. count (state) { // 使用常规函数
    13. return state.count;
    14. }
    15. })
    16. computed: mapState(['count']) // 也可以传递字符串数组
    17. // 方法3:mapState对象展开式
    18. import { mapState } from 'vuex'
    19. computed: {
    20. ...mapState({
    21. count: 'count'
    22. })
    23. }
  • Mutations(必须)
    • 更改Store中状态的唯一方法是提交Mutaion。
    • 定义:
    1. mutations: {
    2. increment (state, n) {
    3. state.count += n;
    4. }
    5. }
    • 提交
    1. // 方法一:直接提交
    2. this.$store.commit('increment', 10);
    3. // 方法二:使用mapState引入
    4. import { mapMutations } from 'vuex'
    5. methods: {
    6. ...mapMutations([
    7. 'increment', 'add'
    8. ])
    9. }
    10. ...mapMutations({
    11. 'add': 'increment' // 将 `this.add()` 映射为 `this.$store.commit('increment')`
    12. })
  • Getters(非必须)
    • 通过Getters可以派生出新的状态。
    • 通俗的讲,Getters和State在Vuex中扮演着类似的功能,都是状态的集合。假如某一个状态本身被很多组件使用,但是有的地方又要改变这个数据的形式,这是就要使用Getters,比如购物车中的数量(当大于100时显示99+)。Getters在组件中的获取方式和State相同。
    • 定义:
    1. getters: {
    2. doneTodos: state=>{
    3. return state.todos.filter(todo => todo.done)
    4. }
    5. }
    • 获取:
    1. // 方法一:同Sate类似
    2. return this.$store.getters.doneTodosCount
    3. // 方法二:同Sate类似
    4. import { mapGetters } from 'vuex'
    5. computed: {
    6. ...mapGetters(['doneTodosCount', 'anotherGetter'])
    7. }
  • Actions(非必须)
    • Action提交的是Mutation,而不是直接变更状态,Action可以包含任意异步操作。
    • 定义:
    1. // 方式一
    2. actions: {
    3. add (context) {
    4. context.commit('increment');
    5. }
    6. }
    7. // 方式二
    8. actions: {
    9. add ({commit}) {
    10. commit('increment');
    11. }
    12. }
    • 分发
    1. // 方式一:直接分发
    2. this.$store.dispatch('add');
    3. // 方式二:在组件中分发
    4. import { mapActions } from 'vuex'
    5. methods: {
    6. ...mapActions(['add', 'other']),
    7. ...mapActions({
    8. add: 'increment' // 将 `this.add()` 映射为 `this.$store.dispatch('increment')`
    9. })
    10. }
  • Modules(非必须)
    • 当应用变得非常复杂时,store 对象就有可能变得相当臃肿。为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块都有自己的State、Getters、Mutations、Actions。
    • 定义
    1. const moduleA = {
    2. state: { ... },
    3. mutations: { ... },
    4. actions: { ... },
    5. getters: { ... }
    6. }
    7. const moduleB = {
    8. state: { ... },
    9. mutations: { ... },
    10. actions: { ... }
    11. }
    12. const store = new Vuex.Store({
    13. modules: {
    14. a: moduleA,
    15. b: moduleB
    16. }
    17. })
    18. store.state.a // -> moduleA 的状态
    19. store.state.b // -> moduleB 的状态

3.功能和应用

  • Vue分析结构图

输入图片说明

  • 项目结构图

输入图片说明

4.优势和缺点

  • 优势
    • 集中管理很多状态
  • 缺点
    • 如果项目不大,代码会不容易理解,造成结构混乱。

5.应用场景区分

  • 如果项目是列表等静态数据较多的小应用,那就用不到状态管理。
  • 如果有少量几个状态需要管理的中型应用,可以尝试使用eventBus,这样更简洁。
  • 如果有几个以上的状态需要随时修改和改变状态,比如购物车数量、登录状态等,可以使用Vuex,这样会更方便。

转载于:https://my.oschina.net/chinahufei/blog/1630972

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/257002
推荐阅读
相关标签
  

闽ICP备14008679号