Vuex最详细教学

作者: 扶得一人醉如苏沐晨 | 来源:发表于2022-06-02 07:41 被阅读0次


    一、Vuex单界面到多界面状态管理切换:

    1.安装配置vuex,版本依赖

    vue2的项目使用vuex3,vue3的项目使用vuex4

    npm install vuex --save  这个指令默认安装Vuex4
    npm install vuex@3    @代表安装指定版本的Vuex3

    2.创建 store/index.js 文件

    3.main.js 中引入 store/index.js

    二、Vuex-devtools安装应用

    在Chrome安装devtools插件打开项目之后:可以看到和实时监控state的数据

    三、Vuex的基本使用

    Vuex的响应式原理:

    Vuex的store中的state是响应式的,当state中的数据发生改变时, Vue组件会自动更新.

    这就要求我们必须遵守一些Vuex对应的规则:

    提前在store中初始化好所需的属性.

    当给state中的对象添加新属性时,使用下面的方式:

    ➢方式一: 使用Vue.set(obj, ‘newProp’, 123)

    ➢方式二:用新对象给旧对象重新赋值

    Vuex实现了一个单向数据流,在全局拥有一个State存放数据,所有修改State的操作必须通过Mutation进行,Mutation的同时提供了订阅者模式供外部插件调用获取State数据的更新。所有异步接口需要走Action,常见于调用后端接口异步获取更新数据,而Action也是无法直接修改State的,还是需要通过Mutation来修改State的数据。最后,根据State的变化,渲染到视图上。Vuex运行依赖Vue内部数据

    1、$store.state

    通过这个方式,能直接使用state里的数据。

    点击按钮发现,我们无法更改$store.state.counter

    2、mutations

    要想修改state的数据必须通过mutations

    三、Vuex核心概念

    Vuex有几个比较核心的概念:

    State

    Getters

    Mutation

    Action

    Module

    1、state

    Vuex 使用单一状态树——是的,用一个对象就包含了全部的应用层级状态。至此它便作为一个“唯一数据源 (SSOT)”而存在。这也意味着,每个应用将仅仅包含一个 store 实例。

    单一状态树能够让我们最直接的方式找到某个状态的片段,而且在之后的维护和调试过程中,也可以非常方便的管理和维护,存储在 Vuex 中的数据和 Vue 实例中的 data 遵循相同的规则。

    2、vuex-getters的使用:

    其实可以当成组件共享的计算属性

    例:写一个对象数组,找出里面age>20的对象

    1)普通写法:这种写法只能在需要的每个组件里都写上这个计算属性

    2)写在getters里面 每个组件都可以直接使用:

     其他组件也可以获取到



    在getters的方法里也可以将getters作为参数,调用getters里的其他方法:

    3、Mutation状态更新:

    state里的数据改变只能通过Mutation!(上面已经解释,这里不做赘述)

    我们来看Mutation中方法参数传递:

    mutation的提交风格:

    之前的commit只是一种普通的提交风格Vue还提供了另外一种风格,它是一个包含type属性的对象

    双向绑定机制,需要new一个Vue对象来实现“响应式化”,所以Vuex是一个专门为Vue.js设计的状态管理库。

    vue-mutations的类型常量定义步骤

    可以在store里加一个js文件:

    6、vuex-actions的使用:

    mutation里的所有代码都不能有异步操作:

    如果有异步操作,就用actions来替代Mutations

    但是actions也不能直接修改state里的数据,

    如果有一个异步操作需要修改state里的数据,那么正确的方法应该是:index.js:


    commit是提交mutatious的同步操作,

    dispatch是分发actions的异步操作

    dispatch:含有异步操作,例如向后台提交数据,写法: this.$store.dispatch(‘action方法名’,值)

    点击触发方法,通过dispatch("aUpdateInfo")来触发actions里面的方法 aUpdateInfo ,方法内通过commit来触发mutation里面的方法,更新state里面的数据

    context后面也可以接一个传递参数payload:

    但是通常携带的信息不只一个的时候怎么办呢:可以将payload作为一个对象:

    更简洁优雅的写法:Promise:

    7、vuex-modules的使用:

    Vue使用单-状态树,那么也意味着很多状态都会交给Vuex来管理.当应用变得非常复杂时,store对象就有可能变得相当臃肿,为了解决这个问题,Vuex允许我们将store分割成模块(Module),而每个模块拥有自己的state. mutations、actions, getters等

    1)modules的state:

    这里只能用$store.state.a.name而不是modules.a

    因为在Devtools里可以看到 a会自动变成state的一个对象:


    2)modules的mutation:

    3)modules的getters:

    论是定义在store里的getters还是定义在modules里的getters 调用的方法都相同:

    我们都知道getters里的方法可以将本身getters作为参数来调用里面的其他函数:

    而且,在modules中的getters还可以将store里的state作为参数:

    4)modules的actions:

    和store几乎一样,只不过调用方式不一样罢了

    相关文章

      网友评论

        本文标题:Vuex最详细教学

        本文链接:https://www.haomeiwen.com/subject/xkvxmrtx.html