【问题标题】:React - Material UI - TextField controlled input with custom input component not working properly losing focusReact - 材质 UI - 自定义输入组件无法正常工作的 TextField 控制输入失去焦点
【发布时间】:2021-04-03 02:54:25
【问题描述】:

我正在尝试从 Material UI 为 TextField 组件实现自定义输入元素

示例:


export const InputsPage: React.FC = () => {
  const [value, setValue] = useState('');
  return (
    <Paper>
      <Box p={2}>
        <TextField
          value={value}
          onChange={(e) => {
            setValue(e.target.value);
          }}
          color='primary'
          label='FROM'
          placeholder='Placeholder'
          InputProps={{
            inputComponent: ({ inputRef, ...rest }) => <input ref={inputRef} {...rest} type='text' />,
          }}
        />
      </Box>
    </Paper>
  );
};

因为我在自己的状态下使用受控输入,所以输入无法正常工作...每次尝试输入某些内容时输入会失去焦点,因此我需要输入每个字符/数字并单击再次输入以获得焦点,以便我可以继续输入

如果不正确使用不受控制的输入,它将正常工作

这是一个正在发生的例子:codeSandbox

【问题讨论】:

    标签: reactjs material-ui


    【解决方案1】:

    问题是您正在为 inputComponent 属性定义内联组件类型。这意味着每次重新渲染时,React 都会将其视为一个新的组件类型,因此将重新安装元素(从 DOM 中完全移除并重新添加),而不是仅仅重新渲染,从而导致焦点变为丢了。

    您可以通过在顶层定义组件类型(示例中为CustomInputComponent)来解决此问题,如下例所示:

    import React, { useState } from "react";
    import "./styles.css";
    import { TextField } from "@material-ui/core";
    const CustomInputComponent = ({ inputRef, ...rest }) => (
      <input ref={inputRef} {...rest} type="text" />
    );
    export default function App() {
      const [value, setValue] = useState("");
      return (
        <div className="App">
          <TextField
            value={value}
            onChange={(e) => {
              setValue(e.target.value);
            }}
            color="primary"
            label="FROM"
            placeholder="Placeholder"
            InputProps={{
              inputComponent: CustomInputComponent
            }}
          />
        </div>
      );
    }
    

    【讨论】:

      【解决方案2】:

      你犯了一个简单的错误

      只需将InputProps 替换为inputProps

      代码沙盒:https://codesandbox.io/s/intelligent-feather-4thqf?file=/src/App.js:423-433

      【讨论】:

      • 这实际上只是导致 inputComponent 属性被忽略,如控制台所示(“React 无法识别 DOM 元素上的 inputComponent 属性。”)。
      • 知道了,我查看了他们的文档,发现inputProps prop so.. material-ui.com/components/text-fields
      • inputPropsInputProps 都是 valid props for TextFieldinputProps 将 props 传递给 input 元素;而InputProps 将道具传递给支持inputComponent 道具的Input component
      猜你喜欢
      • 1970-01-01
      • 2019-10-10
      • 2022-01-16
      • 2023-01-16
      • 2021-06-01
      • 2011-11-01
      • 2021-10-03
      • 2021-05-29
      • 2017-09-17
      相关资源
      最近更新 更多