Vue 更新data选项中的数组


title: Vue 更新data选项中的数组
date: 2018-12-18 18:05:19
tags: [Vue]
categories: Vue


疑问

最近看到一道面试题,如下:

var vm = new Vue({
  data: {
    items: [1, 2, 3]
  }
})
vm.items[1] = 'x'
vm.items.length = 2

这样写有什么问题?那应该怎么写?

我看到这道题时并不觉得有什么问题。在Vue中,一旦响应式数据发生改变,setter 不是会发通知给 watcher 吗?

解答

后来我才知道,这样子写的话 Vue 不会更新该数组数据对应的视图

请先阅读完官方文档的 深入响应式原理,再看下面:

  1. 数据确实更新了,但视图没有更新,那就说明 Vue 并没有检测到该数据更新了
  2. 其实是数组的问题,在 Vue 中它比较特殊。
  3. 我们知道,Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让数据是响应式的。
  4. 往深了说,其实 Vue 在我们的data对象上都会定义一个ob属性指向新创建的Observer对象,以此对数据设置监控器。但由于现代 JavaScript 的限制(底层原理不明),Object.Observe 支持的不好,Vue 无法对数组进行Observer对象创建,因此不能检测到数组对象的变化。
  5. 不过 Vue 给我们提供了别的方法,具体见下面。

解决方法

// Vue.set
Vue.set(vm.items, indexOfItem, newValue)

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

推荐阅读更多精彩内容

  • 这方面的文章很多,但是我感觉很多写的比较抽象,本文会通过举例更详细的解释。(此文面向的Vue新手们,如果你是个大牛...
    Ivy_2016阅读 15,469评论 8 64
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,796评论 1 32
  • vue理解浅谈 一 理解vue的核心理念 使用vue会让人感到身心愉悦,它同时具备angular和react的优点...
    ndxs2008阅读 24,270评论 2 18
  • 前言 observer部分完整的源码注释放在github上了,有兴趣的可以去看看,如果发现有误情不吝赐教!obse...
    Lxylona阅读 4,776评论 0 10
  • VUE介绍 Vue的特点构建用户界面,只关注View层简单易学,简洁、轻量、快速渐进式框架 框架VS库库,是一封装...
    多多酱_DuoDuo_阅读 7,669评论 1 17