今天想实现一个功能,在全局中随时改变用户的部分信息。这时候就想到了用Vuex状态控制器来存储用户信息,在页面中使用computed来监听用户这个对象。看似一个很简单的逻辑,就体现了我基本功的不扎实呀。

代码1:

// store.js
import Vuex from 'vuex'; const store = new Vuex.Store({
state: {
personInfo:{}
},
mutations: {
saveUserInfo(state,info){
let data = Object.assign(state.personInfo,info); // 使用Object.assign来更新state.personInfo对象
state.personInfo = data;
}
}
});

写完后准备测试,感觉没啥问题。可是登录成功后userInfo就是怎么样不会更新,界面上的信息也不会更新。这我就懵逼了,没感觉出来问题呀。于是怀疑saveUserInfo出了问题,中间的种种心态爆炸就不描述了,终于发现了问题。没错,就是Object.assign()这个方法我没有理解好导致了问题。

Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。他将返回目标对象。

Object.assign(targetObj,sourceObj1,sourceObj2....);

这样就很好解释我的问题了

// store.js
import Vuex from 'vuex'; const store = new Vuex.Store({
state: {
personInfo:{}
},
mutations: {
saveUserInfo(state,info){
// 将info这个对象复制到 state.personInfo对象
// 将处理完的state.personInfo对象赋值给data变量
let data = Object.assign(state.personInfo,info);
// 此时state.personInfo里的值改变了,但是引用地址未变
state.personInfo = data;
}
}
});

正确方式:

// store.js
import Vuex from 'vuex'; const store = new Vuex.Store({
state: {
personInfo:{}
},
mutations: {
saveUserInfo(state,info){
// 创建一个新的对象,将info,state.personInfo对象复制到新对象中
let data = Object.assign({},state.personInfo,info);
// 将state.personInfo指向新对象的引用地址
state.personInfo = data;
}
}
});

总结

computed属性监听对象时候,若对象的引导地址未改变,那么computed将不会检测到。

  • 比如object中的某个key对应的value变化了,computed检测不出来。

Vue2实践computed监听Vuex中state对象中的对象属性时发生的一些有趣经历的更多相关文章

  1. vue 关于deep watch / computed 监听不到 vuex state 对象变化的的问题

    简而言之,如果vuex state 中是一个对象 {},那么监听就会有问题.先给出解决方案: // 超简易拷贝(如果是深拷贝还多此一举把get/set拷贝进去了,所以用简易拷贝即可) let __VA ...

  2. watch实现监听Vuex状态监听(利用computed)

    Vuex 通过 store 选项,提供了一种机制将状态从根组件"注入"到每一个子组件中(需调用 Vue.use(Vuex)):通过在根实例中注册 store 选项,该 store ...

  3. vue2.0之监听属性的使用心得及搭配计算属性的使用

    我们在工作中常常需要监听某一个属性值的变化,这个时候我们就需要用到了监听属性watch,在这里我总结watch属性的三种场景使用希望对你有所帮助: 1.基础版监听: 场景如下:输入框输入你的年龄,如果 ...

  4. vue computed监听多个属性

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. iOS监听模式系列之IOS中的几中观察监听模式

    本文介绍Objective C中实现观察者模式(也被称为广播者/监听者.发布/注册或者通知)的五种方法以及每种方法的价值所在. 该文章将包括: 1 手动广播者和监听者(Broadcaster and ...

  6. vue里的watch 和 computed 监听的不同

    1.computed里是偏向于通过监听data里的值变化后,经过运算返回一个新的计算结果, 所以k不能与data里的k重名,并且必须有return, 能够缓存,依赖的值不变化不会进行重复计算: 而wa ...

  7. redis事件监听及在订单系统中的使用

    https://blog.csdn.net/qq_37334135/article/details/77717248 通常在网上买好物品,或者说手机扫码后,点击付款,这时就会向后台发送请求,生成订单信 ...

  8. Spring Boot实践——事件监听

    借鉴:https://blog.csdn.net/Harry_ZH_Wang/article/details/79691994 https://blog.csdn.net/ignorewho/arti ...

  9. 【Layui__监听button】在form中监听按钮事件

    1. 前言 在使用form表单的按钮时,点击按钮总是页面刷新,代码如下 <button class="layui-btn" lay-submit lay-filter=&qu ...

随机推荐

  1. Pytorch中nn.Conv2d的用法

    Pytorch中nn.Conv2d的用法 nn.Conv2d是二维卷积方法,相对应的还有一维卷积方法nn.Conv1d,常用于文本数据的处理,而nn.Conv2d一般用于二维图像. 先看一下接口定义: ...

  2. centos7上的firewalld 的使用

    #centos7上的firewalld 的使用 一.firewalld的基本启动关闭命令 启动服务------systemctl start firewalld 关闭服务------systemctl ...

  3. postgresql与mysql 优缺点

    MySQL的主要优点 (速度,流行,window,线程,事务) 1. 首先是速度,MySQL通常要比PostgreSQL快得多.MySQL自已也宣称速度是他们追求的主要目标之一,基于这个原因,MySQ ...

  4. tensorboardX使用中 AttributeError: 'function' object has no attribute 'graph'

    最近在使用tensorboardX可视化网络结构,因为tensorboardX并非pytorch原生的可视化工具,所以版本之间并不兼容 在使用的过程中会遇到,AttributeError: 'func ...

  5. web端文件上传,预览,下载,删除

      //HTML部分 <div class="item attachment attachmentNew"> <span class="name&quo ...

  6. Django单元测试 相关知识

    前言 本文,旨在说明python Django如何编写单元测试,从“背景”,“测试要求”,“代码编写”,“如何运行”,“检验测试覆盖度” 这几个方面来说明附上django的官方文档单元测试章节=> ...

  7. 怎么处理Win7系统备份还原提示代码0x80042302的错误?

    我们都知道Win7系统自带备份还原功能,可以在电脑遇到小问题时通过还原至之前备份的正常系统来解决,非常的方便.但是有些用户在使用备份还原功能时,系统会提示0x80042302错误,这该怎么办呢?下面好 ...

  8. deep_learning_凹凸函数

    什么是凸函数及如何判断一个函数是否是凸函数 t元j 一.什么是凸函数 对于一元函数f(xf(x),如果对于任意tϵ[0,1]tϵ[0,1]均满足:f(tx1+(1−t)x2)≤tf(x1)+(1−t) ...

  9. Linux Shell Web超级终端工具shellinabox

    Shell是Linux内核应用程序,是指“为使用者提供操作界面”的软件,也是命令解析器,它类似于Windows操作系统DOS下的cmd.exe应用程序.它接收用户命令,然后调用相应的应用程序,用户一般 ...

  10. PHP提取富文本字符串中的纯文本,并进行进行截取

    this is my first markdown article,i hope you like it /** * 提取富文本字符串的纯文本,并进行截取; * @param $string 需要进行 ...