1. 程式人生 > >利用ES6中的Proxy和Reflect 實現簡單的雙向數據綁定

利用ES6中的Proxy和Reflect 實現簡單的雙向數據綁定

prope tlist lec ntb col lis pan pro ref

利用ES6中的Proxy (代理) 和 Reflect 實現一個簡單的雙向數據綁定demo。

好像vue3也把 obj.defineProperty() 換成了Proxy+Reflect。

話不多說,直接上代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>proxy</title>
</head>
<body>
    <h1>使用Proxy 和 Reflect 實現雙向數據綁定</
h1> <input type="text" id="input"> <h2>您輸入的內容是: <i id="txt"></i></h2> <script> //獲取dom元素 let oInput = document.getElementById("input"); let oTxt = document.getElementById("txt"); //初始化代理對象 let obj = {};
//給obj增加代理對象 let newProxy = new Proxy(obj,{ get: (target,key,recevier)=>{ //console.log("get:"+ key) return Reflect.get(target,key,recevier); }, set: (target,key,value,recevier)=>{ //監聽newProxy是否有新的變化 if
(key == "text"){ oTxt.innerHTML = value; } //將變化反射回原有對象 return Reflect.set(target,key,value,recevier); } }) //監聽input輸入事件 oInput.addEventListener("keyup",(e)=>{ //修改代理對象的值 newProxy.text = e.target.value; }) </script> </body> </html>

實現的效果:

技術分享圖片

監聽input 的時候修改newProxy的值,檢測到newProxy 重新設置了值得時候,因為newProxy代理了obj這個對象, 所以可以調用Reflcet 反射到原obj.

所以我修改了Input 的值後,然後控制臺輸入obj,會打印出input的值。

newProxy

利用ES6中的Proxy和Reflect 實現簡單的雙向數據綁定