# 数据响应式

# Vue2 的响应式

实现原理:

  • 对象:Object.defineProperty() 拦截了存取器,对象则递归的使用该方法进行包装
  • 数组:重写数组方法

存在问题:

  • 直接增加或删除对象属性,界面不会更新
  • 通过下标修改数组元素,界面不会更新

# Vue3 的响应式

实现原理

  • Proxy 拦截对源对象的操作
  • Reflect 对源对象进行实际操作

# toRef

toRef toRefs 用于解决解构赋值丢失响应式的问题

setup(){
  // ...
  return {
    ...toRefs(person)
  }
}

# customRef

<script setup>
import { customRef } from "vue";

function myRef(value) {
  return customRef((track, trigger) => {
    return {
      get() {
        console.log("myRef.get", value);
        track(); // 追踪 订阅
        return value;
      },
      set(newV) {
        console.log("myRef.set", newV);
        value = newV;
        trigger(); // 触发 派发
      }
    };
  });
}

let keyword = myRef("Hello World!");
</script>

<template>
  <h2>CustomRef</h2>
  <input type="text" v-model="keyword" />
  <span>{{ keyword }}</span>
</template>