【踩坑记录】Vuex中更改state的数据但是Vue中没有做出改变

简介: 【踩坑记录】Vuex中更改state的数据但是Vue中没有做出改变

今天在做Vue开发的时候遇到了个很奇怪的现象:改变了Vuex中的state的数据,但是页面没有做出改变。

首先放出代码:

Vuex:

import {
createStore} from'vuex';
/** * 用户构造函数 * @param {*} name 用户名 */functionUser(name) {
this.name=name;
/**   * 修改用户名   * @param {String} changedName 修改后用户名   */this.changeName= (changedName) => {
this.name=changedName;
  }
}
exportdefaultcreateStore({
state: {
user: newUser('swsk33')
  },
mutations: {
change(state) {
state.user.changeName('swsk');
console.log(state.user.name);
    }
  },
actions: {
change(context) {
context.commit('change');
    }
  },
});

Vue组件:

<template><divid="app"><div>{{ user.name }}</div><div@click="change">更改</div></div></template><script>import { mapState, mapActions } from'vuex';
exportdefault {
computed: {
...mapState(['user']),
  },
methods: {
...mapActions(['change']),
  },
};
</script>

可见,在Vuex中,方便起见我定义了个构造函数,用于创建用户对象。可以看到,用户对象中有一个changeName函数可以更改自己的用户名,这个函数相当于可以更改自己的值。

然后在state中初始化一个用户对象,并定义好mutationsactions函数以测试更改,注意mutations中方法是使用用户对象自己的方法修改用户名,而不是直接赋值。

最后,vue组件中,映射Vuex中的userchange函数进行测试。理论上,我点击更改时,显示的用户名会变,然而点击后并没有变。

点击后网页:

网络异常,图片无法展示
|

网页上内容并没有变。

但是在控制台中输出这个state中的user,实质上已经改变了:

网络异常,图片无法展示
|

我们知道,state中的数据也是响应式的,而更改其数据的唯一方法就是mutations

但是可见,上述修改数据的形式并不同于平时,没有在mutations进行直接赋值,而是使用对象自己的方法修改自己。

这就是问题所在:mutations中的函数没有进行一个直接的更改对象的操作,而是间接地调用对象自己的方法修改对象自己。

这样,数据确实修改了,但是可以理解为:并非是mutations进行修改的。

这种情况下,mutations没有直接修改数据,就导致Vue中无法侦测到数据变化做出响应。

解决办法很简单,不要在构造函数中定义修改对象自己属性的方法,而是使用mutations修改即可。

我们修改上述Vuex如下:

import {
createStore} from'vuex';
/** * 用户构造函数 * @param {*} name 用户名 */functionUser(name) {
this.name=name;
}
exportdefaultcreateStore({
state: {
user: newUser('swsk33')
  },
mutations: {
changeName(state) {
// 进行直接修改操作state.user.name='swsk';
    }
  },
actions: {
change(context) {
context.commit('changeName');
    }
  },
});

所以,使用Vuex时,一定要牢记官方文档的这一句话:更改Vuex的store中的状态的唯一方法是提交mutation。

任何修改数据的操作应当放在mutations中,而非别的函数里面。

相关文章
|
5天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发
|
5天前
|
存储 JavaScript
Vue 状态管理工具vuex
Vue 状态管理工具vuex
|
8天前
|
JavaScript 数据管理 Java
在 Vue 3 中使用 Proxy 实现数据双向绑定的性能如何?
【10月更文挑战第23天】Vue 3中使用Proxy实现数据双向绑定在多个方面都带来了性能的提升,从更高效的响应式追踪、更好的初始化性能、对数组操作的优化到更优的内存管理等,使得Vue 3在处理复杂的应用场景和大量数据时能够更加高效和稳定地运行。
28 1
|
8天前
|
JavaScript 开发者
在 Vue 3 中使用 Proxy 实现数据的双向绑定
【10月更文挑战第23天】Vue 3利用 `Proxy` 实现了数据的双向绑定,无论是使用内置的指令如 `v-model`,还是通过自定义事件或自定义指令,都能够方便地实现数据与视图之间的双向交互,满足不同场景下的开发需求。
28 1
|
11天前
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
10天前
|
JavaScript
如何在 Vue 中使用具名插槽
【10月更文挑战第25天】通过使用具名插槽,你可以更好地组织和定制组件的模板结构,使组件更具灵活性和可复用性。同时,具名插槽也有助于提高代码的可读性和可维护性。
15 2
|
10天前
|
JavaScript
Vue 中的插槽
【10月更文挑战第25天】插槽的使用可以大大提高组件的复用性和灵活性,使你能够根据具体需求在组件中插入不同的内容,同时保持组件的结构和样式的一致性。
13 2
|
10天前
|
前端开发 JavaScript 容器
在 vite+vue 中使用@originjs/vite-plugin-federation 模块联邦
【10月更文挑战第25天】模块联邦是一种强大的技术,它允许将不同的微前端模块组合在一起,形成一个统一的应用。在 vite+vue 项目中,使用@originjs/vite-plugin-federation 模块联邦可以实现高效的模块共享和组合。通过本文的介绍,相信你已经了解了如何在 vite+vue 项目中使用@originjs/vite-plugin-federation 模块联邦,包括安装、配置和使用等方面。在实际开发中,你可以根据自己的需求和项目的特点,灵活地使用模块联邦,提高项目的可维护性和扩展性。
|
11天前
|
缓存 JavaScript UED
Vue 中异步加载模块的方式
【10月更文挑战第23天】这些异步加载模块的方式各有特点和适用场景,可以根据项目的需求和架构选择合适的方法来实现模块的异步加载,以提高应用的性能和用户体验
|
JavaScript
Vue02 state与mapState
Vue02 state与mapState
下一篇
无影云桌面