vue中 this.$set的使用

背景:在我写前端项目的时候,后端给我们的一个json对象,并且我已经渲染在页面上了。但是由于我自己的需求,想往返回的对象里面添加一个字段,于是我用push一个字段进去,添加是添加进去了,但是页面渲染却没有变化。后来才意识到不是响应式的。如果我们要让这个新字段是响应式的,就要使用到this.$set来注入数据

当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的。

使用

this.$set( target, key, value ) target:表示数据源,即是你要操作的数组或者对象,key:要操作的的字段,value:更改的数据

来个小案例:

给一个对象添加一个年龄属性并且让它可以响应式的进行改变

<template><div class="text"><p>{{list}}</p><button @click="add">age++</button></div></template>
<script>
export default {data(){return {list:{ name: "张三"}}},methods: {add(){if(!this.list.age){ // 如果没有age属性就给它添加一个age属性this.list.age=18}else{this.list.age++}console.log(this.list)}}
}
</script>

当我们没有使用this.$set去添加对象属性的时候,效果:

数据确实已经添加进去了,但是页面并没有响应式的渲染age属性。

当我们使用this.$set(this.list,‘age’,18)去添加一个属性之后。效果:

我们能看见添加的数据是响应式的。

为什么能够响应式?

仔细观察一下,使用了this.$set 多了get age和set age方法,这正是能够响应式的原因

分析

Vue的响应式原理为 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 property,并使用 Object.defineProperty 把这些 property 全部转为 getter/setter。这些 getter/setter 对用户来说是不可见的,但是在内部它们让 Vue 能够追踪依赖,在 property 被访问和修改时通知变更。这里需要注意的是不同浏览器在控制台打印数据对象时对 getter/setter 的格式化并不同,下图来自官方文档。

写在最后

以上如果有误,欢迎大佬评论指点。

今日浪漫语句

vue中 this.$set的使用相关推荐

  1. 怎么将vue模板转换为html,vue中自定义html文件的模板

    如果默认生成的 HTML 文件不适合需求,可以创建/使用自定义模板. 一是通过 inject 选项,然后传递给定制的 HTML 文件.html-webpack-plugin 将会自动注入所有需要的 C ...

  2. props写法_简单理解vue中Props属性

    本文实例为大家解析了vue中Props的属性,供大家参考,具体内容如下 使用 Props 传递数据 组件实例的作用域是孤立的.这意味着不能并且不应该在子组件的模板内直接引用父组件的数据.可以使用 pr ...

  3. vue ts 设置tslint提示_Typescript 在 Vue 中的实践(包含2.x、3.x)

    1 使用 typescript 的优势 聊到 ts 时有一个不能规避的问题:为什么要使用 ts ,相比 js 有什么优势吗?下面我从两个方面试着回答一下这个问题: 1.1 项目开发时的便利 避免低级 ...

  4. VUE中使用Echarts绘制地图迁移

    踩坑说明 很久以前写jsp时使用过echarts的china.js插件,不过echarts是2.0的,目前vue项目中使用echarts3.8.5,直接将china.js插件引入,代码复制,运行一看, ...

  5. vue中动态样式不起作用? scoped了解一下

    vue中style标签使用属性scoped的注意事项 style上添加属性scoped可以实现样式私有化,但是在使用动态样式时,样式会不起作用.可以先去掉scoped 转载于:https://www. ...

  6. Vue中组件数据的传递

    Vue中组件的作用域是隔离的,父组件中的数值子组件看不到!也就是说,用angular作比喻,组件的scope天生是scope:()的! 如果父组件需要往子组件中传数据,此时应该使用标签属性: < ...

  7. vue中 静态文件引用注意事项

    (一)assets文件夹与static文件夹的区别 区别一:assets文件是src下的,所以最后运行时需要进行打包,而static文件不需要打包就直接放在最终的文件中了 区别二:assets中的文件 ...

  8. vue中axios如何实现token验证

    title: vue中axios如何实现token验证 date: 2018-02-08 17:50:07 tags: [axios,vue] 继上篇实现Auth认证之后,然后每个跳转页面都会在后端验 ...

  9. vue和react相同点_我在React和Vue中创建了相同的应用程序。 这是区别。

    vue和react相同点 by Sunil Sandhu 由Sunil Sandhu 我在React和Vue中创建了相同的应用程序. 这是区别. (I created the same app in ...

  10. Vue 中 CSS 动画原理

    下面这段代码,是点击按钮实现hello world显示与隐藏 <div id="root"><div v-if="show">hello ...

最新文章

  1. 全球UML模型共享设计下载中心--www.euml.org上线
  2. 刚刚,三名中国航天员奔赴太空!其中一位刚参加完博士毕业典礼!
  3. Only the original thread that created a view hierarchy can touch its views.
  4. 签约中国搜索,第四范式助力智慧媒体转型发展
  5. oracle 根据spid查sql,探讨:Oracle数据库查看一个进程是如何执行相关的实际SQL语句...
  6. TDSQL在巴黎ICDE上设立展台,掌声送给它!
  7. 收集53个程序员励志名言
  8. 继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类
  9. Weblogic 节点启动
  10. 刚毕业,师傅推荐的书单
  11. DeepFM: A Factorization-Machine based Neural Network for CTR Prediction
  12. 电脑专家——DVI-D接口转HDMI接口
  13. vue-cli设置跨域代理 + 开发/生成环境简单请求接口设置
  14. 社招2017-阿里、网易、滴滴共十次前端面试碰到的问题
  15. json动态生成复杂表头excel_Excel办公用品管理系统,全函数统算,图表动态展示高效轻松...
  16. [Linux] 使用 SCP 指令,讓您傳送檔案至遠端、下載檔案
  17. python selenium自动化填写问卷星
  18. matlab怎样批量裁剪图片大小,wps 批量调整图片大小 宏
  19. applicationContext-job
  20. daytime协议的服务器和客户端程序,用socket套接字实现daytime协议服务器和客户端程序.doc...

热门文章

  1. matlab imshow加画网格,matlab能生成随机行走网格吗? - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
  2. 在rhel7.3中编译和使用log4cxx
  3. 【TCP拥塞控制算法(TCP congestion control algorithm)学习笔记】
  4. flexbox布局详解
  5. outlook客户端怎么看html,谷歌浏览器根据html网页启动邮件客户端Outlook(示例代码)...
  6. C++ exception with description “bad optional access“ thrown in the test body.
  7. 成功解决win7安装python过程,Setup failed,需要安装Windows 7 Service Pack 1
  8. 一项研究调查了采用Masimo Rad-G™搭配RRp(R)实现自动呼吸频率测量的影响
  9. Neo4j之导入CSV大文件 periodic commit
  10. Firefox中fetch请求后直接调用location.reload(),返回NS_BINDING_ABORTED错误