最近在学习ES6的Proxy,想通过Proxy的set拦截实现修改数据后自动刷新DOM的一个小功能,但是遇见了“Uncaught TypeError: 'set' on proxy: trap returned falsish for property **”错误。截图如下:
我的代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ES6 Proxy</title> </head> <body> <h2 id="title"></h2> <div id="descript"></div> <script type="text/javascript"> // 封装一下 // 数据绑定,当某些数据改变时候同步更新dom class DomAutoFlush { constructor(data) { this.data = new Proxy(data, { set: function(target, property, value) { target[property] = value; // 更新Dom let docObj = document.getElementById(property); docObj.innerHTML = target[property]; } }); } setData(argData) { for(let item in argData) { let val = argData[item]; try { if(val !== this.data[item]) { this.data[item] = val; } } catch(e) { console.error(e) } } } } // 定义我们的数据 let obj = new DomAutoFlush({ title: '', descript: '' }); // 定时更新数据代理数据 proxyData,有代理对象内部去更新Dom setInterval(function(){ obj.setData({ title: new Date().toLocaleString(), descript: new Date().toLocaleTimeString() }); }, 1000); </script> </body> </html>
在网上Google了很久,原来是我在Proxy的set中没有返回值。返回true表示设置成功,false表示设置失败。修改Proxy代码如下:
constructor(data) { this.data = new Proxy(data, { set: function(target, property, value) { target[property] = value; // 更新Dom let docObj = document.getElementById(property); docObj.innerHTML = target[property]; // ##### 就是这行代码 ##### return true; } }); }
问题就解决了。