提问人:Raj Kumar 提问时间:3/8/2023 最后编辑:Raj Kumar 更新时间:3/9/2023 访问量:127
执行撤消/重做时,受控的反应输入破坏了 chrome 中的 maxLength 属性
Controlled react input is breaking maxLength attribute in chrome when undo/redo is performed
问:
我构建了一个文本字段,它使用接受 5 个字符的 maxLength 的 react 将提供的输入转换为大写。
问题: 当我尝试执行撤消和重做操作时,文本字段允许的字符数超过maxLength HTML属性中指定的字符数。
重现步骤:
- 转到链接: https://codesandbox.io/s/textfield-uppercase-material-ui-forked-95ww4t?file=/src/App.js
- 它有一个文本输入,可将给定的文本转换为大写,并且最多允许 5 个字符
- 键入“abcdef”。由于最大长度限制,您可以在文本字段中看到“ABCDE”
- 按“ctrl+z”5次
- 按“ctrl+y”重做
- 现在,您可以在文本框“ABCDEAA”中看到 7 个字符,根据 maxLength 规范,这些字符不应被允许。
我在chrome和edge浏览器(基于Chromium的浏览器)中遇到了这个问题,但在firefox中没有。我在这里做错了什么,还是需要通过 Chrome 或 React 修复问题。
法典:
export default function App() {
const [value, setValue] = useState("");
const onValueChange = (e) => {
setValue(e.target.value.toUpperCase());
};
return (
<div className="App">
<h1>Text Field uppercase</h1>
<input
type="text"
id="input"
value={value}
maxLength="5"
onChange={onValueChange}
/>
</div>
);
}
答:
0赞
Yu Zhou
3/9/2023
#1
您的示例代码在 Firefox 中也无法正常工作。它可以接受 5 个以上的字符。此外,“ctrl+z”和“ctrl+y”在浏览器中效果不佳。如果你想使用大写,我认为使用CSS样式更方便。您可以参考以下代码,它在所有三个浏览器中都运行良好:
import "./styles.css";
export default function App() {
return (
<div className="App">
<h1>Text Field uppercase</h1>
<input
type="text"
id="input"
defaultValue=""
maxLength="5"
style={{ textTransform: "uppercase" }}
/>
</div>
);
}
评论
0赞
Raj Kumar
3/9/2023
嗨,周宇,感谢您的回复。是的,我们可以使用 CSS 来实现这一点。您认为有什么方法可以使用 onChangeHandler 实现它,因为我需要在 onChange 期间清理一些字符,例如“<”、“>”。届时也会出现此问题。
1赞
Yu Zhou
3/10/2023
我明白你的意思。即使没有 React,我也可以重现该问题。例如,此简单示例可以重现该问题。当使用“ctrl+z”、“ctrl+y”以及使用最大字符串长度限制更改输入值时,它会发生在 chromium 浏览器中。我认为这是铬的问题。我建议在 chromium 网站上报告此内容。
0赞
Raj Kumar
3/10/2023
谢谢周玉。让我在 Chromium 中提出它。
1赞
Raj Kumar
3/10/2023
我已经在 Chromium 中提交了一张票证。bugs.chromium.org/p/chromium/issues/detail?id=1423322
评论