vuex 的 store对象的 state 是响应式的,凡是预先在 state 中定义的状态,都会被加入到响应式系统中,当状态发生了变化,所有引用状态的 vue 文件的 template 都会随之发生变化,做到响应式的功能。
但是其前提是:提前定义好的会被加入到响应式系统中,那后面追加的属性或对象能不能加入到响应式系统中呢?
答案是:不能,但是,如果按照指定的方式来添加和删除属性,是可以做到响应式的。
比如现在我要添加一个新属性 height,用两种方式添加,如下:
1、方式1:此种方式能添加 state 中对象的属性,但无法加入到响应式系统中,即页面上不会显示出来,实际上确实存在了这个属性
mutations: {
addheight(state){
state.stus[0]['height'] = 168 }
}
2、方式2:此方式可以让属性加入到响应式系统中
mutations: {
addheight(state){
Vue.set(state.stus[1],'height',178) //参数一为对象,参数二为key,参数为value
}
}
3、方式3:用新对象给旧对象重新赋值(下面会介绍到)
4、说完添加属性,再说下删除吧,想要删除属性并加入响应式系统,如下方式:
mutations: {
delheight(state){
Vue.delete(state.stus[1],'height') //参数一为对象,参数二是key
}
}
5、总结:
(1)Vuex 的 store 对象中的 state 是响应式的,当 state 中的数据发生改变时,vue 组件会自动更新。
(2)但是它有一个前提条件,与我们之前了解的响应式前提是一致的,就是需要:提前在 state 中定义好所需的初始化属性。动态添加的属性是不能响应式的。
(3)如何保证动态添加的属性的响应式呢 - 有一下两种方式
方式一:使用 Vue.set(obj, key, value)
方式二:使用新对象给旧对象重新赋值
(4)在state删除已经存在的属性,使用 delete + 属性满足不了响应式,必须这样使用:Vue.delete(obj, 属性名)
首先我们需要了解一个前提基础:
computed 属性监听对象时候,若对象的引用地址未改变,那么computed将不会检测到。比如object中的某个key对应的value发生了变化,computed检测不出来
// 原写法
export default {
namespaced: true,
state: {
info:{
other: {}
}
},
mutations: {
addInformation(state,info){
let data = Object.assign(state.info, info); //此时 state.info 的值改变了,但是引用地址没变
state.shareInformation = data;
},
}
}
使用 Object.assign() 的目标对象仍然是 state.info ,所以虽然其值变了,但是引用地址是没变的,所以 computed 检测不到。
// 正确写法
addInformation(state,info){
//创建一个新的对象,将state.info,Info 对象复制到新对象中
let data = Object.assign({},state.info,info); //将 state.info 指向新对象的引用地址
state.info = data;
},
使用 Object.assign() 的目标对象是个空对象,将 2 个源对象 state.info、info 的内容复制到新对象上 ,所以其值变了,引用地址也变了。这样 computed 才可以检测到。
简而言之,如果 vuex state 中是一个空对象 {},那么监听就会有问题,必须得有提前定义好的初始化属性才可以保证监听。那么如果无法确定动态添加属性的 key 是啥,怎么办呢?先给出解决方案:
// 简易拷贝
let _reply = JSON.parse(JSON.stringify(state.reply)) // 加入动态属性 orderId 是变化的
_reply[orderId] = data.orderId // 更新,只能这样一波骚操作才能让computed和watch监听到。
state.reply = _reply
具体原因其实跟第二章一样,要保证其引用地址变了才行。
原网址: 访问
创建于: 2023-10-08 11:22:32
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论