javascript - 在材质 ui 文本字段中聚焦输入需要延迟
问题描述
我无法在inputRef.current.focus()
不使用setTimeout
. 这似乎是一个错误,但我不确定它是在 React 还是 MaterialUI 中。
在此处查看演示: https ://codesandbox.io/s/goofy-gareth-lkmq3?file=/src/App.js
export default function App() {
const inputRef = useRef();
const [value, setValue] = useState("but focus only works after a timeout");
const [disabled, setDisabled] = useState(true);
const onChange = useCallback(
(e) => {
setValue(e.target.value);
},
[setValue]
);
const onClickIcon = useCallback(() => {
console.log("onClickIcon");
setDisabled(false);
// this does nothing
inputRef.current.focus();
// eventually you'll see the input gain focus
setTimeout(() => {
inputRef.current.focus();
}, 2000);
}, [inputRef]);
const onFocus = useCallback(() => {
console.log("onFocus");
}, []);
const onBlur = useCallback(() => {
console.log("onBlur");
setDisabled(true);
}, [setDisabled]);
return (
<Container maxWidth="sm">
<Box my={4}>
<Typography variant="h4" component="h1" gutterBottom>
ISSUE: Button click does not immediately focus input
</Typography>
</Box>
<Grid container direction="row" wrap="nowrap">
<TextField
fullWidth
disabled={disabled}
label="input should become focused when LOCK is clicked"
inputRef={inputRef}
value={value}
onChange={onChange}
onFocus={onFocus}
onBlur={onBlur}
color="primary"
/>
<IconButton onClick={onClickIcon} color="primary">
<LockIcon />
</IconButton>
</Grid>
<Box my={4}>
<ProTip />
</Box>
</Container>
);
}
package.json
{
"name": "create-react-app",
"version": "4.0.0",
"private": true,
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"dependencies": {
"@material-ui/core": "latest",
"@material-ui/icons": "4.11.2",
"clsx": "latest",
"react": "latest",
"react-dom": "latest",
"react-scripts": "latest"
}
}
解决方案
您应该重新渲染生命周期以启用自动对焦,因为它是异步的。这是我的解决方案,看看这个。
https://codesandbox.io/s/hardcore-ellis-qnkn6?file=/src/App.js
推荐阅读
- python - Pandas wide_to_long - 将值保留在 i 中的行或仅保留一行空白
- ios - 与结果图像不同的相机视图
- angularjs - 在滚动更改 div 中的某些内容
- python - 使用 PatchCollection 重新绘制等高线填充图
- javascript - 搜索过滤器不能在反应中采取排序功能
- node.js - Sequelize String 被输出为 [Object object]
- javascript - 用于接受带有音调 char(') 的希腊字符的正则表达式
- java - 我如何输出以控制台我的请求的正文
- mysql - SQL检查表中的值是否在另一个表中的2列范围内
- php - 如何在php中合并两个数组?[php]