今天想实现一个功能,在全局中随时改变用户的部分信息。这时候就想到了用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. 使用EF Core 连接远程oracle 不需要安装oracle客户端方法

    连接字符串: Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=IP地址(PORT=1521))(CONNECT_DATA=(SERVICE_ ...

  2. loj 2759「JOI 2014 Final」飞天鼠

    loj 这题有在一棵树上上升或者下降的操作,稍加分析后可以发现上升操作如果不是一定要做(指高度不足以到下一棵树或者是最后到达\(n\))就不做,下降操作也是如果不是一定要做(指到达下一棵树时高度过高) ...

  3. java实现spark常用算子之SaveAsTextFile

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  4. java启动server时报端口无效解决方法

    今天在Java里配置Tomcat服务器,启动时出现如下图报错信息 The server cannot be started because one or more of the ports are i ...

  5. Jupyter Notebook不能自动打开浏览器

    安装了 Winpython,运行Jupyter Notebook.exe或Jupyter lab.exe,总是不能自动打开浏览器,提示"no web browser found" ...

  6. 利用 Monitor.TryEnter 来规避 .NET 线程死锁的源代码

    在开发多线程的应用程序时,我们会大量用到 lock (...) {} 块.如果 lock 的对象比较多,非常容易发生死锁.死锁的发生很难预料,而且一旦发生在界面线程上,界面就不再刷新响和应用户输入:如 ...

  7. 【Day2】2.函数

     视频地址(全部) https://edu.csdn.net/course/detail/26057 课件地址(全部) https://download.csdn.net/download/gentl ...

  8. 【异常】Caused by: java.lang.IllegalStateException: Zip64 archives are not supported

    1 自己打包Spring boot项目依赖了第三方的Phoenix jar包过大,导致启动后报错 参考了这篇博客:https://cloud.tencent.com/developer/ask/135 ...

  9. Linux下kafka集群搭建

    环境准备 zookeeper集群环境 kafka是依赖于zookeeper注册中心的一款分布式消息对列,所以需要有zookeeper单机或者集群环境. 三台服务器: 172.16.18.198 k8s ...

  10. 【未知来源】Randomized Binary Search Tree

    题意 求 \(n\) 个点的 Treap 深度为 \(h=0,1,2,\cdots,n\) 的概率. Treap 是一个随机二叉树,每个节点有权值和优先级,权值和优先级都是 \([0,1]\) 中的随 ...