Vue.$set的使用场景
有这样一个需求,用户可以增加多个输入框可以编辑:

实现的思路很简单,点击增加的时候,往一个数组里面push一条数据即可:
<template> <div> <div v-for="(item,k) in prodForm.seqNos" :key="k"> <input type="text" v-model="item.seqNo" /> </div> <button @click="add">增加</button> </div> </template> <script> export default { name: "addInput", mounted(){ this.prodForm = this.basicInfo //初始化 this.prodForm.seqNos = [] //因basicInfo没有seqNos,因此重新添加 console.log(this.prodForm) }, data(){ return { prodForm:{ id:'', seqNos:[], }, basicInfo:{ id:1 } } }, methods:{ add(){ this.prodForm.seqNos.push({seqNo:''}) } }, } </script> <style scoped> .btn{ width:100px; margin:10px; } </style>
在mounted有一个初始化赋值操作,而basicInfo里面并没有seqNos这个数组,当赋值完成后,我需要重新添加回来,这样就有问题了,你点击增加的按钮无法生效,为啥呢?
根据官方文档定义:
如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。
也就是说,默认vue会遍历data里面的所有属性,并使用Object.defineProperty把这些属性全部转为 getter/setter。
我们通过打印prodForm变量,发现seqNos这个数组并未增加getter和setter,也就是这个数组并没被监听起来:

怎么办呢?$set就派上用场了:
Vue.$set(object, key, value)
我们将代码改造一下:
<template> <div> <div v-for="(item,k) in prodForm.seqNos" :key="k"> <input type="text" v-model="item.seqNo" /> </div> <button @click="add">增加</button> </div> </template> <script> export default { name: "addInput", mounted(){ this.prodForm = this.basicInfo //初始化 //this.prodForm.seqNos = [] //因basicInfo没有seqNos,因此重新添加 this.$set(this.prodForm,'seqNos',[]) console.log(this.prodForm) }, data(){ return { prodForm:{ id:'', seqNos:[], }, basicInfo:{ id:1 } } }, methods:{ add(){ this.prodForm.seqNos.push({seqNo:''}) } }, } </script> <style scoped> .btn{ width:100px; margin:10px; } </style>
这时再打印prodForm变量,发现seqNos数组已经添加了getter和setter,按钮也生效了:

本文来自博客园,作者:喆星高照,转载请注明原文链接:https://www.cnblogs.com/houxianzhou/p/13534613.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?