美文网首页
EcmaScript6 Proxy代理实现Vue.Js双向绑定

EcmaScript6 Proxy代理实现Vue.Js双向绑定

作者: LeeYaMaster | 来源:发表于2019-05-20 21:36 被阅读0次

首先,我们先来看一下Vue实现双向绑定的代码:


Vue双向绑定
<div id="app">
    <p>{{ message }}</p>
    <input v-model="message">
</div>
<script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>
<script>
new Vue({
  el: '#app',
  data: {
    message: 'Runoob!'
  }
})
</script>

感觉蛮有意思的,想自己用Js实现一遍,想到了定义一个对象,输入表单后,这对象增加值,然后监听,进行改变,于是便想到了ES5里面的一个方法defineProperty。
代码如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>双向绑定</title>
    </head>
    <body>
        <p>
            表单的值为:<span id="value"></span>
        </p>
        <input type="text" onkeyup="onKeyUp(event)" id="inputValue">
        <script>
            {
                const obj = {
                    value: ""
                }
                function onKeyUp(event) {
                    obj.value = event.target.value
                }
                //拦截obj的value属性
                Object.defineProperty(obj, 'value', {
                    get: function() {
                        return value
                    },
                    set: function(newValue) {
                        value = newValue;
                        document.getElementById('value').innerHTML = newValue;
                        document.getElementById('inputValue').value = newValue;
                    }
                })
            }
        </script>
    </body>
</html>
ES5实现原理

然后ES6语法,采用Proxy代理,观察者模式,Proxy可以拦截很多种方法,详情可见我上一篇博客。现在来看代码:

            const obj = {}
            const newObj = new Proxy(obj, {
                get: function(target, key, receiver) {
                    return Reflect.get(target, key, receiver)
                },
                set: function(target, key, value, receiver) {
                    if(key === 'value') {
                        document.getElementById('value').innerHTML = newValue;
                        document.getElementById('inputValue').value = newValue;
                    }
                    return Reflect.set(target, key, value, receiver)
                }
            })

            function onKeyUp(event) {
                newObj.value = event.target.value
            }

于是这样,Vue的双向绑定就完成啦!

相关文章

网友评论

      本文标题:EcmaScript6 Proxy代理实现Vue.Js双向绑定

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