Vuex深入解读(适用于Vue2)

Vuex深入解读(适用于Vue2),第1张

Vuex是Vue官方推出的 一个 状态管理工具,其能生成一个单独的全局状态实例,其有以下特点:

注意事项 :版本号在362以下的vuex适用于vue2,若在vue2的工程项目中直接 npm i vuex -s 会报如下的错误

解决办法是指定版本号,vue2使用的版本目前最高支持到362,具体可在 更新记录 中进行查阅。

State相对于vuex来说就好比vue组件中的data,所以声明state必须是 纯粹的对象 (含有零个或多个的 key/value 对) ,在建立后,State数据会被转换为响应式的数据。

首先定义一个store,里面只包含State,然后我们将其注入到全局,下面一次进行以上三种形式的测试

1在vue组件中访问

注:由于不能修改store数据,所以一般不建议在data中访问store的数据,因为它没有缓存效果,一般在计算属性中获取state数据。

mapState 语法糖的主要作用是将store中的state映射到当前vue实例的computed中

在没有 mapState 时,我们获取state一般在computed中进行获取,对于获取多个state数据,那么我们就要写多个computed方法,如下

针对于写多个computed的繁琐和冗余,使用 mapState 可以帮助我们生成 计算属性 。

当映射的计算属性的名称与 state 的数据名称相同时,我们也可以给 mapState 传一个字符串数组。

mapState 返回的是一个对象,如果computed只包括 mapState ,那么直接写

如果你的computed还有其它store之外的属性,那么你需要使用剩余运算符,把mapState返回的对象和其它计算属性对象合并

全局状态管理器,可以在项目的任何一个组件中去获取和修改,修改可以得到全局响应的变量

vue-cli2 项目中安装vuex,使用 npm install vuex --save

安装成功后,在src目录下新建一个store文件,里面创建一个js文件

在js文件中写入:

然后在mainjs文件中引入 store 并注册到 vue 实例中

vuex的文件配置到这里就完成了

现在再回去看store文件里的参数,这几个对象就是vuex五大核心:

State :可全局访问的对象

Getter :和vue的computed一样,用来实时监听state的值的变化(最新状态)

Mutation :存放改变state值的方法(同步)

Action :触发mutations里面的方法(异步)

module :模块

State是存储在Vuex中的数据对象,和Vue实例中的data一样。只不过State是可以全局访问的。

定义stata对象,直接在 state 里面定义 key:val ,它可以定义任意数据类型

在页面中获取state的值 使用 this$storestate

在这里 state 通常都是挂载到 computed 计算属性上,这样当state的值发生改变的时候都能及时的响应。

当然也能用到 watch 去监听

State中的辅助函数 mapState

当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性

输出

Vuex 允许我们在 store 中定义 getter (可以认为是 store 的计算属性)。就像计算属性 computed 一样, getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值( state 中的属性)发生了改变才会被重新计算。

Getter的作用就是用来实时监听state的值的变化

定义Geters对象

使用 state 作为其第一个参数

可以使用其他 getter 函数作为第二个参数

在页面中使用getters,使用 this$storegetters

Getters中的辅助函数 mapGetters

mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性:

输出

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。

使用 state 作为第一个参数

使用 this$storecommit('方法名') 触发mutations中的方法

输出

而第二参数官方解释叫 提交载荷(Payload)

可以向 storecommit 传入额外的参数,即 mutation 的 载荷(payload)

简单来说就是可以在在第二参数里传入额外的参数

这里还是用name来做例子

输出

在 Vuex 中,mutation 必须是同步函数

Action 可以包含任意异步 *** 作,Action的作用就是异步触发Mutations

定义action对象

接收一个 context 参数和一个要变化的形参

context 与 store 实例具有相同的方法和属性,所以他可以执行 contextcommit("") ,也可以使用 contextstate 和 contextgetters 来获取 state 和 getters 。

使用 this$storedispatch("方法名") 方法执行Actions

输出

同样Action还支持载荷方法,传入第二形参

输出

其中 module 的作用是可以把 store 分割成模块(module),每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割:

主要是为了解决由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。

简单来说就是可以把vuex模块化

不会。vuex中watch的使用,在全局路由守卫中想要通过store拿到异步请求的数据是无法拿到的。常见使用vuex,是store模块文件写相关的数据信息。vuex是一个专门为vue,js应用程序开发的状态管理模式,采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

原因是直接执行npmrunbuild,生成一个output目录。

查阅了官网的配置文档,发现appbuildAssetsDir可以改变静态资源的输出路径(默认值也的确是_nuxt),于是将其改成/后再次打包,然而并没有任何变化。在仔细看了两遍文档无果后,只能撸起袖子从代码入手,最后在output/server/chunks/rendermjs里发现。

nuxt-client-init-module为Nuxtjs提供了在客户端初始化时注入处理的能力。就像nuxtServerInit一样,可以在根Vuex模块中实现nuxtClientInit *** 作,该 *** 作仅在客户端渲染时执行。vue-cil项目中通过localstorage或者cookie使vuex的状态持久化,因为vuex刷新后数据会丢失。nuxt项目中created钩子中不存在window对象(localstorage或者cookie的设置需要window对象),比如想要获取登录状态即判断是否存在token时,只能在mounted中进行 *** 作,但这样又会引发一个问题,就是进页面的一瞬间还是无法得知登录状态,体验上会有影响,会存在显示用户名等组件显示隐藏延迟。

        将VueX安装在生产环境依赖中

        npm  install  vuex  --save

     说明:

        1   通过vue实例中的store选项

        2   是为了将store对象挂Vue的原型$store上

        3  这样所有的组件内部就可以使用 this$store 来 *** 作store

             所谓的单一状态树,用一个对象包含应用中全部的状态,这个对象作为唯一数据源而存在。也就是意味着每个应用只包含一个store实例。

             在组件中使用state中的数据

     示例总结:

        1  可以直接修改Vuex中的状态(但不推荐),因为直接修改不利于调试

    1 有的是我们对于store里的state中派生一些状态出来,如:数据的过滤

    2 在获取数据后进行过滤处理,同样的逻辑可能会在不同的地方使用

    3 在Vue中也可以采用计算属性进行处理(计算属性就是会将数据处理进行缓存的)

    4  Vuex提供了一个getter,类似于store中的计算属性,根据依赖状态计算值后返回并缓存起来

    5  只有当getter依赖的状态发生了改变时才会被重新计算

1  Getter的第一个参数为状态state,用于收获Getter的依赖状态

2  Getter的第二个参数

     Getter的第二个参数就是选项Getters,作用是用来获取其他Getter函数

3  通过方法访问

  说明:

     1  通常对于getter的使用方法,都是返回处理完毕后的数据

     2  但是有的时候我们需要处理数据的条件是外部传递过来的,例如示例过滤价格

     3  getter可以返回一个函数,这个函数用来接收外部传递的参数

总结:

    1、getter返回的不是确定的值而是一个函数

     2、那么此时在通过$storegettersfilterFruits获取到的就是一个函数

     3、既然是函数就可以当成方法使用, 传递参数

     4、如 $storegettersfilterFruits(20)

以上就是关于Vuex深入解读(适用于Vue2)全部的内容,包括:Vuex深入解读(适用于Vue2)、Vue笔记(Vuex全局状态管理器)、vue中路由里会去获取vuex中数据吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9433507.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存