仿照ref()API源码,新增一个enhancedRef()API

源码:

当仿照Vue 3的ref API编写新代码时,你可以考虑创建一个名为enhancedRef的新功能。这个功能将提供一些复杂、有意义并且在开发中经常使用的功能。

enhancedRef
enhancedRef是一个增强版的ref,它允许你执行诸如数据验证、自动更新相关数据或者触发回调等操作。以下是一个示例实现:


import { reactive, Ref, UnwrapRef } from 'vue';

type Validator<T> = (value: T) => boolean;

function enhancedRef<T>(initialValue: T, validator?: Validator<T>): {
  value: Ref<T>,
  isValid: Ref<boolean>,
  set: (value: T) => void,
  reset: () => void,
  onInvalid: (callback: () => void) => void
} {
  const value = reactive({
    data: initialValue,
    isValid: true
  });

  function set(newValue: T) {
    if (validator && !validator(newValue)) {
      value.isValid = false;
      // Trigger callback for invalid value
      onInvalidCallbacks.forEach(callback => callback());
    } else {
      value.data = newValue;
      value.isValid = true;
    }
  }

  function reset() {
    value.data = initialValue;
    value.isValid = true;
  }

  const onInvalidCallbacks: Array<() => void> = [];
  function onInvalid(callback: () => void) {
    onInvalidCallbacks.push(callback);
  }

  return {
    value: value.data,
    isValid: value.isValid,
    set,
    reset,
    onInvalid
  };
}
示例用法
// 基本用法
const name = enhancedRef('John');
console.log(name.value); // 输出 'John'

// 数据验证
const age = enhancedRef(25, (val) => val >= 0 && val <= 120);
age.set(130); // 触发无效值回调

age.onInvalid(() => {
  console.log("Invalid age!");
});

// 自动更新
const count = enhancedRef(0);
count.set(count.value + 1); // 自动更新值

// 重置
count.reset();
console.log(count.value); // 输出 0
以上示例展示了enhancedRef的基本用法以及其包含的功能,包括数据验证、自动更新和回调。这种类型的功能对于需要更精细控制数据流的应用程序非常有用

使用场景及用法:

// 创建一个带有数据验证的 enhancedRef
const age = enhancedRef(25, (val) => val >= 0 && val <= 120);

// 设置一个有效的年龄值
age.set(30);
console.log(age.value); // 输出 30
console.log(age.isValid); // 输出 true

// 设置一个无效的年龄值
age.set(150); // 触发无效值回调
console.log(age.value); // 输出 30(未改变)
console.log(age.isValid); // 输出 false

        我们创建了一个带有数据验证功能的 enhancedRef 变量 age。当我们尝试设置一个超出范围的值时,它会触发无效值回调,并且不会改变当前的值。这样可以确保我们的数据始终保持有效,并且可以根据需要执行相应的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值