vue.js 强行赋值、刷新数组或者对象 方法之 $.set()

本文介绍Vue.js中$set()方法的应用,该方法用于局部刷新赋值对象,避免每次赋值后刷新整个页面。通过实例展示了如何对特定字段进行赋值,并触发视图更新。

实际开发过程中,数据交互的的时候需要赋值,刷新,但是不可能每次赋值之后都刷新整个页面,所以就要用到 vue.js方法 $.set(),能实现赋值对象的局部刷新

语法:Vue.set(object, key, value)   (vm.$set () 也可以这么写,vm是实例化对象)

object :赋值对象

key:赋值对象里面要赋值的字段

value:赋给字段的值

例如:

on-change:(value) => {                                         
                                                vm.$set(vm.tableList[params.row.indexA].STEPselecteSketchList[params.index],'sketchMapId',value);    给vm.tableList[params.row.indexA].STEPselecteSketchList[params.index]这个对象里面的sketchMapId字段赋给一个新的值value,赋值完成之后这个对象就会刷新
 } 

 

转载于:https://www.cnblogs.com/xxflz/p/11401603.html

loadChildren(row, treeNode, resolve) { // 模拟异步加载子节点 setTimeout(() => { const children = [ { id: 101, name: '子节点1' }, { id: 102, name: '子节点2' } ]; resolve(children); // 解析数据 }, 500); }, // 新增子级数据 addChild() { const parentId = 102; // 目标父节点ID const newChild = { id: Date.now(), name: '新增子节点' }; const findParentAndAdd = (list, parentId, newChild) => { for (let i = 0; i < list.length; i++) { const node = list[i]; if (node.id === parentId) { // 找到父节点 if (!node.children) { // 如果还没有children,则初始化一个数组,并设置hasChildren为true this.$set(node, 'children', []); node.hasChildren = true; // 确保hasChildren为true,以便显示展开图标 } node.children.push(newChild); return true; // 表示已找到并添加 } // 如果当前节点有子节点,则递归查找 if (node.children && node.children.length > 0) { const found = findParentAndAdd(node.children, parentId, newChild); if (found) return true; } } return false; }; // 调用递归方法 const found = findParentAndAdd(this.deptList, parentId, newChild); if (!found) { console.error('未找到父节点'); return; } // 2. 更新el-table的懒加载缓存(lazyTreeNodeMap) const tableRef = this.$refs.table; const store = tableRef.store; const lazyMap = store.states.lazyTreeNodeMap; // 注意:lazyTreeNodeMap的键是父节点的row-key(deptId)的字符串形式 const mapKey = parentId.toString(); // 这里将parentId转为字符串,因为row-key在内部存储时可能会转为字符串 // 如果该父节点已经加载过子节点(即缓存中存在),则需要更新缓存 if (lazyMap[mapKey]) { // 注意:这里需要重新赋值,以便触发响应式更新 // 使用Vue.set或者直接赋值(因为lazyMap是响应式的,但直接修改数组元素不会触发,所以我们重新赋值整个数组) // 将新节点加入到缓存的子节点数组中 const newChildren = [...lazyMap[mapKey], newChild]; this.$set(lazyMap, mapKey, newChildren); } else { // 如果缓存中没有,说明该父节点尚未展开过(即还没有加载过子节点),则不需要更新缓存,因为下次展开时会重新加载 // 但此时我们已经在数据源中为父节点添加了children,所以当用户展开时,会直接使用数据源中的children(而不会触发load方法) // 所以这里我们还需要设置一个标志,告诉table该节点已经有子节点,不需要再懒加载? // 实际上,因为我们设置了hasChildren=true,并且已经有了children,所以el-table会直接使用children而不触发load。 // 所以这里不需要额外操作。 } // 3. 强制刷新视图:通过折叠再展开父节点 // 首先需要找到父节点的数据对象(上面递归时已经找到了,但为了简化,我们重新获取一次) const findNode = (list, id) => { for (let i = 0; i < list.length; i++) { const node = list[i]; if (node.id === id) return node; if (node.children) { const found = findNode(node.children, id); if (found) return found; } } return null; }; const parentNode = findNode(this.deptList, parentId); if (parentNode) { // 先折叠 tableRef.toggleRowExpansion(parentNode, false); // 再展开(使用setTimeout确保在下一个事件循环中执行,以便视图更新) this.$nextTick(() => { tableRef.toggleRowExpansion(parentNode, true); }); } },为啥我找不到子节点
08-28
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值