双向指的是什么 所谓的双向绑定指的是 数据M和视图V之间的相互影响
数据 => 视图 通过Object.defineProperty劫持数据 数据的变化我们就可以同步到视图中
视图 => 数据 监听事件触发 在事件的回调函数中 拿到用户输入的最新的值 反向赋值给视图依赖的数据
总结双向绑定指的就是数据和视图之间的项目影响,分为两种情况
一种数据驱动视图,他是它通过object.defindProperty劫持数据让数据变成响应式的 在数据变化的时候ste函数内使用最新的数据重新渲染数据
另一种是视图驱动数据,通过监听事件,在回调中通过e.target拿到用户输入的值反向赋值给依赖的数据
我自己也写过一个基础的双向绑定 通过input模拟的
通过object.defindeProperty set和get两个方法来实现
当数据发生变化的时候他会自动执行set方法 在方法内将数据赋值到input的value中 这样就达到了数据驱动视图
视图变化的时候我使用input事件监听,在回调中通过e.target获取到输入的值赋值给数据 然后在set中通过一个中间变量获取到这个新值 这样get方法内return它 这样就能同步获取到视图的数据
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><!-- 输入框 视图 V --><input type="text"></body><script>// 数据 Mlet data = {name:'老韩'}// 中间变量let _name// 第一个参数操作的数据 第二个是操作的属性// 第三个是配置项{get(),set()}Object.defineProperty(data,'name',{// 获取属性的时候自动执行// get的返回值决定了操作属性的值 如果没有return只会获取到一个undefinedget() {console.log('name被获取了');// 这里的返回值是视图中的最新数据return _name},// 修改属性的时候自动执行 参数是修改后的值set(newValue) {console.log('name被修改了');// 视图中修改数据的时候这里就赋值给中间变量 他的返回值就会是最新的视图数据_name = newValue// 数据一修改 就对视图重新赋值document.querySelector('input').value = newValue}})// 事件监听document.querySelector('input').addEventListener('input',(e) => {// input事件 用户输入的时候执行这个回调console.log(e.target.value);// 修改name为视图的最新数据 自动执行set方法 借助中间变量 联动get返回最新的视图数据data.name = e.target.value})</script></html>
