如何将焦点设置到 materialUI TextField?
How to set focus to a materialUI TextField?
如何将焦点设置在 material-ui TextField
组件上?
componentDidMount() {
ReactDom.findDomNode(this.refs.myControl).focus()
}
我试过上面的代码,但它不起作用:(
您可以使用 autoFocus
属性。
<TextField value="some value" autoFocus />
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} />;
}
请注意,由于某种原因,如果没有 setTimeout
,它就无法工作。有关详细信息,请参阅 https://github.com/callemall/material-ui/issues/1594。
对于 React 16.8.6,您应该使用 TextField 的 inputRef
属性 来设置焦点。我尝试了 ref
属性 但它不起作用。
<TextField
inputRef={input => input && input.focus()}
/>
inputRef
: Use this property to pass a ref callback to the native input component.
AlienKevin 是正确的(将 ref 回调传递给 "TextField.inputProps" ),但您也可以将元素引用保存在 "this" 对象上,以便稍后设置焦点。这是 Coffeescript 中的示例:
TextField
inputProps:
ref: (el)=>
if el?
@input_element = el
Button
onClick:=>
@input_element.focus()
对于 material ui TextField,您需要像这样在 inputProps 对象中输入 autoFocus 的道具。
<TextField inputProps={{ autoFocus: true }} />
如果您正在使用 material-ui TextField 和 React 功能组件,您可以在 TextField 组件中传递 inputRef。这里的技巧是 if 条件 if(input != null)
.
<TextField
variant="filled"
inputRef={(input) => {
if(input != null) {
input.focus();
}
}}
/>
这是一个适合您的工作示例。 CodeSandBox- Material-ui-TextFieldFocus
这段代码其实很好,但有一个缺点,在每次渲染时都会创建一个新函数。使用 useCallback
很容易解决
<TextField
inputRef={input => input && input.focus()}
/>
应该是
const callbackRef = useCallback((inputElement) => {
if (inputElement) {
inputElement.focus();
}
}, []);
...
<TextField
inputRef={callbackRef}
/>
这将在每次渲染时聚焦组件。我尝试过的其他解决方案仅在初始时间关注元素。
const inputRef = React.useRef<HTMLInputElement>();
useEffect(() => {
inputRef.current?.focus();
}, [inputRef.current]);
const setTextInputRef = (element: HTMLInputElement) => {
inputRef.current = element;
};
return (
<TextField
inputRef={setTextInputRef}
/>
我正在使用此解决方案,适用于受 https://gist.github.com/carpben/de968e377cbac0ffbdefe1ab56237573
启发的文本字段
const useFocus = (): [any, () => void] => {
const htmlElRef: MutableRefObject<any> = useRef<HTMLDivElement>();
const setFocus = (): void => {
if (!htmlElRef || !htmlElRef.current) return
const div = htmlElRef.current as HTMLDivElement
if (!div) return
const input = div.querySelector("input")
if (input) input.focus()
}
return [htmlElRef, setFocus];
};
export function MyComp() {
const [ref, setFocus] = useFocus()
// use setFocus() to focus the input field
return <Input ref={ref} />
}
const handleClick = () => {
inputRef.current.firstChild.focus();
inputRef.current.firstChild.placeholder = '';
}
<InputBase
value={value}
ref={inputRef}
placeholder="search" />
<Button onClick={handleClick}>Click</Button>
将此 属性 添加到您的 TextField
组件中:
inputRef={(input) => input?.focus()}
如何将焦点设置在 material-ui TextField
组件上?
componentDidMount() {
ReactDom.findDomNode(this.refs.myControl).focus()
}
我试过上面的代码,但它不起作用:(
您可以使用 autoFocus
属性。
<TextField value="some value" autoFocus />
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} />;
}
请注意,由于某种原因,如果没有 setTimeout
,它就无法工作。有关详细信息,请参阅 https://github.com/callemall/material-ui/issues/1594。
对于 React 16.8.6,您应该使用 TextField 的 inputRef
属性 来设置焦点。我尝试了 ref
属性 但它不起作用。
<TextField
inputRef={input => input && input.focus()}
/>
inputRef
: Use this property to pass a ref callback to the native input component.
AlienKevin 是正确的(将 ref 回调传递给 "TextField.inputProps" ),但您也可以将元素引用保存在 "this" 对象上,以便稍后设置焦点。这是 Coffeescript 中的示例:
TextField
inputProps:
ref: (el)=>
if el?
@input_element = el
Button
onClick:=>
@input_element.focus()
对于 material ui TextField,您需要像这样在 inputProps 对象中输入 autoFocus 的道具。
<TextField inputProps={{ autoFocus: true }} />
如果您正在使用 material-ui TextField 和 React 功能组件,您可以在 TextField 组件中传递 inputRef。这里的技巧是 if 条件 if(input != null)
.
<TextField
variant="filled"
inputRef={(input) => {
if(input != null) {
input.focus();
}
}}
/>
这是一个适合您的工作示例。 CodeSandBox- Material-ui-TextFieldFocus
这段代码其实很好,但有一个缺点,在每次渲染时都会创建一个新函数。使用 useCallback
很容易解决<TextField
inputRef={input => input && input.focus()}
/>
应该是
const callbackRef = useCallback((inputElement) => {
if (inputElement) {
inputElement.focus();
}
}, []);
...
<TextField
inputRef={callbackRef}
/>
这将在每次渲染时聚焦组件。我尝试过的其他解决方案仅在初始时间关注元素。
const inputRef = React.useRef<HTMLInputElement>();
useEffect(() => {
inputRef.current?.focus();
}, [inputRef.current]);
const setTextInputRef = (element: HTMLInputElement) => {
inputRef.current = element;
};
return (
<TextField
inputRef={setTextInputRef}
/>
我正在使用此解决方案,适用于受 https://gist.github.com/carpben/de968e377cbac0ffbdefe1ab56237573
启发的文本字段
const useFocus = (): [any, () => void] => {
const htmlElRef: MutableRefObject<any> = useRef<HTMLDivElement>();
const setFocus = (): void => {
if (!htmlElRef || !htmlElRef.current) return
const div = htmlElRef.current as HTMLDivElement
if (!div) return
const input = div.querySelector("input")
if (input) input.focus()
}
return [htmlElRef, setFocus];
};
export function MyComp() {
const [ref, setFocus] = useFocus()
// use setFocus() to focus the input field
return <Input ref={ref} />
}
const handleClick = () => {
inputRef.current.firstChild.focus();
inputRef.current.firstChild.placeholder = '';
}
<InputBase
value={value}
ref={inputRef}
placeholder="search" />
<Button onClick={handleClick}>Click</Button>
将此 属性 添加到您的 TextField
组件中:
inputRef={(input) => input?.focus()}