美文网首页
Vue响应式原理之——Object.defineProperty

Vue响应式原理之——Object.defineProperty

作者: 李牧敲代码 | 来源:发表于2018-12-10 21:09 被阅读0次
先了解一下Object.defineProperty()这个方法:

这个方法主要是用

直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
先写一个demo

    let person = {
        _data: {
            name: 'wcx',
            age: 122
        }
    }
    Object.defineProperty(person, 'name', {
        get() {
            console.log(`name被获取了`);
            console.log(person);
            return person._data.name
        },
        set(value) {
            console.log(`name的值被修改了`)
            person._data.name = value;
            console.log(person);
        }
    })

这段代码可以直接写在HTML的<script>标签里,然后用浏览器运行这个HTML。接着,你可以打开F12控制台,在控制台里输入person['name']和 person['name']=‘wry’

图1.1
可以看到,Object.defineProperty可以监听到属性被获取和修改,这也就意味着你能做很多“数据驱动的事”,比如说双向绑定
什么是双向绑定?

单向绑定就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新。
而双向绑定就是如果用户更新了View,Model的数据也自动被更新了,这种情况就是双向绑定。

下面我们就实现下双向绑定:

<body>
    <form action="" class="form">
        <p>name: <input type="text" name="name"></p>
        <p>age: <input type="text" name="age"></p>
        <p>name_result: <input type="text" class="name"></p>
        <p>age_result: <input type="text" class="age"></p>
    </form>
<script>
    let person = {
        _data: {
            name: 'wcx',
            age: 13
        }
    }
    Object.defineProperty(person, 'name', {
        get() {
            console.log(`name被获取了`);
            console.log(person);
            return person._data.name
        },
        set(value) {
            console.log(`name的值被修改了`)
            person._data.name = value;
            console.log(person);            
        }
    })
    Object.defineProperty(person, 'age', {
        get() {
            console.log(`age被获取了`);
            console.log(person);
            return person._data.age
        },
        set(value) {
            console.log(`age的值被修改了`)
            person._data.age = value;
            console.log(person);            
        }
    })
    let form = document.querySelector('.form');
    form.addEventListener('input', (e) => {
        let _value = e.target.value;
        let nameDom = document.querySelector('.name');
        nameDom.value = _value;
        person['name'] = _value;
        console.log('person', person)
    })
</script>
</body>
image.png

可以看到在name输入框输入的值会影响到person里name的值,这样双向绑定就实现了。name_result主要是为了更方便的展示结果,不写也没关系。

(完)

相关文章

  • 深入 Vue3 源码,学习响应式原理

    Vue2 响应式原理 学过 Vue2 的话应该知道响应式原理是由 Object.defineProperty 对数...

  • Vue响应式基本原理

    Vue响应式系统基本原理 Object.defineProperty Object.defineProperty(...

  • Vue 数据双向绑定

    1.响应式原理 Vue的响应式原理依赖于Object.defineProperty,这也是Vue不支持IE8 以及...

  • 双向绑定

    数据响应式原理 vue实现数据响应式的原理就是利用了Object.defineProperty(),重新定义了对象...

  • Vue原理学习(二)

    响应式系统的基本原理 Vue基于Object.defineProperty来实现响应式,对于Object.defi...

  • js实用技巧

    vue相关 vue2.x的响应式 实现原理 。对象类型:通过Object.defineProperty()对属性的...

  • Vue原理学习(三)

    响应式依赖收集原理 在Vue原理学习 (二)中,介绍Object.defineProperty中的[[Getter...

  • Vue 2.0响应式原理

    Vue 2.0响应式原理:首先把data里的所有属性都用Object.defineProperty定义getter...

  • vue响应式原理:从defineReactive学习Object

    众所周知,vue响应式原理就是用的Object.defineProperty方法去定义setter和getter的...

  • Vue3新特性笔记

    vue3.0的主要变化 响应式基本原理:Object.defineProperty -> Proxy,提高性能 初...

网友评论

      本文标题:Vue响应式原理之——Object.defineProperty

      本文链接:https://www.haomeiwen.com/subject/txsdhqtx.html