【踩坑记录】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中,而非别的函数里面。

相关文章
|
7天前
|
JavaScript 算法 Linux
【vue报错】error:0308010C:digital envelope routines::unsupported
【vue报错】error:0308010C:digital envelope routines::unsupported
34 3
|
2天前
|
JavaScript 测试技术
vue不同环境打包环境变量处理
vue不同环境打包环境变量处理
13 0
|
2天前
|
JavaScript
vue中高精度小数问题(加减乘除方法封装)处理
vue中高精度小数问题(加减乘除方法封装)处理
12 0
|
2天前
|
JavaScript
vue项目使用可选链操作符编译报错问题
vue项目使用可选链操作符编译报错问题
8 0
|
2天前
|
JavaScript
Vue项目启动报错处理
Vue项目启动报错处理
6 1
|
2天前
|
JavaScript 定位技术
vue项目开发笔记记录(二)
vue项目开发笔记记录
30 0
|
2天前
|
JSON JavaScript API
vue项目开发笔记记录(一)
vue项目开发笔记记录
30 0
|
2天前
|
JavaScript
Vue-实现点击空白处隐藏某节点
Vue-实现点击空白处隐藏某节点
9 1
|
2天前
|
缓存 JavaScript 前端开发
vue项目实战:实战技巧总结(中)
vue项目实战:实战技巧总结
29 1
|
6天前
|
JavaScript 搜索推荐 测试技术
深入了解 Vue CLI:现代化 Vue.js 项目开发工具
深入了解 Vue CLI:现代化 Vue.js 项目开发工具