【问题标题】:Add suffix follow by user input material ui TextField添加后缀跟随用户输入材料ui TextField
【发布时间】:2019-02-15 03:05:11
【问题描述】:

我想创建当用户键入后跟输入装饰时具有值的 TextField 元素。

是否可以在值后添加 % 符号而不是输入结尾?

目前百分号(%)在用户输入之前位于输入的开头,如果有值将转到输入的结尾。

<TextField
{...defaultProps}
InputProps={{
    startAdornment: this.state.percentage ? (
        <span />
    ) : (
        <InputAdornment position='start'>%</InputAdornment>
    ),
    endAdornment: this.state.percentage ? (
        <InputAdornment position='end'>%</InputAdornment>
    ) : (
        <span />
    ),
    classes: defaultInputClasses
}}
error={this.state.percentageError ? true : false}
fullWidth
helperText={this.state.percentageError ? 'percentage must be between 1-100' : ''}
id='percentage'
label='percentage'
margin='normal'
name='percentage'
onChange={this.handleChange}
value={this.state.percentage}

/>

初始状态

用户输入时的当前状态

预期

【问题讨论】:

    标签: javascript reactjs material-ui


    【解决方案1】:

    我认为装饰不是解决这个问题的最佳方法。相反,您应该查看文档中的 Integration with 3rd party input libraries 示例。

    这里是使用“react-number-format”包添加 % 后缀的演示的 TypeScript 代码的修改版本:

    import * as React from "react";
    import NumberFormat from "react-number-format";
    import TextField from "@mui/material/TextField";
    
    interface CustomProps {
      onChange: (event: { target: { name: string; value: string } }) => void;
      name: string;
    }
    
    const NumberFormatCustom = React.forwardRef<NumberFormat, CustomProps>(
      function NumberFormatCustom(props, ref) {
        const { onChange, ...other } = props;
    
        return (
          <NumberFormat
            {...other}
            getInputRef={ref}
            onValueChange={(values) => {
              onChange({
                target: {
                  name: props.name,
                  value: values.value
                }
              });
            }}
            thousandSeparator
            isNumericString
            suffix="%"
          />
        );
      }
    );
    
    interface State {
      numberformat: string;
    }
    
    export default function FormattedInputs() {
      const [values, setValues] = React.useState<State>({
        numberformat: "90"
      });
    
      const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
        setValues({
          ...values,
          [event.target.name]: event.target.value
        });
      };
    
      return (
        <TextField
          sx={{ maxWidth: 120 }}
          label="Percentage"
          value={values.numberformat}
          onChange={handleChange}
          name="numberformat"
          id="formatted-numberformat-input"
          InputProps={{
            inputComponent: NumberFormatCustom as any
          }}
          variant="standard"
        />
      );
    }
    

    【讨论】:

    • 如何使用 Typescript 而不是 Javascript 来做到这一点?
    • @NiklasWeber 您使用的是哪个版本的 MUI? v4 还是 v5?
    • 我正在使用 MUI v5
    • @NiklasWeber 我已将示例更新为 v5 TypeScript。此示例与文档示例之间的唯一区别是将prefix="$" 替换为suffix="%",然后我删除了演示的react-imask 部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2023-04-04
    • 2015-12-10
    • 2020-02-27
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多