如何将焦点设置为materialUI TextField?

时间:2016-06-21 16:04:38

标签: material-ui

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

componentDidMount() {
    ReactDom.findDomNode(this.refs.myControl).focus()
}

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

9 个答案:

答案 0 :(得分:18)

您可以使用autoFocus属性。

<TextField value="some value" autoFocus />

答案 1 :(得分:6)

autoFocus也不适合我,也许因为这是一个在顶级组件加载时没有安装的组件。为了让它发挥作用,我不得不做一些更复杂的事情:

const focusUsernameInputField = input => {
  if (input) {
    setTimeout(() => {input.focus()}, 100);
  }
};

return (
  <TextField
    hintText="Username"
    floatingLabelText="Username"
    ref={focusUsernameInputField}
  />
);

请注意,由于某些原因,如果没有setTimeout,它将无效。有关详细信息,请参阅https://github.com/callemall/material-ui/issues/1594

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

对于React 16.8.6,您应该使用TextField的inputRef属性设置焦点。我尝试了ref属性,但是它不起作用。

<TextField
  inputRef={input => input.focus()}
/>

Material-ui doc说:

  

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

答案 4 :(得分:0)

这段代码实际上很好,但有一个缺点,在每次渲染时它都会创建一个新函数。使用 useCallback 很容易解决

<TextField
  inputRef={input => input && input.focus()}
/>

应该

const callbackRef = useCallback((inputElement) => {
     if (inputElement) {
         inputElement.focus();
     }
 }, []);
...
<TextField
  inputRef={callbackRef}
/>

答案 5 :(得分:0)

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

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

  const setTextInputRef = (element: HTMLInputElement) => {
    inputRef.current = element;
  };
   
  return (
    <TextField
      inputRef={setTextInputRef}
    />

答案 6 :(得分:-1)

对于实质性的ui TextField,您需要在这样的inputProps对象中输入autoFocus的道具。

 <TextField inputProps={{ autoFocus: true }} />

答案 7 :(得分:-2)

我偶然发现了这些问题,寻找同样问题的解决方案。我找到了关于autoFocus但发现它只在页面首次加载时才有效,而不是在表单提交后。我最终找到它的方法是向孩子ref添加TextField,并在表单上提交调用select()

<form onSubmit={this.onSubmit}>
            <TextField ref="amountComp" ... />
</form>

onSubmit(event: any): void {
    // save form
    (this.refs["amountComp"] as TextField).select();
};

答案 8 :(得分:-2)

AlienKevin是正确的(将ref回调传递给“ TextField.inputProps”),但是您也可以将元素引用保存在“ this”对象上,以便稍后设置焦点。这是Coffeescript中的一个示例:

TextField
    inputProps:
        ref: (el)=>
            if el?
                @input_element = el

Button
    onClick:=> 
        @input_element.focus()