vue 2.0與3.0的雙向數據綁定實現原理


一、vue 2.0雙向數據綁定

  在vue2.0中實現雙向數據綁定,主要通過數據劫持的方式來實現。通過Object.defineProperty來劫持對象屬性的gettersetter操作,當數據發生變化時發出通知。

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8" />
 5         <title>vue2.0實現雙向綁定</title>
 6     </head>
 7     <body>
 8         姓名:<span id="spanName"></span>
 9         <br/>
10         <input type="text" id="inputName"/>
11     </body>
12     <script>
13         let obj={
14             name:''
15         }
16         let newObj = JSON.parse(JSON.stringify(obj));  //進行深拷貝
17         
18         // 數據劫持
19         Object.defineProperty(obj,'name',{   //監聽obj中的name屬性
20             get(){
21                 return newObj.name;     //不能直接返回obj.name防止無限循環
22             },
23             set(val){
24                 if(val === newObj.name)  return;     //如果相同就不進行賦值   
25                 newObj.name = val;
26                 setInner()  
27             }
28         })
29         
30          //設置頁面元素的值
31         function setInner(){ 
32             spanName.innerHTML = obj.name;   
33             inputName.value = obj.name;
34         }
35         
36         //監聽input的輸入,設置obj中name的值
37         inputName.oninput = function (){
38             obj.name = this.value
39         }
40     
41     </script>
42 </html>

二、vue 3.0雙向數據綁定

  3.0的雙向綁定的實現比2.0更加簡單,是通過es6語法中的proxy代理來進行實現。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>vue3.0實現雙向綁定</title>
    </head>
    <body>
        姓名:<span id="spanName"></span>
        <br/>
        <input type="text" id="inputName"/>
    </body>
    <script>
        let obj = {};
        
        obj = new Proxy(obj,{
            get(target,prop){
                return target[prop]
            },
            // target 原先的值   prop代表對象的key值  value最新的值['']
            set(target,prop,value){
                target[prop] = value;
                setInner()
            }
        })
        
        
        
         //設置頁面元素的值
        function setInner(){ 
            spanName.innerHTML = obj.name;   
            inputName.value = obj.name;
        }
        
        //監聽input的輸入,設置obj中name的值
        inputName.oninput = function (){
            obj.name = this.value
        }
    
    </script>
</html>

三、相比於vue2.x,使用proxy的優勢如下

  • 1 defineProperty只能監聽某個屬性,不能對全對象監聽
  • 2 可以省去for in、閉包等內容來提升效率(直接綁定整個對象即可)
  • 3 可以監聽數組,不用再去單獨的對數組做特異性操作
  • vue3.x可以檢測到數組內部數據的變化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM