vue数据双向绑定实现
1.vue2.0数据劫持defineProperty之后,结合发布订阅这模式
缺点:不能监听数组变化,必须遍历对象的每个属性,必须深层遍历嵌套的对象
2.vue3.0数据代理proxy 可以直接监听对象,数组(而非属性)
简单实现,通过Object对象的 defineProperty属性,重写data的get和set方法
<!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> <!-- 视图 --> <div id="app"> <h1>{{msg}}</h1> </div> <script> // 模板 let data = { msg: 'hello msg', _data: {} } // 设置特性 Reflect.defineProperty(data, 'msg', { // 取值器 get() { console.log('get', this, arguments); // 获取备份对象 return this._data.msg; }, // 赋值器 set(val) { console.log('set', this, arguments); // 设置备份对象 this._data.msg = val; //视图显示 updataView(this._data); } }) let tpl = document.getElementById('app').innerHTML; function updataView(data) { let html = tpl.replace(/{{(\w+)}}/, (match, $1) => { return data[$1]; }) document.getElementById('app').innerHTML = html; } // 设置 触发赋值器 data.msg = 'hello world'; // 读取 触发取值器 console.log(data.msg); </script> </body> </html>
<!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> <input type="text" id="username"/> <p id="uName"></p> <script> let obj = {} Object.defineProperty(obj, 'username', { // 取值 get: function() { console.log('取值'); }, set: function(val) { console.log('设置值'); document.getElementById('uName').innerText = val; } }) document.getElementById('username').addEventListener("keyup", function(){ //event obj.username = event.target.value; }) </script> </body> </html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律