React Hooks - useState 值不能改变
React Hooks - useState value cannot change
问题
我想在每次单击 enter 时获取更新挂钩状态的 value
。
但我总是得到初始值,而不是更新后的值。
代码
import React, { useState } from "react";
import ReactDOM from "react-dom";
import ContentEditable from "react-contenteditable";
const ItemCol = props => {
const [value, setValue] = useState("Initial Value");
const onChange = event => {
setValue(event.target.value);
console.log("onChange: " + value);
};
const keyDown = event => {
if (event.keyCode === 13) {
event.preventDefault();
//Value should be changed, but did not change
console.log("Enter Pressed: " + value);
}
};
return (
<ContentEditable
html={value}
onKeyDown={React.useCallback(keyDown)}
onChange={React.useCallback(onChange)}
/>
);
};
const rootElement = document.getElementById("root");
ReactDOM.render(<ItemCol />, rootElement);
CodeSandBox.io: https://codesandbox.io/embed/pensive-worker-31l3r
注意:keyCode 13 是 Enter。
注意 2:我正在使用 react-contenteditable 依赖项。 (https://www.npmjs.com/package/react-contenteditable)
请帮帮我,因为这个问题困扰我好几个小时了。谢谢!
ContentEditable 组件似乎记住了 onKeydown
方法,因此每当您调用它时,它都会打印其初始闭包中的值,这就是为什么您始终拥有初始值的原因。
要解决这个闭包问题,您可以将值保留在 ref 中并对其进行修改
const ItemCol = props => {
const [value, setValue] = useState("Initial Value");
const valRef = useRef(value);
const onChange = event => {
setValue(event.target.value);
valRef.current = event.target.value;
};
const keyDown = event => {
if (event.keyCode === 13) {
event.preventDefault();
//Value should be changed, but did not change
console.log("Enter Pressed: " + valRef.current);
}
};
return (
<ContentEditable
html={value}
onKeyDown={keyDown}
onChange={React.useCallback(onChange)}
/>
);
};
@Michael Harley,问题出在闭包或 react-content-editable onkeydown 函数设置方式 react-content-editable.
工作演示:- https://codesandbox.io/embed/elated-bohr-jeu4u?fontsize=14
问题
我想在每次单击 enter 时获取更新挂钩状态的 value
。
但我总是得到初始值,而不是更新后的值。
代码
import React, { useState } from "react";
import ReactDOM from "react-dom";
import ContentEditable from "react-contenteditable";
const ItemCol = props => {
const [value, setValue] = useState("Initial Value");
const onChange = event => {
setValue(event.target.value);
console.log("onChange: " + value);
};
const keyDown = event => {
if (event.keyCode === 13) {
event.preventDefault();
//Value should be changed, but did not change
console.log("Enter Pressed: " + value);
}
};
return (
<ContentEditable
html={value}
onKeyDown={React.useCallback(keyDown)}
onChange={React.useCallback(onChange)}
/>
);
};
const rootElement = document.getElementById("root");
ReactDOM.render(<ItemCol />, rootElement);
CodeSandBox.io: https://codesandbox.io/embed/pensive-worker-31l3r
注意:keyCode 13 是 Enter。
注意 2:我正在使用 react-contenteditable 依赖项。 (https://www.npmjs.com/package/react-contenteditable)
请帮帮我,因为这个问题困扰我好几个小时了。谢谢!
ContentEditable 组件似乎记住了 onKeydown
方法,因此每当您调用它时,它都会打印其初始闭包中的值,这就是为什么您始终拥有初始值的原因。
要解决这个闭包问题,您可以将值保留在 ref 中并对其进行修改
const ItemCol = props => {
const [value, setValue] = useState("Initial Value");
const valRef = useRef(value);
const onChange = event => {
setValue(event.target.value);
valRef.current = event.target.value;
};
const keyDown = event => {
if (event.keyCode === 13) {
event.preventDefault();
//Value should be changed, but did not change
console.log("Enter Pressed: " + valRef.current);
}
};
return (
<ContentEditable
html={value}
onKeyDown={keyDown}
onChange={React.useCallback(onChange)}
/>
);
};
@Michael Harley,问题出在闭包或 react-content-editable onkeydown 函数设置方式 react-content-editable.
工作演示:- https://codesandbox.io/embed/elated-bohr-jeu4u?fontsize=14