执行撤消/重做时,受控的反应输入破坏了 chrome 中的 maxLength 属性

Controlled react input is breaking maxLength attribute in chrome when undo/redo is performed

提问人:Raj Kumar 提问时间:3/8/2023 最后编辑:Raj Kumar 更新时间:3/9/2023 访问量:127

问:

我构建了一个文本字段,它使用接受 5 个字符的 maxLength 的 react 将提供的输入转换为大写。

问题: 当我尝试执行撤消和重做操作时,文本字段允许的字符数超过maxLength HTML属性中指定的字符数。

重现步骤:

  1. 转到链接: https://codesandbox.io/s/textfield-uppercase-material-ui-forked-95ww4t?file=/src/App.js
  2. 它有一个文本输入,可将给定的文本转换为大写,并且最多允许 5 个字符
  3. 键入“abcdef”。由于最大长度限制,您可以在文本字段中看到“ABCDE”
  4. 按“ctrl+z”5次
  5. 按“ctrl+y”重做
  6. 现在,您可以在文本框“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>
  );
}
ReactJS 谷歌浏览器 Microsoft Edge Chromium

评论


答:

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