在React中处理中文输入时,通常我们会遇到一个问题:在中文输入法状态下,用户开始输入中文之前,e.target.value 可能还没有更新,因为浏览器还没有接收到完整的字符序列。这种情况下,如果过早地读取 e.target.value,可能会导致获取到一个不完整或者错误的值。
使用onCompositionEnd事件。这个事件在用户完成一个字符的输入(无论是否为中文)后触发。
注意:测试 onChange和onCompositionEnd 要一起使用,不然不好使,不知道为什么。
const [value, setValue] = useState('')
const handleChange = (e: any) => {
let val = e.target.value
const len = val.length
if (len >= 10) {
const message = val.substring(0, 8)
console.log(message)
val = val.substring(8)
}
setValue(val);
};
const handleCompositionEnd = (e: any) => {
let val = e.target.value
const len = val.length
if (len >= 8) {
const message = val.substring(0, 6)
console.log(message)
val = val.substring(6)
}
setValue(val);
};
<input
type="text"
value={value}
onChange={handleChange}
onCompositionEnd={handleCompositionEnd}
/>