vue基础-$set的使用

一、vue的双向数据绑定

js 复制代码
    <ul>
      <li v-for="item of list" :key="item.id">
        姓名:{{ item.name }}----年龄:{{ item.age }}
      </li>
    </ul>
    <el-button @click="addUser">添加人员</el-button>
    
  data() {
    return {
      list: [
        { id: 1, name: '小明', age: 18 },
        { id: 2, name: '小华', age: 19 },
        { id: 3, name: '小华' }
      ]
    }
  }
  
  方法:
    addUser() {
      this.list.push({ id: Date.now(), name: 'xx', age: '未知' })
    }

如上这段代码,可以看到,定义在data中的list,可以往里面push一条新的数据,数据改变,视图就会更新

二、数据改变,但是不会更新视图的情况

js 复制代码
<el-button @click="changeUser">改变人员</el-button>




    changeUser() {
      this.list[2].age = 100
    }

在data中定义list的时候,第三项数据并没有age属性,现在,我们来改变它,但是视图并没有任何改变。

原因呢?因为在data中定义list的时候,并没有定义第三项的age属性,那么这个属性就不会经过Object.defineProperty来处理,所以当改变age时,就不会触发视图的更新

三、如何触发视图更新

  1. 改变整个数组
js 复制代码
      this.list = this.list.map((item, index) => ({
        ...item,
        age: index === 2 ? 100 : item.age
      }))
  1. 使用$set
js 复制代码
      this.$set(this.list[2], 'age', 100)

同样地,如果你想通过length去删除数组的最后一项this.list.length = this.list.length - 1也是不行的,使用this.$delete(this.list, this.list.length - 1)便可以。

相关推荐
kyriewen5 分钟前
别再用防抖做懒加载了:120 张图只加载出 4 张
前端·javascript·程序员
计算机魔术师10 分钟前
Hugging Face CEO 转评前 DOGE 研究人员用 AI 智能体渗透 Anthropic 系统事件
前端
IT_陈寒18 分钟前
刚解决一个 Java 并发问题,这坑踩得我怀疑人生
前端·人工智能·后端
前端一课19 分钟前
一个晚上,四个“小问题”:我重写了 12 章 ArkUI 笔记
前端
小码哥_常31 分钟前
前端图片压缩实战——我把网站图片体积砍了 70%
前端
张一凡9344 分钟前
把“不要乱改”从提示词里拿出来,放进可校验的提案里
前端·后端·架构
木子欢儿1 小时前
Debian 13 + vsftpd 搭建FTP服务
linux·服务器·前端·网络·debian
leeguoo1 小时前
让 Claude Code / Codex 用上你已登录的 Chrome
前端·chrome·ai编程
天蒙蒙亮1 小时前
打安卓apk包+“应用商城”发布
前端·uni-app
Lank_M1 小时前
视频压到指定大小总超一截?码率控制的误差拆开看
前端