Vue数据绑定失效

首先,我们得明白Vue数据响应的原理:

以对象为例:当把一个JavaScript对象传给Vue实例的data选项时,Vue将遍历此对象所有的属性,并使用Object.defineProperty把这些属性全部转为getter/setter,

而getter/setter可以做到追踪依赖,在属性被访问和修改时通知变化。

那么,什么是getter/setter ?

var person = {
    defaultname: ‘tom‘,
    get name() {
        return this.defaultname
    },
    set name(val) {
        this.defaultname = val
        console.log("触发了set")
    }
}person.name =>"tom" person.name = 123 =>触发了set person.name =>123

getter/setter其实就是get、set方法,set能检测到数据的改变并进行操作。

但在有些情况下setter不能检测到数据的变化,即没有触发set。

例如:

person.name = {name: ‘tom‘}
=>触发了set
person.name
=>{name: "tom"}
person.name.name = 123123
=>没有打印出任何信息,说明修改name的属性值并没有触发set方法。
person.name.sex = 333
=>没有打印出任何信息,说明添加name的属性值并没有触发set方法。
delete person.name.name
=>没有打印出任何信息,说明删除name的属性值并没有触发set方法。
Object.defineProperty(person.name, ‘name‘, {value: 4444})
=>没有打印出任何信息,说明Object.defineProperty也没有触发set方法。

追踪依赖在这种情况下并没有形成,这时数据绑定失效的根本原因。

失效场景总结:

对象

修改、添加、删除对象的属性值

数组

设值,修改长度,push、pop、shift、unshift等原生方法

------------------------------------------------------------------------

解决方案

对象

单个属性:可使用Vue.set(object, key, value)方法将响应属性添加到嵌套的对象上

多个属性:替换方法,即:创建一个新的对象赋值给原对象

如:this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })

数组

Vue提供的对原生方法修改的变异方法:

- push()
- pop()
- shift()
- unshift()
- splice()
- sort()
- reverse()

非变异方法(替换方法):(本质上也是创建一个新的数组赋值给原数组)

如:

example1.items = example1.items.filter(function (item) {
  return item.message.match(/Foo/)
})

那么这儿就有一个思考,替换方法是否低效?是否会导致dom树的重新渲染?

不用担心,大胆用!因为Vue为了使得 DOM 元素得到最大范围的重用而实现了一些智能的、启发式的方法,所以用一个含有相同元素的数组去替换原来的数组是非常高效的操作。

-----------------------------------------------------------------------------------------

另外,还有一种失效的场景,即给data对象添加属性时失效,这里得声明:

初始化时才会对属性执行getter/setter转化过程,所以属性必须在data对象上存在,或者设置为某个对象的属性。

原文地址:https://www.cnblogs.com/yanze/p/10361198.html

时间: 2024-10-14 00:34:36

Vue数据绑定失效的相关文章

ionic 搜索双向数据绑定失效

1.用data对象存储变化的数据 js: $scope.data={}; $scope.data.keywords = ""; $scope.search = function(){ $state.go("search",{keywords:$scope.data.keywords}); } html: <ion-view view-title="Home" hide-nav-bar="true"> <ion

Vue数据绑定

gitHub地址:https://github.com/lily1010/vue_learn/tree/master/lesson04 一 双括号用来数据绑定 (1)写法一: {{message}},这种可以实时响应 (2)写法二: {{*message}},单次插值,今后的数据变化就不会再引起插值更新了 (3)双括号标签也可以用在属性上 举个栗子: <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q

vue数据绑定html

html标签的纯文本显示/被当做html标签处理: 1)使用两个大括号时,假如字符串内容是html标签,那么不会被转义: 2)使用三个大括号时,字符串内的html标签会被直接转义 a.两个大括号: 1 <div id="app"> 2 {{html}} 3 </div> 4 <script> 5 var vm = new Vue({ 6 el:"#app", 7 data: { 8 html:"<span>s

Vue 数据绑定语法

数据绑定语法 Vue.js 的模板是基于 DOM 实现的.这意味着所有的 Vue.js 模板都是可解析的有效的 HTML,且通过一些特殊的特性做了增强.Vue 模板因而从根本上不同于基于字符串的模板,请记住这点. 插值 文本 数据绑定最基础的形式是文本插值,使用 “Mustache” 语法(双大括号): <span>Message: {{ msg }}</span> Mustache 标签会被相应数据对象的 msg 属性的值替换.每当这个属性变化时它也会更新. 你也可以只处理单次插

vue数据绑定原理

来点基础知识: 属性值是函数的属性叫方法. 对象就是属性和方法的集合. 我们来谈谈属性. 属性表面上来看就好像是键值对 var 我是对象 = { 我是属性名:'我是属性值' } console.log(我是对象.我是属性名)//我是属性值 然后来介绍下一个增改属性的方法Object.defineProperty() Object.defineProperty(我是对象,'我是新增属性',{ // 这个对象是用来修饰属性的,即属性的特征属性 // 就是我们看到的属性值 value:'我是新增属性的

杂记--关于vue数据绑定原理

1.vue数据双向绑定(v-model) 主要实现依赖于数据的劫持,及观察订阅者模式的使用,其中Object.defineProperty()为核心 作用:定义或修改一个对象上的相关属性及其相关的操作 语法: Object.defineProperty(obj, prop, descriptor) 其中: obj: 需要被操作的目标对象 prop: 目标对象需要定义或修改的属性的名称 descriptor: 将被定义或修改的属性的描述符,分为数据描述符or存取描述符: 用bject.define

visual studio code中使用emmet插件在.vue文件失效

使用visual studio code编辑.vue文件时,emmet插件无法使用,可以通过以下两种试解决: 1.文件→设置,在右侧窗口添加以下代码: "emmet.syntaxProfiles": { "vue-html": "html", "vue": "html" } 2.在.vue文件窗口的右下角,点击"vue"(提示信息:选择语言模式),然后选择".vue"

Vue数据绑定原理及简单实现

本篇文章中的代码只是部分片段,完整代码存放于github上https://github.com/Q-Zhan/simple-vue. 进入正文~实现数据绑定主要是要实现两个方面的功能:数据变化导致视图变化,视图变化导致数据变化.后者比较容易实现,就是监听视图的事件,然后在回调函数中改变数据.所以重点是数据变化时如何改变视图. 这里的思路是通过object.defineProperty()来对数据的属性设置一个set函数,设置后当数据改变时set函数就会被调用,我们就可以里面进行视图更新操作. 具

02 vue 数据绑定与指令

1.模板语法 在标记内通过模板语法:{{}}进行数据的绑定. {{}}内支持变量,方法名,计算属性,表达式,不支持语句. {{}}将数据解析为纯文本,如果需要解析为html,需要在标记上增加v-html指令. 2.属性绑定 在标记上,为标记属性绑定Vue数据时,不允许用模板语法,如下方式是不合法的. <!-- 错误写法 --> <a href="{{url}}">百度</a> 属性绑定需要使用vue指令v-bind实现 v-bind:属性名=&quo