如何将焦点设置为materialUI TextField?

Gil*_*haw 18 material-ui

如何将焦点设置在material-ui TextField组件上?

componentDidMount() {
    ReactDom.findDomNode(this.refs.myControl).focus()
}
Run Code Online (Sandbox Code Playgroud)

我试过上面的代码,但它不起作用:(

小智 23

您可以使用该autoFocus属性.

<TextField value="some value" autoFocus />
Run Code Online (Sandbox Code Playgroud)

  • 它在页面加载时有效,但在提交表单后却无效. (7认同)
  • 这对我不起作用。我添加了该属性,但没有任何变化。文本字段不专注于页面加载。只有我? (4认同)

atb*_*khi 11

如果您使用的是material-ui TextField 和react 功能组件,您可以在TextField 组件中传递inputRef。这里的技巧是 if 条件if(input != null)

<TextField
    variant="filled"
    inputRef={(input) => {
      if(input != null) {
         input.focus();
      }
    }}
/>
Run Code Online (Sandbox Code Playgroud)

这是一个适合您的工作示例。CodeSandBox-Material-ui-TextFieldFocus


Lan*_*tig 9

autoFocus也没有为我工作,也许因为这是一个在顶级组件加载时没有安装的组件.为了让它发挥作用,我不得不做更多令人费解的事情:

function AutoFocusTextField(props) {
  const inputRef = React.useRef();

  React.useEffect(() => {
    const timeout = setTimeout(() => {
      inputRef.current.focus();
    }, 100);

    return () => {
      clearTimeout(timeout);
    };
  }, []);

  return <TextField inputRef={inputRef} {...props} />;
}
Run Code Online (Sandbox Code Playgroud)

请注意,由于某种原因,没有它就无法工作setTimeout.有关详细信息,请参阅https://github.com/callemall/material-ui/issues/1594.

  • 对于React 16.8.6,您应该使用TextField的`inputRef`属性来设置焦点。参见[Material-ui doc](https://material-ui.com/api/text-field/#props) (2认同)
  • 对于代码的作者来说,这是一个可恶的黑客行为,这怎么可能不是显而易见的呢?输入“setTi...”时应该已经很清楚了。就在那里。**不要复制这个**,看看AlienKevin的答案。 (2认同)

dps*_*dps 8

这将在每次渲染时聚焦组件。我尝试过的其他解决方案仅在初始时聚焦该元素。

  const inputRef = React.useRef<HTMLInputElement>();
  
  useEffect(() => {
    inputRef.current?.focus();
  }, [inputRef.current]);

  const setTextInputRef = (element: HTMLInputElement) => {
    inputRef.current = element;
  };
   
  return (
    <TextField
      inputRef={setTextInputRef}
    />
Run Code Online (Sandbox Code Playgroud)


Ali*_*vin 7

对于React 16.8.6,您应该使用inputRefTextField 的属性来设置焦点。我尝试过ref财产,但是行不通。

<TextField
  inputRef={input => input && input.focus()}
/>
Run Code Online (Sandbox Code Playgroud)

Material-ui doc说:

inputRef:使用此属性可将ref回调传递给本机输入组件。

  • 这是正确的解决方案。请记住,&lt;TextField&gt; 是其他几个 Material 组件的组合,包括 &lt;Input&gt;、&lt;InputLabel&gt;、&lt;FormControl&gt; 等。 (4认同)
  • 这对于正确答案来说非常简短,请添加一些最小的工作示例。 (3认同)

ane*_*boz 6

将此属性添加到您的TextField组件中:

inputRef={(input) => input?.focus()}
Run Code Online (Sandbox Code Playgroud)