You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript重构set函数:支持单/多键值对更新Vue组件modelValue

解决Vue组件中set()函数批量更新modelValue的问题

问题核心

原set()函数每次调用都基于原始props.modelValue生成新对象,连续两次调用会导致第一次的修改被覆盖(因为第二次还是从原始值扩展)。你的重构尝试传入数组后直接展开,会把数组索引作为键,无法正确合并目标键值对。

可行解决方案

重构set()函数,使其同时支持单个键值更新和批量键值更新,且保证类型安全:

1. 定义复用类型(可选但推荐)

先提取配置键和值的类型,方便后续维护:

type ConfigKey = 'type' | 'color' | 'stroke' | 'isDarkMode' | 'randomColor';
type ConfigValue = string | boolean;

2. 重构set()函数

使用TypeScript函数重载实现双模式支持:

const emit = defineEmits(['update:modelValue']);

// 函数重载声明
function set(prop: ConfigKey, value: ConfigValue): void;
function set(updates: Partial<Record<ConfigKey, ConfigValue>>): void;

// 函数实现
function set(arg1: ConfigKey | Partial<Record<ConfigKey, ConfigValue>>, arg2?: ConfigValue) {
  let updates: Partial<Record<ConfigKey, ConfigValue>> = {};
  
  if (typeof arg1 === 'string') {
    // 单个键值更新模式
    updates[arg1] = arg2!;
  } else {
    // 批量更新模式
    updates = arg1;
  }
  
  // 合并原始值与更新项,触发事件
  emit('update:modelValue', { ...props.modelValue, ...updates });
}

3. 修改批量更新的调用方式

直接传入键值对对象即可,无需数组:

function setRandomColor() {
  const randomColor = getRandomColor();
  set({ color: randomColor, randomColor: true });
}

function setColor(c: string) {
  set({ color: c, randomColor: false });
}

4. 兼容原有单个调用

原有的单个键值调用无需修改,比如:

// 依然可以正常使用
set('type', 'print');
set('isDarkMode', true);

为什么你的重构尝试失败?

你传入的是包含prop和value的对象数组,直接展开数组到对象中时,JavaScript会把数组的**索引(0、1)**作为键,生成的对象结构是:

{
  ...props.modelValue,
  0: { prop: 'color', value: '#xxx' },
  1: { prop: 'randomColor', value: true }
}

这显然不是你需要的键值对结构,因此无法正确更新modelValue。

内容的提问来源于stack exchange,提问作者LovelyAndy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:20:35