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

在Mantine Form中使用自定义onChange事件实现表单响应式逻辑

Mantine Form 字段联动更新的优化方案

你当前的写法确实能实现需求,但有更简洁优雅的实现方式,下面推荐几种优化方案:

方案一:全局值变化监听(onValuesChange)

Mantine Form 内置了onValuesChange配置项,可全局监听所有字段值的变化,把联动逻辑统一放在表单配置中,无需给单个组件绑定自定义onChange:

const form = useForm({
  initialValues: {
    accounts: { user: '' },
    other: { property: { associated: { with: { user: '' } } } }
  },
  onValuesChange: (values, prevValues) => {
    // 仅在accounts.user字段变化时触发联动
    if (values.accounts.user !== prevValues.accounts.user) {
      form.setFieldValue('other.property.associated.with.user', values.accounts.user);
    }
  }
});

// 组件直接使用getInputProps即可,无需额外处理
<Select label="User" data={users} {...form.getInputProps('accounts.user')} />

这种方式让组件代码更干净,适合多字段联动的场景。

方案二:简化组件内的onChange逻辑

如果只针对单个字段做联动,可以简化自定义onChange的写法,避免重复调用内置方法:

<Select 
  label="User"
  data={users}
  {...form.getInputProps('accounts.user', {
    onChange: (event) => {
      // 先调用表单内置逻辑更新字段值
      form.getInputProps('accounts.user').onChange(event);
      // 再执行联动更新
      form.setFieldValue('other.property.associated.with.user', event.target.value);
    }
  })}
/>

或者更直接的写法,直接调用form.onChange同时更新两个字段:

<Select 
  label="User"
  data={users}
  value={form.values.accounts.user}
  onChange={(value) => {
    form.onChange('accounts.user', value);
    form.onChange('other.property.associated.with.user', value);
  }}
/>

方案三:使用useEffect监听字段变化

通过useEffect监听目标字段的变化,值改变时自动更新关联字段,逻辑分离更清晰:

const form = useForm({
  initialValues: {
    accounts: { user: '' },
    other: { property: { associated: { with: { user: '' } } } }
  }
});

useEffect(() => {
  form.setFieldValue('other.property.associated.with.user', form.values.accounts.user);
}, [form.values.accounts.user]);

// 组件正常使用即可
<Select label="User" data={users} {...form.getInputProps('accounts.user')} />

以上三种方案各有适用场景:方案一适合全局多字段联动,方案二适合单个字段的简单联动,方案三适合需要额外异步逻辑或复杂处理的场景,你可以根据实际需求选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:10:47