在 TextField type="number" 上设置最小值/最大值?

IT技术 reactjs material-ui redux-form
2021-04-28 09:12:54

我正在使用 Material-UI v1.0.0-beta23redux-formredux-form-material-ui我有一个Field类型号,我想在标签上设置最小值和最大值。我已经尝试过inputProps最小/最大,但似乎都没有做我想要的。我查看了源代码,没有看到明显的方法来做到这一点。有可能吗,如果有,怎么做?

这是我的 JSX 展示了我尝试过的东西。

<Field
  name="maxNodeSelectedCount"
  component={TextField}
  label="Max Node Selected Count"
  type="number"
  inputProps={{ min: 0, max: 10 }}
  min={11}
  max={20}
  format={formatOption}
  normalize={normalizeOption}
  {...propertyFieldDefaults}
/>

这是 DOM 的样子:

<input type="number" class="MuiInput-input-346 MuiInput-inputSingleline-349 MuiInput-inputDense-347" value="-3" name="options.maxNodeSelectedCount">
4个回答

redux-form Field会将 props 传递给组件:

所有其他props都将传递给组件props生成的元素。

文本字段具有命名属性InputProps,其可用于props传递到输入它呈现组件。如果您使用redux-form-material-ui. 它的 TextField 只是 material-ui 组件的包装器。

material-uiInput组件有一个名为的属性inputProps ,可用于将 props 传递给input它呈现元素。

好的,那我该怎么办?

你需要一直传递 props,从Field,到TextField,到Input,到input元素。

因此,如果我们InputProps在 Field 上设置,它将传递给 TextField,后者将它传递给Input组件。如果我们传递的对象包含一个内部inputProps(有意小写的“i”),则 Input 组件会将其传递给input元素。

hot-proptato 游戏:

基本上,在其中定义一个inputProps对象InputProps并将其应用于Field

<Field
    name="maxNodeSelectedCount"
    component={TextField}
    label="Max Node Selected Count"
    type="number"
    InputProps={{ inputProps: { min: 0, max: 10 } }}
    format={formatOption}
    normalize={normalizeOption}
    {...propertyFieldDefaults}
  />
  • 字段将 InputProps 传递给 TextField
  • TextField 将 InputProps 的内容传递给Input组件
  • input 将 inputProps 的内容传递给input元素

有一个警告:

TextField当前实现设置了它自己的值,inputProps以便将inputClassName应用于input元素。

通过将您自己的 inputProps 值交给 TextField,您将覆盖由 TextField 应用的版本,保持未inputClassName设置。如果正在使用inputClassName,则需要将其包含在内部inputProps对象中。

编辑:我已经提交了一个问题拉取请求来解决未来版本中的这个警告。

只需很好地使用您的inputprops

<TextField 
    type="number"
    InputProps={{
        inputProps: { 
            max: 100, min: 10 
        }
    }}
    label="what ever"
/>

注意 inputprops 中的大小写

归功于肯·格雷戈里

您可以使用inputProps将任何属性应用于本机input元素,包括minmax

<TextField type="number" inputProps={{ min: 4, max: 10 }} />

编辑:请注意min/max属性不会阻止用户在TextField. 要限制用户可以键入的内容,您可以通过添加onclick如下处理程序来验证该值

const min = 0;
const max = 10;

export default function BasicTextFields() {
  const [value, setValue] = useState<number>();

  return (
    <div>
      <TextField
        type="number"
        inputProps={{ min, max }}
        value={value}
        onChange={(e) => {
          var value = parseInt(e.target.value, 10);

          if (value > max) value = max;
          if (value < min) value = min;

          setValue(value);
        }}
      />
    </div>
  );
}

编辑 47798104/set-min-max-on-textfield-type-number

其他答案对我不起作用。

Material UI在此处有一个用于 3rd 方集成的部分

它确实可以只写数字并且不允许负数。

import NumberFormat from 'react-number-format';

function NumberFormatCustom(props) {
    const { inputRef, onChange, ...other } = props;
    
     return (
            <NumberFormat
                {...other}
                getInputRef={inputRef}
                allowNegative={false}
                onValueChange={(values) => {
                    onChange({
                        target: {
                            name: props.name,
                            value: values.value,
                        },
                    });
                }}
                isNumericString
            />
        );
}
    
<TextField
    label="react-number-format"
    value={values.numberformat}
    onChange={handleChange}
    name="numberformat"
    id="formatted-numberformat-input"
    InputProps={{
          inputComponent: NumberFormatCustom,
     }}
/>