Vuex学习笔记

算法部
• 阅读 1530

Vuex

为Vue.js应用程序开发的状态管理模式

解决的问题

由 多个组件共享状态 引起的

1. 多个视图依赖于统一状态
2.  不同视图的行为需要变更统一状态

Vuex学习笔记

Store

每个应用只包含一个Store实例
  1. Vuex 的状态存储是响应式的。store 中的state状态更新立即触发组件更新
  2. 不能直接修改state。

    • 两种方式:

      • 可以通过 this.$store.state.变量 = xxx; 进行修改
      • 显式地提交 (commit) mutation

        • this.$store.dispatch(actionType, payload) => mapActions 使用action进行更改,异步
        • this.$store.commit(commitType, payload) => mapMutations 使用mutation进行更改,同步
      • 可以通过 this.$store.state.变量 = xxx; 进行修改
    • strict模式使用第一种方法vue会throw error : [vuex] Do not mutate vuex store state outside mutation handlers。
    • 异同点

      • 共同点:都能触发视图更新(响应式修改)
      • 不同点:

        • strict模式下,使用第一种方法vue会throw error : [vuex] Do not mutate vuex store state outside mutation handlers。
    • 使用commit的优点:

      • vuex能够记录每一次state的变化记录,保存状态快照,实现时间漫游/回滚之类的操作。

核心概念

State 单一状态树

  • 全局的应用层级状态 -- 唯一数据源
  • 通过this.$store.state可以访问
  • mapState 辅助函数:帮助在组件中引入state相关属性,作为组件的计算属性

Getter state派生状态

可以认为是 store的计算属性 : getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算
getters: {
    // 可以通过第二个参数getters来使用其他getter
    getterA: (state, getters) => {
        return getters.getterB.length
    },
    getterB: (state) => {
        return state.todoList;
    },
    getterC: (state) => (id) => {
        return state.todoList[id];
    }
}
  • 通过属性访问:this.$store.getters.getterA

    • getter作为Vue的响应式系统的一部分缓存其中
  • 通过方法访问:this.$store.getters.getterC(1)

    • 每次都会去进行调用,而不会缓存结果
  • mapGetters: 将getters数据映射到局部(组件)计算属性

Mutation 类似于事件 同步事务

用来更改Vuex的store中的状态

每个mutation包含

  • 事件类型(type)
  • 回调函数 (handler): 进行状态更改的地方,接收state作为第一个参数

    • 通过store.commit方法 调用mutation handler
    • (state, payload)=> {}
    • payload: 向store.commit传入的额外的参数

需遵守Vue的响应规则

  1. store中初始化所有所需属性
  2. 添加新属性用 Vue.set(obj, 'newProp', 123); 或者 state.obj = { ...state.obj, newProp: 123}

Mutation必须是同步函数

devtools 不知道什么时候回调函数实际上被调用:在回调函数中进行的状态的改变都是不可追踪的

Action 异步事务

类似Mutation,不同在于:

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

Action函数接收与store实例具有相同方法和属性的context对象

actions: {
    // 常见用法,用es6的参数解构来简化代码
    actionA({state, commit, getters, dispatch}) {
    }
}

// 使用action
store.dispatch('actionA').then(() => {
})

Module 模块

解决的问题:应用复杂时(有很多的状态和逻辑),store对象会很臃肿

每个模块拥有自己的state、getter、mutation、action、嵌套子模块module

命名空间

  • 默认注册在全局命名空间,通过设置namespaced:true 可以使其成为带命名空间的模块(局部化
  • 带命名空间的模块内访问全局内容:

    • state & getters

      getters: {
          // 局部化后
          getterA: (state, getters, rootState, rootGetters) => {
          }
      }
      actions: {
          actionA: ({dispatch, commit, getters, rootGetters, state, rootState}) => {
          }
      }
    • action & mutation: 第三参数设为{root: true}
        action: () => {
            dispatch('actionA', null, { root:true });
            committ('mutationA', null, { root:true });
        }
  • 在带命名空间的模块内注册全局action

        actions: {
            actionA: {
                root: true,
                handler(namespacedContext, payload) { ... }
            }
        }

模块动态注册: store.registerModule('moduleName', {})

- Vue插件可以在store中附加新模块,从而使用vuex来管理状态。例如:vuex-router-sync

模块卸载:store.unregisterModule(moduleName)

保留state: store.registerModule('a', module, { preserveState: true })

模块重用:

const MyReusableModule = {
  state () {
    return {
      foo: 'bar'
    }
  },
  // mutation, action 和 getter 等等...
}

插件

在插件中不允许直接修改状态——类似于组件,只能通过提交 mutation 来触发变化。
const myPlugin = store => {
 // 当 store 初始化后调用
  store.subscribe((mutation, state) => {
    // 每次 mutation 之后调用
    // mutation 的格式为 { type, payload }
  })
}
const store = new Vuex.Store({
 // ...
  plugins: [myPlugin]
})

严格模式

开启严格模式,仅需在创建 store 的时候传入 strict: true

const store = new Vuex.Store({
  // ...
  strict: true
})

在严格模式下,无论何时发生了状态变更且不是由 mutation 函数引起的,将会抛出错误。这能保证所有的状态变更都能被调试工具跟踪到

不要在发布环境下启用严格模式: 严格模式会深度监测状态树来检测不合规的状态变更,会有性能损失

表单处理

严格模式下,不要用v-model绑定state数据
** 这样会不使用mutation对state数据进行更改

两种方法

  • v-model绑定value,监听value变化然后在事件回调中使用mutation去修改state数据
  • 双向绑定的计算属性

    computed: {
      message: {
        get () {
          return this.$store.state.obj.message
        },
        set (value) {
          this.$store.commit('updateMessage', value)
        }
      }
    }

测试

热重载

点赞
收藏
评论区
推荐文章
观察者模式在spring中的应用
作者:王子源1观察者模式简介1.1定义指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布订阅模式、模型视图模式,它是对象行为型模式。
Chase620 Chase620
4年前
vue: 解决vuex页面刷新数据丢失问题
一、问题描述1、一般在登录成功的时候需要把用户信息,菜单信息放置vuex中,作为全局的共享数据。但是在页面刷新的时候vuex里的数据会重新初始化,导致数据丢失。因为vuex里的数据是保存在运行内存中的,当页面刷新时,页面会重新加载vue实例,vuex里面的数据就会被清空。2、我在一个组件(例如登录组件页面)中登录了后,其它页面要怎
Chase620 Chase620
4年前
Vue方向:Vuex状态管理: 辅助函数mapState与mapGetters
1、mapState和mapGetters的作用   mapState用于将state中的数据映射到组件的计算属性中,而mapGetters用于将getter中的计算属性映射到组件的计算属性中,之前获取Vuex数据都是通过$store找到state对象,再去state中去拿数据,操作getter,muta
Dax Dax
4年前
veux的使用
1)说说什么是vuex(下定义)2)vuex解决了哪些问题,为什么要用(必要性)3)怎么使用vuex(使用方法)4)描述vuex原理,提升答案深度(深层原理升华答案)vuex的流程图分析:我们可以看到图中虚线框包裹起来的部分就是vuex的三个组成部分(Action,Mutations,state),我们来简单的捋一下整个流程:首先vue的组件在响应用户行为交
Souleigh ✨ Souleigh ✨
5年前
Vuex 4 正式发布:打包现在与 Vue 3 一致
Vuex是一个专门为Vue.js应用程序开发的状态管理模式。Vuex采用集中式存储管理应用的所有组件组件的状态。换句话说,Vuex就是帮开发者存储多个组件共享的数据,方便开发者对其读取的更改的工具。Vuex4正式版本现已发布。Vuex4的改进重点是兼容性。Vuex4支持Vue3,并提供了与Vuex3完全相同的
九路 九路
5年前
通过一个简单实例了解vuex
简单说明什么是vuex,vuex怎么使用,什么场景下适合使用vuex,vuex文档(https://links.jianshu.com/go?tohttps%3A%2F%2Fvuex.vuejs.org%2Fzh%2F)中都有介绍。看完文档之后,都知道vuex的核心有State、Getter、Mutation、Action、Modul
可莉 可莉
4年前
了解Vuex状态管理模式
1Vuex是什么呢?它是Vue的状态管理模式,在使用vue的时候,需要在vue中各个组件之间传递值是很痛苦的,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被改变,所有引用该值的地方就会自动更新。是不是很方便,很好用呢?vuex是专门为vue.js设计的状态管理模式,集中式存储和管理应用程序中所有组件的状态,vuex也集成了vue的
Chase620 Chase620
4年前
Vue方向:Vuex状态管理:Action异步函数
1、Action的使用        Action类似于mutation,不同之处在于Action提交的是mutation,而不是直接更改状态,Action可以包含任何的异步操作。2、定义以及使用Action代码3、分发Action代码代码action4、Action函数参数
徐小夕 徐小夕
5年前
vue高级进阶系列——用typescript玩转vue和vuex
       用过vue的朋友大概对vuex也不陌生,vuex的官方解释是专为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。说的简单点就是对vue的状态进行统一管理,如下图介绍了其管理模式:im
海军 海军
4年前
2021前端技术面试必备Vue:(四)Vuex状态管理
前三章陆续已经更新了Vue基本使用和VueRouter的基本使用,如果你读了前三篇文章的话,并且掌握差不多,那么你现在可以开发简单的应用了,例如Blog,电商网站........唯一不足的是,随着你的业务需求不断增加,页面中的状态数据也不断庞大,维护起来就特别困难了,Vue提供了一种状态管理解决办法Vuex,它的思想和React的R
Wesley13 Wesley13
4年前
22. 状态模式
在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的context对象。介绍意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。何时使用:代码中包含大量与对象状态有关的条件语句
算法部
算法部
Lv1
时间像奔腾澎湃的急湍,它一去无还,毫不留恋。
文章
4
粉丝
0
获赞
0