还不知道Vue双向绑定么??简单的代码 理清逻辑~

278 阅读2分钟

每天学一点,开车更稳哦~

老生常谈vue双向绑定怎么实现的?~~~~晕菜  ,自己的一点小理解~

首先我们先来拿input举例子:

<input id='text' />
<div id='app'></div><script>
     function updated() {            document.getElementById("app").textContent = data.text        }        updated()        //1.绑定input事件,在数据更新后更新视图         var textElm = document.getElementById('text')         textElm.value=data.text         textElm.addEventListener('input',function(){             data.text =this.value             updated()         })
</script>

这样此刻利用input完成数据实时通讯,但是不能直接改变,接下来我们将input取消,

监听数据 实现数据监听 ---objecet.definedProperty
/*
Object.defineProperty(obj, prop, descriptor) 接收三个参数,obj:要定义属性的对象,prop:要定义或修改的名称,可以srting或symbol descriptor:要定义或修改的属性描述符,必须是object

*/
<div id='app'></div>
<script>
 var data = {            text: "hello"        }        function updated() {            document.getElementById("app").textContent = data.text        }

  var text = data.text        Object.defineProperty(data, 'text', {            get: function () {                return text            },            set: function (newValue) {                console.log(newValue, 44)                if (text !== newValue) {                    text = newValue                    updated()                }            }        }) //实现更新  set get
</script>

~~嗯哼~搞定喽,但是小伙伴们,这个可不是详细的,只是和大家捋一下思路,大概思路哦,

具体的写法还是要参考文档呢~~

Vue3.0好恐怖哦,还在2.0挣扎的我要怎样接受3.0?晕菜,但还是要努力哦

3.0将 Object.defineProperty替换为proxy 我们先来看了解proxy用法

  const proxy = new Proxy(targer, handle)
** target**: 需要代理的目标对象。可以是任何类型的对象,包括原生数组,函数,甚至另一个代理
**handler**: 以函数作为属性的对象。属性中的函数分别定义了在对 proxy 实例执行各种操作的自定义行为
**handelr** 对象支持的方法(通常被称为traps,中文翻译为陷阱,可以理解为钩子或者执行某项操作的回调函数)有:
**get**: 读取属性值时调用
**set**: 对属性赋值时调用
**has**: 使用in操作符时调用
**deleteProperty**: 使用delete操作符时调用
**ownKeys**: 使用Object.getOwnPropertyNames方法和Object.getOwnPropertySymbols方法时调用
**apply**: 函数调用操作时调用
**construct**: 使用new操作符时调用
**defineProperty**: 使用Object.defineProperty方法时调用
**getOwnPropertyDescriptor**: 使用Object.getOwnPropertyDescriptor方法时调用
**getPrototypeOf**: 使用Object.getPrototypeOf方法时调用
**setPrototypeOf**: 使用Object.setPrototypeOf方法时调用
**isExtensible**: 使用Object.isExtensible方法时调用
**preventExtensions**: 使用Object.preventExtensions方法时调用
可以看到Proxy对对象自定义行为的控制比Object.defineProperty更加全面。这里,我们重点关注和后者相同部分,即get和set。虽然名称都是get和set,但方法的传参不同。Object.defineProperty是针对对象的某个属性定义get和set,而Proxy是针对整个对象。并且通过Proxy构造函数返回的是一个proxy实例,而不是原对象。因此,Proxy中的get和set参数比Object.defineProperty的多了两个参数:
**obj**: 要代理的目标对象,即 target
**key**: 代理对象访问或设置的属性

接下来我们根据以上api进行写入代码:

<div id='app'></div>
<script>
  var data = {            text: 'hello'        }
 function reactive(target, update) {            var targetProxy = new Proxy(target, {                get(obj, key) {                    return obj[key]                },                set(obj, key, newValue) {                    obj[key] = newValue                    //表示成功                    update()                    return true                }            })            return targetProxy        }  var dataProxy = reactive(data, update)         function update() {            document.getElementById('app').textContent = dataProxy.text        }     update()
</script>

看逻辑貌似是一样的欸~~

了解ProxyObject.defineProperty的具体操作 ,看到有很多大佬已经给出了具体的指示,我只作为一个前端的小菜鸟,我自己的学习思路在这里记录下来,还是希望能够得到大佬的指点~~