vue3手写ref深的ref

Posted web半晨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue3手写ref深的ref相关的知识,希望对你有一定的参考价值。


1、函数实现

// 定义一个reactive函数,传入一个目标对象
function reactive(target) 
  // 判断当前的目标对象是不是object类型(对象/数组)
  if (target && typeof target === 'object') 
    // 对数组或者是对象中所有的数据进行reactive的递归处理
    // 先判断当前的数据是不是数组
    if (Array.isArray(target)) 
      // 数组的数据要进行遍历操作0
      target.forEach((item, index) => 
        // 如果数组中还有数组
        // 使用递归
        target[index] = reactive(item);
      );
     else 
      // 再判断当前的数据是不是对象
      // 对象的数据也要进行遍历的操作
      Object.keys(target).forEach(key => 
        target[key] = reactive(target[key]);
      );
    
    return new Proxy(target, reactiveHandler);
  
  // 如果传入的数据是基本类型的数据,那么就直接返回
  return target;


// 定义一个ref函数
function ref(target) 
  target = reactive(target);
  return 
    _is_ref: true, // 标识当前的对象是ref对象
    // 保存target数据保存起来
    _value: target,
    get value() 
      console.log('劫持到了读取数据');
      return this._value;
    ,
    set value(val) 
      console.log('劫持到了修改数据,准备更新界面', val);
      this._value = val;
    
  


2、函数调用

const ref2 = ref(
      name: '小明',
      car: 
        color: 'red'
      
);
console.log(ref2.value);
// 劫持到
ref2.value = '==';
// 劫持到
ref2.value.car = '==';

以上是关于vue3手写ref深的ref的主要内容,如果未能解决你的问题,请参考以下文章

手写vue3源码——ref, computed 等

手写vue3源码——ref, computed 等

vue3手写shallowRef浅的ref

vue3手写isRefisReactiveisReadonlyisProxy

vue3手写reactive深的劫持深的监视深的响应数据

vue3源码分析——实现组件的挂载流程