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

Mantine中如何将use-form与Select组件结合处理数值类型选项?

优雅解决Mantine Select与数值类型表单值的兼容问题

方案1:通过useForm的parse/transform全局自动转换

在初始化表单时配置类型转换规则,让表单内部自动处理字符串与数值的双向映射,无需手动修改每个字段:

const form = useForm({
  initialValues: { 
    option: 1 // 数据库返回的数值类型
  },
  // 初始化/设置值时,将数值转为字符串适配Select组件
  parse: (values) => ({
    ...values,
    option: String(values.option)
  }),
  // 提交表单时,将字符串转回数值存入数据库
  transform: (values) => ({
    ...values,
    option: Number(values.option)
  })
});

配置后,表单内部维护的是字符串类型(适配Select),提交时自动转为数值,完全不需要在组件层面手动处理转换。

方案2:用Controller组件实现单字段精准控制

如果只需要针对单个Select做处理,使用Controller组件包裹Select,显式处理值的双向转换:

import { Controller } from '@mantine/form';

// 组件内使用
<Controller
  name="option"
  control={form.control}
  render={({ field }) => (
    <Select
      label="Option"
      value={String(field.value)}
      onChange={(selectedValue) => field.onChange(Number(selectedValue))}
      {/* 其他Select配置项 */}
    />
  )}
/>

方案3:封装通用NumberSelect组件复用转换逻辑

如果项目中有多个类似场景,封装一个通用组件统一处理数值与字符串的转换,避免重复代码:

import { Select } from '@mantine/core';

const NumberSelect = (props) => {
  return (
    <Select
      {...props}
      value={String(props.value)}
      onChange={(value) => props.onChange?.(Number(value))}
    />
  );
};

// 使用时直接替换原Select
<NumberSelect
  label="Option"
  {...form.getInputProps("option")}
/>

内容的提问来源于stack exchange,提问作者K. D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:54:23