【发布时间】:2021-09-19 01:19:04
【问题描述】:
我已经被这个错误困扰了很长时间,所以我希望能得到一些帮助。这是一个最小可重现的示例:
import "./App.css";
import React, { useState } from "react";
import $ from "jquery";
function App() {
const [value, setValue] = useState("");
const focusHandler = () => {
$("input").on("keypress", (e) => {
let copy = value;
if (e.key === ".") {
e.preventDefault();
copy += " ";
setValue(copy);
}
});
};
const blurHandler = (event) => {
$("input").off("keypress");
setValue(event.target.value);
};
const changeHandler = (event) => {
setValue(event.target.value);
};
return (
<div>
<input
value={value}
onFocus={focusHandler}
onBlur={blurHandler}
onChange={changeHandler}
/>
</div>
);
}
export default App;
在输入焦点上,我添加了一个事件侦听器来查找. 按键,并在按下时将一个制表符(4 个空格)附加到输入。但是当我多次按下. 时,输入会卡在第一个选项卡上,并且不会进一步移动(例如,输入永久显示 4 个空格)。使用console.log 显示value 状态似乎没有在focusHandler 中更新并恢复为原始值("")。
重要的一点是,使用this.state 切换到基于类的组件可以使其工作。关于为什么会发生这种情况的任何见解?
【问题讨论】:
-
你用 React 开发工具检查过状态吗?
-
为什么要结合 jQuery 和 React?这是一个奇怪的设置——React 已经将侦听器附加到 DOM 元素上,所以在上面扔 jQuery 处理程序似乎只会增加混乱。
-
@Code-Apprentice 是的,我有。我无法从开发工具中获得比
console.log语句更多的信息 -
@ggorlen 诚然,这不是处理我想做的事情的最干净的方式。你认为混合 jQuery 和 React 是导致错误的原因吗?
-
即使它有效,我也觉得它是一种反模式。我的意思是,你有两个听众:
onChange => setValue(something);和 jQuery 有.on("keypress" => setValue(somethingElse)。我不清楚 React 应该如何理解这一点,因为按下一个键会触发 change 和 keypress 事件。顺便说一句,keypress is deprecated.