$set解决vue中修改数组或对象视图不更新的问题

news/2024/7/10 2:36:24 标签: vue, js

文章目录

  • 前言
  • 一、案例
  • 二、解决方法
    • $set
  • 总结


前言

相信大家和我一样,在开发中总是遇到一个问题。

为啥我修改v-for遍历的数组,视图却没有更新???当我点击其他操作重新渲染后,又更新了???这不会是vue出bug了吧
在这里插入图片描述
这项问题其实正是由vue的双向绑定造成的,vue在2.x的版本中还在使用defineProperty方法,这就是defineProperty中的一个问题。所以在vue3.0中,使用了proxy取代了defineProperty。对此本文不多做解释,有兴趣的朋友可以去查阅下资料。

回到正题,让我们看看怎么在2.x中解决这个问题吧!

一、案例

为了方便我们了解问题,我写了一个测试代码

<template>
<div id="app">
  <div>
    <button type="" @click="change">改变数组</button>
    <p>{{student.name}}</p>
    <p>{{student.age}}</p>
    <span v-for="(item,index) in info" :key="index" style="margin-right:20px">{{item}}</span>
  </div>
</div>
</template>

<script>
export default {
  name: 'App',
  components:{
  },
  data() {
    return {
      student:{
        name:'二蛋'
      },
      info:[0,1,2]
    }
  },
  methods: {
    change() {
      this.student.age = 12
      console.log(this.student);
      this.info[1] = 3
      console.log(this.info);
    }
  },
}
</script>

<style>
body{
  width: 100vw;
  height: 100vh;
  display: grid;
  justify-content: center;
  align-content: center;
}
</style>

在这里插入图片描述
预期效果:点击按钮后,我们给student对象增加一个age属性,改变数组第二个元素为3。并打印改变后的对象和数组。

让我们点击看一看:在这里插入图片描述
这里可以从打印区发现,我们已经给对象增加属性而且改变了数组,那奇怪的事来了,为什么我的页面上展示为什么没有变呢?
在这里插入图片描述
这就是defineProperty的问题啦。如果有同学感兴趣,可以看一下下面这一篇文章ES6 系列之 defineProperty 与 proxy

这里,我只教大家怎么使用$set去解决这个问题哦

二、解决方法

$set

this.$set( target, propertyName/index, value )
参数:
// 你需要改变的数组或对象
{Object | Array} target
// 你需要改变的键名或索引
{string | number} propertyName/index
// 改变后的值
{any} value

让我们一起来试试吧:

change() {
      this.$set(this.student,'age',12)
      console.log(this.student);
      this.$set(this.info,1,3)
      console.log(this.info);
    }

效果图:在这里插入图片描述
可以发现,我们的视图成功更新了。

小知识:在vue中,还有另一种写法,Vue.set()

那么有同学会问了,那有什么不同呢?

其实他们两个的原理和参数是完全相同的哦,具体使用哪一个就看你的爱好啦。

总结

文章只是简单介绍了遇到此类情况该怎样去解决,如果想了解原理的话,可以去上面发的大佬博客看一看哦!

二次传送门:ES6 系列之 defineProperty 与 proxy


http://www.niftyadmin.cn/n/861676.html

相关文章

MongoDB入门学习

文章目录前言一、MongoDB是什么&#xff1f;二、MongoDB的基本操作1.基本指令2.插入文档3.查询文档4.修改文档5.删除文档6.简单操作总结前言 虽说现在关系型数据库还是主流&#xff0c;但是面对某些需求的时候&#xff0c;需要非关系型数据库来补充它&#xff0c;学习一个主流…

使用mongoose在express中操作数据库

文章目录前言一、Mongoose是什么&#xff1f;二、使用步骤1.引入库2.连接数据库3.操作数据库操作前的准备工作增加文档查询文档更新文档删除文档3.将增删查改操作写成接口总结前言 前面我们已经学会怎么去在命令行里操作数据库了&#xff0c;但是我们肯定不能让用户去操作命令…

浅谈xss和csrf攻击

文章目录前言一、XSS是什么&#xff1f;存储型(持久型)反射型(非持久型)dom型二、CSRF是什么&#xff1f;总结前言 由于博主目前在一家主做网络安全的公司实习&#xff0c;之前没有意识到网络安全的严重性&#xff0c;现在才感受到我们的系统存在了这么多问题&#xff0c;很容…

【ES6】浅谈Vue3为什么使用Proxy取代defineProperty

文章目录前言一、Proxy是什么&#xff1f;get()set()二、Vue双向绑定实现原理三、Vue3为什么使用ProxydefineProperty缺陷Proxy的好处总结前言 友友们大家好&#xff0c;vue3推出后大家有没有去看呢&#xff1f;博主是个性子急的人&#xff0c;哪能禁得住这诱惑。 经过博主粗…

【ES6】浅谈Generator和yield

文章目录前言一、async await实现二、Generator实现三、Generator函数1、什么是Generator2.Generator的特点3.Generator的执行四、yield表达式1、什么是yield2、yield注意点五、Iterator对象五、next方法的参数总结前言 问题发生在一个下午&#xff0c;当我正在实现Promise.al…

常见css居中问题

文章目录前言一、水平居中已知宽度未知宽度二、垂直居中已知高度未知高度三、垂直水平居中总结前言 居中是我们项目开发中最常用到样式&#xff0c;可以说&#xff0c;作为一名合格的前端&#xff0c;各种情况下的居中应该是得心应手的&#xff0c;接下来让我们看看有哪些方式…

【JS编译原理】V8执行JavaScript代码过程

文章目录前言一、编译器和解释器二、V8执行JavaScript代码过程1.生成AST&#xff08;抽象语法树&#xff09;2.生成字节码3.生成机器码总结前言 相信大家对Babel已经不陌生了&#xff0c;Babel充斥在我们代码中的每个角落。比如&#xff1a;jsx转化成js&#xff0c;es6转化成e…

【React Hooks优化】减少重复渲染

文章目录前言一、为什么要进行优化&#xff1f;React的默认渲染行为二、使用memo/useMemo缓存组件1.memo2.useMemo2.useCallback总结前言 事情发生在一个下午&#xff0c;我需要用React hooks写一个定时器&#xff0c;因为useEffect每次执行都会使组件重新渲染一次&#xff0c…