Vue 3.x

模拟 Vue3.x 响应式原理

2020-09-14  本文已影响0人  阿畅_
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Proxy</title>
</head>
<body>
  <div id="app">
    hello
  </div>
  <script>
    // 模拟 Vue 中的 data
    let data = {
      msg: 'hello',
      count: 10
    }
    // 模拟 Vue 实例
    let vm = new Proxy(data, {
      // 执行代理行为的函数 访问 vm 的成员会执行
      get(target, key) {
        console.log('target, key ------>', target, key)
        return target[key]
      },

      set(target, key, newVal) {
        console.log('set, key ------->', key, newVal)
        if (target[key] === newVal) {
          return
        }
        target[key] = newVal
        document.querySelector('#app').textContent = target[key]
      }
    })

    vm.msg = 'hello world'
    console.log(vm.msg)
  </script>
</body>
</html>

proxy 直接可以代理整个对象,而 defineProperty 需要手动循环代理每个对象里的每个属性

上一篇下一篇

猜你喜欢

热点阅读