UseState 呈现之前的状态
UseState renders me the previous state
我有两个输入同时更改 P 标签的文本,但问题是显示给我的渲染始终是之前保存的值。我知道我必须使用 useEffect 再次渲染组件并显示当前值,但是在输入 handleChange 中,如果我需要发送到更改文本的 SetState,则保存在 initialValue 中的值。到目前为止,我正在学习 React,我已经尝试了很多东西,但对我来说没有任何效果,在这种情况下我该如何实现 useEffect?非常感谢您的帮助。
const initialValue = {
input1: 0,
input2: 0,
};
const TestState = () => {
const [obj, setObj] = useState(initialValue);
const [textChange, setTextChange] = useState("-");
useEffect(() => {}, [obj]);
const handleChange = (e) => {
setObj({ ...obj, [e.target.name]: e.target.value });
//Basically I need to do this -> setTextChange(e.target.value), but with the value stored in the initialValue.
setTextChange(e.target.name === "input1" ? obj.input1 : obj.input2);
};
return (
<div>
<form>
<input type="text" name="input1" onChange={handleChange} />
<input type="text" name="input2" onChange={handleChange} />
</form>
<p>{textChange}</p>
</div>
);
};
https://codesandbox.io/s/practical-mahavira-pd94p?file=/src/TestState.js
你从useState
(即setObj
)得到的setter不会立即改变受控对象的value/state。更新发生在下一个 render() 之前。这就是为什么您的 obj
对象看起来陈旧。
注意,您不需要替换 obj
对象本身,您只是更新它的内容。你可以这样做:
const [obj] = useState(initialValue);
...
const handleChange = (e) => {
//setObj({ ...obj, [e.target.name]: e.target.value });
obj[e.target.name] = e.target.value;
setTextChange(e.target.name === "input1" ? obj.input1 : obj.input2);
}
我有两个输入同时更改 P 标签的文本,但问题是显示给我的渲染始终是之前保存的值。我知道我必须使用 useEffect 再次渲染组件并显示当前值,但是在输入 handleChange 中,如果我需要发送到更改文本的 SetState,则保存在 initialValue 中的值。到目前为止,我正在学习 React,我已经尝试了很多东西,但对我来说没有任何效果,在这种情况下我该如何实现 useEffect?非常感谢您的帮助。
const initialValue = {
input1: 0,
input2: 0,
};
const TestState = () => {
const [obj, setObj] = useState(initialValue);
const [textChange, setTextChange] = useState("-");
useEffect(() => {}, [obj]);
const handleChange = (e) => {
setObj({ ...obj, [e.target.name]: e.target.value });
//Basically I need to do this -> setTextChange(e.target.value), but with the value stored in the initialValue.
setTextChange(e.target.name === "input1" ? obj.input1 : obj.input2);
};
return (
<div>
<form>
<input type="text" name="input1" onChange={handleChange} />
<input type="text" name="input2" onChange={handleChange} />
</form>
<p>{textChange}</p>
</div>
);
};
https://codesandbox.io/s/practical-mahavira-pd94p?file=/src/TestState.js
你从useState
(即setObj
)得到的setter不会立即改变受控对象的value/state。更新发生在下一个 render() 之前。这就是为什么您的 obj
对象看起来陈旧。
注意,您不需要替换 obj
对象本身,您只是更新它的内容。你可以这样做:
const [obj] = useState(initialValue);
...
const handleChange = (e) => {
//setObj({ ...obj, [e.target.name]: e.target.value });
obj[e.target.name] = e.target.value;
setTextChange(e.target.name === "input1" ? obj.input1 : obj.input2);
}