[英]MUI v5 broke default TextField behavior
当我们在 TextField 中写完评论时,TextField 具有焦点,当我们单击 Done 时没有任何反应。 第一次单击会从 TextField 中移除焦点。 第二次按下按钮结束该过程。
<TextField
id={'generalComment'}
value={comment}
label="Общий комментарий"
multiline
minRows={7}
onChange={onCommentChange}
onBlur={onCommentSubmit}
variant="outlined"
margin="normal"
required
error={!!commentError}
helperText={commentError}
InputLabelProps={{
shrink: true,
}}
inputProps={{maxLength: 2000}}
className={classNames({[classes.importantField]: !comment})}
/>
如果从字段中移除焦点,onBlur 工作正常。 但是按钮的 onClick 在第一次点击时不起作用。
onBlur 拦截 UI 按钮上的点击事件并阻止触发这些事件。
如何编写 onBlur,以便即使焦点位于 TextField 上,按钮也能第一次工作?
const onCommentSubmit= event => {
console.log("BLUR");
const value = event.target.value.trim();
setGeneralComment(value);
onGeneralCommentSubmit(value);
};
预期行为按钮应该在第一次点击时起作用。 多次按下按钮是不合逻辑的。
重现步骤的步骤:
上下文我希望第一次按下按钮。 这样焦点就不会挡住用户界面。
我的环境npx @mui/envinfo
System:
OS: Windows 10 10.0.19044
Binaries:
Node: 16.13.0 - C:\Program Files\nodejs\node.EXE
Yarn: 1.22.17 - ~\AppData\Roaming\npm\yarn.CMD
npm: 8.5.1 - C:\Program Files\nodejs\npm.CMD
Browsers:
Chrome: Google Chrome
Edge: Spartan (44.19041.1266.0), Chromium (99.0.1150.36)
npmPackages:
@emotion/react: 11.8.1 => 11.8.1
@emotion/styled: 11.8.1 => 11.8.1
@mui/base: 5.0.0-alpha.70
@mui/core: 5.0.0-alpha.54 => 5.0.0-alpha.54
@mui/icons-material: 5.4.4 => 5.4.4
@mui/lab: 5.0.0-alpha.71 => 5.0.0-alpha.71
@mui/material: 5.4.4 => 5.4.4
@mui/private-theming: 5.4.4
@mui/styled-engine: 5.4.4
@mui/styles: 5.4.4 => 5.4.4
@mui/system: 5.4.4
@mui/types: 7.1.2
@mui/utils: 5.4.4
@types/react: 17.0.39
react: 17.0.2 => 17.0.2
react-dom: 17.0.2 => 17.0.2
typescript: 4.6.2
我认为您更改 state 的次数太多了。
我不会修剪 onBlur function 中的值。让用户键入他想要的任何内容并在提交之前修剪该值(如果我假设良好,则在onGeneralCommentSubmit
function 内......我还假设setGeneralComment
是 state 更新comment
)。 这样,您就不会在 onBlur 之后调用 rerender。 当然,这取决于onGeneralCommentSubmit
中的内容。
<TextField id={'generalComment'} value={comment} (...) onChange={onCommentChange} onBlur={onGeneralCommentSubmit} (...) /> const onGeneralCommentSubmit = (event) => { if (comment) { const value = comment.trim(); // do something with the value } };
在 Blur 上提交表单可能不是一个好习惯:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.