Vue2实践computed监听Vuex中state对象中的对象属性时发生的一些有趣经历
今天想实现一个功能,在全局中随时改变用户的部分信息。这时候就想到了用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对象中的对象属性时发生的一些有趣经历的更多相关文章
- vue 关于deep watch / computed 监听不到 vuex state 对象变化的的问题
简而言之,如果vuex state 中是一个对象 {},那么监听就会有问题.先给出解决方案: // 超简易拷贝(如果是深拷贝还多此一举把get/set拷贝进去了,所以用简易拷贝即可) let __VA ...
- watch实现监听Vuex状态监听(利用computed)
Vuex 通过 store 选项,提供了一种机制将状态从根组件"注入"到每一个子组件中(需调用 Vue.use(Vuex)):通过在根实例中注册 store 选项,该 store ...
- vue2.0之监听属性的使用心得及搭配计算属性的使用
我们在工作中常常需要监听某一个属性值的变化,这个时候我们就需要用到了监听属性watch,在这里我总结watch属性的三种场景使用希望对你有所帮助: 1.基础版监听: 场景如下:输入框输入你的年龄,如果 ...
- vue computed监听多个属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- iOS监听模式系列之IOS中的几中观察监听模式
本文介绍Objective C中实现观察者模式(也被称为广播者/监听者.发布/注册或者通知)的五种方法以及每种方法的价值所在. 该文章将包括: 1 手动广播者和监听者(Broadcaster and ...
- vue里的watch 和 computed 监听的不同
1.computed里是偏向于通过监听data里的值变化后,经过运算返回一个新的计算结果, 所以k不能与data里的k重名,并且必须有return, 能够缓存,依赖的值不变化不会进行重复计算: 而wa ...
- redis事件监听及在订单系统中的使用
https://blog.csdn.net/qq_37334135/article/details/77717248 通常在网上买好物品,或者说手机扫码后,点击付款,这时就会向后台发送请求,生成订单信 ...
- Spring Boot实践——事件监听
借鉴:https://blog.csdn.net/Harry_ZH_Wang/article/details/79691994 https://blog.csdn.net/ignorewho/arti ...
- 【Layui__监听button】在form中监听按钮事件
1. 前言 在使用form表单的按钮时,点击按钮总是页面刷新,代码如下 <button class="layui-btn" lay-submit lay-filter=&qu ...
随机推荐
- Left4Dead2 LAN Online
Left4Dead2 LAN Online Franklin vs Wolverine 求生之路 局域网联机说明 ============================ 局域网联机方法: 1.先找到 ...
- vue项目使用openlayers来添加地图标注,标注样式设置的简要模板
先把代码贴出来,注释以后有时间再写(需要留意一下这里图标的引入方式,函数内相同路径无法找到图片) import sk from "../../assets/img/home/sk-activ ...
- JS中数组与对象的遍历方法实例小结
一.数组的遍历: 首先定义一个数组 1 arr=['snow','bran','king','nightking']; 1.for循环,需要知道数组的长度; 2.foreach,没有返回值,可以不知道 ...
- git统计某个时间段写的代码行数
1. 任务需要 领导想每个迭代统计一下,当前迭代开发的代码数量是多少 2. 解决方法 git log --stat --since=2019-09-12 --until=2019-09-27 | pe ...
- Qt常用的登录界面设计
记录一下Qt常用的登录界面的设计 方便以后使用! 1.QpushButton改变一个按钮的颜色,当鼠标放上去和移开时显示不同的颜色.QPushButton { background-color: rg ...
- python中的__init_subclass__是什么?
什么是__init_subclass__ class Hook: def __init_subclass__(cls, **kwargs): print("__init_subclass__ ...
- IPC之msgutil.c源码解读
// SPDX-License-Identifier: GPL-2.0-or-later /* * linux/ipc/msgutil.c * Copyright (C) 1999, 2004 Man ...
- YII2组件之GridView
采用的是yii2.0.14版本,为了学习方便,以问答式书写. 开始GridView GridView主要是为了实现表格复用,尤其我们做后台的时候,你发现表单和表格占据了大部分页面,而表格的样式又是高度 ...
- Vue快速学习_第四节
获取原生的DOM方式($.refs) 给标签或者组件 添加ref <div ref = 'liu'>test</div> <Home ref = 'home'>&l ...
- Android异常与性能优化相关面试问题-内存管理面试问题详解
内存管理机制概述: 分配机制:操作系统会为每一个进程分配一个合理的内存大小,从而保证每一个进程能够正常的运行,不至于内存不够使用,或者某个进程占用过多的内存. 回收机制:在系统内存不足的时候,系统有一 ...