【Vue2】最基礎的原理

Vue2.X 雙向數據綁定使用的是 Object.defineProperty(),Vue3 使用的是 Proxy

Object.defineProperty()

Object.defineProperty(obj, prop, descriptor)
obj 要定義屬性的對象。
prop 要定義或修改的屬性的名稱或 Symbol 。
descriptor 要定義或修改的屬性描述符。

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <input class="inp-text" type="text">
    <div class="text-box"></div>
  </body>
  <script>
    let obj = {};
    Object.defineProperty(obj, 'name', {
        set: function(newValue){
            console.log('觸發(fā)setter');
            document.querySelector('.text-box').innerHTML = newValue;
            document.querySelector('.inp-text').value = newValue;
        },
        get: function(){
            console.log('觸發(fā)getter');
        }
    });
    document.querySelector('.inp-text').addEventListener('input', function(e){
        obj.name = e.target.value;
    }, false);
  </script>
</html>
Proxy

const p = new Proxy(target, handler)
target 要使用 Proxy 包裝的目標對象(可以是任何類型的對象,包括原生數組,函數,甚至另一個代理)。
handler 一個通常以函數作為屬性的對象,各屬性中的函數分別定義了在執(zhí)行各種操作時代理 p 的行為。

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <div id="div1">
      <input type="text" v-model="name"><br>
      姓名:{{name}}<br>
      年齡:{{age}}
    </div>
  </body>
  <script>
  let el=document.getElementById('div1');
  let template=el.innerHTML;
  let _data={
    name: 'liangzai',
    age: 18
  };
  let data=new Proxy(_data, {
    set(obj, name, value){
      //alert(`有人視圖設置 ${name}=>${value}`);
      obj[name]=value;
      //數據變了
      //console.log('數據變了');
      render();
    }
  });
  render();
  function render(){
    //渲染
    el.innerHTML=template.replace(/\{\{\w+\}\}/g, str=>{
      str=str.substring(2, str.length-2);
      return _data[str];
    });
    //找所有的v-model
    Array.from(el.getElementsByTagName('input'))
      .filter(ele=>ele.getAttribute('v-model'))
      .forEach(input=>{
        let name=input.getAttribute('v-model');
        input.value=_data[name];
        input.oninput=function (){
          console.log(1)
          data[name]=this.value;
        };
      });
  }
  </script>
</html>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容