v-mode双向绑定原理

136 阅读1分钟
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <input type="text" v-mode="msg" />
    <p v-mode="msg"></p>
    <script>
      const data = {
        msg: "你好",
      };
      const input = document.querySelector("input");
      const p = document.querySelector("p");
      input.value = data.msg;
      p.innerHTML = data.msg;
      //(1)以input为例:当输入发生变化之后,input事件会监听到输入从而调用回调函数
      //从而给data.msg赋值,这是视图到数据方向的数据绑定
      input.addEventListener("input", function () {
        data.msg = input.value;
      });
      //(2)由于Object.defineProperty()方法定义了data.msg的set和get方法,
      //每当使用data.msg给msg赋值的时候会调用set方法给input.value赋值
      //从而更新了视图,这是数据到视图方向的绑定
      // (1)(2)结合起来就是双向绑定了
      let temp = data.msg;
      Object.defineProperty(data, "msg", {
        get() {
          return temp;
        },
        set(value) {
          temp = value;
          //视图修改
          input.value = temp;
          p.innerHTML = temp;
        },
      });
      data.msg = "小李";
    </script>
  </body>
</html>