vue 动态给对象新增属性 Vue.$set()

出现的问题

在data中定义了groups对象,其中每一个属性双向绑定一个下拉框,来确定选中的值,它的内容是从是从后台获取的。
如果直接通过赋值,那么网页上的下拉框是无法选中的

代码中定义

data() {
  return {
    groups: {},
  } 
}

直接赋值

async fetchData() {
      let resp = await axios.get("/category");
      this.groups['a下拉框'] = resp.data['a下拉框'];
      this.groups['b下拉框'] = resp.data['b下拉框'];
    },

经过动态加载后应该这样

groups: {
  'a下拉框': 1,
  'b下拉框': 1,
},

虽然groups中已经有了数据,但是下拉框并不能点击,说明我们的双向绑定出了问题

解决方案

原因

因为 Vue 无法探测普通的新增属性。在实例创建之后添加新的属性到实例上,它不会触发视图更新。Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。

通过Vue.$set() 解决

Vue.$set() 向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。

async fetchData() {
      let resp = await axios.get("/category");
      this.$set(this.groups, 'a下拉框', resp.data['a下拉框']);
      this.$set(this.groups, 'b下拉框', resp.data['b下拉框']);
    },

通过这样的方法,实现了新增属性的双向绑定,并且触发了视图更新,并且下拉框也可以正常使用了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、了解Vue.js 1.1.1 Vue.js是什么? 简单小巧、渐进式、功能强大的技术栈 1.1.2 为什么学习...
    蔡华鹏阅读 3,422评论 0 3
  • # 在本文中,笔者又提炼了以下几个重点 补偿双向数据绑定 Vue.$set 数据侦听 Vue.$watch 表单绑...
    果汁凉茶丶阅读 1,491评论 1 15
  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,199评论 0 1
  • 33、JS中的本地存储 把一些信息存储在当前浏览器指定域下的某一个地方(存储到物理硬盘中)1、不能跨浏览器传输:在...
    萌妹撒阅读 2,155评论 0 2
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,273评论 0 6