{T}

响应式数据实现原理

响应式数据实现的原理:利用 JS 的 Proxy 对象。

Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,其实就是直接监控值的修改,当值发生改变的时候,可以监控到。id 元素可以不用获取

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="/vue.global.js"></script>
  </head>
  <body>
    <div id="app"></div>
    <script>
      let data = {
        message: "hello world"
      }

      data = new Proxy(data, {
        // set 方法用于拦截某个属性的赋值操作,可以接受四个参数,依次为目标对象、属性、属性值和 Proxy 实例本身,其中最后一个参数可选。
        set(target, key, value) {
          console.log(target, key, value)
          app.innerHTML = value
        },
        // get 方法用于拦截某个属性的读取操作,可以接受三个参数,依次为目标对象、属性和 Proxy 实例本身,其中最后一个参数可选。
        get(target) {
          console.log("get")
          console.log("target", target)
          return target.message
        }
      })

      // 代理对象,会触发 data 的 get 方法
      app.innerHTML = data.message

      setTimeout(() => {
        // 代理对象,会触发 data 的 set 方法
        data.message = "hi vue"
      }, 2000)
    </script>
  </body>
</html>