【发布时间】:2020-05-25 00:58:25
【问题描述】:
我已经尝试过数十次问这个对我来说难以理解的问题。我已经做了几乎最简单的例子来问这个问题。
我在handleChange 方法中更改了钩子的值。但是console.log 总是显示以前的值,而不是新值。这是为什么呢?
我需要更改钩子的值,然后用它来代替console.log 做其他事情。但我不能,因为钩子总是没有我刚刚尝试放入的内容。
const options = ["Option 1", "Option 2"];
export default function ControllableStates() {
const [value, setValue] = React.useState(options[0]);
const handleChange = val => {
setValue(val);
console.log(value);
};
return (
<div>
<div>{value}</div>
<br />
<Autocomplete
value={value}
onChange={(event, newValue) => {
handleChange(newValue);
}}
options={options}
renderInput={params => (
<TextField {...params} label="Controllable" variant="outlined" />
)}
/>
</div>
);
}
你可以在这里试试。 https://codesandbox.io/s/awesome-lumiere-y2dww?file=/src/App.js
【问题讨论】:
-
当您调用
setValue(val)时,您在内部设置了新值,但是变量value不再更改,它总是在调用useState时保存最新值的副本。此时您可以将value视为一个不可变变量,它永远不会改变。将console.log放在处理程序之外,您会看到每次执行组件函数时,值都会在handleCgange被调用之后发生变化。 -
我需要更改钩子的值,然后用它来代替 console.log 做其他事情。那我该如何实现呢?如何立即使用组件的新值?
-
我认为您正在理解钩子和组件如何工作错误。每次执行组件函数时,它只是最新状态的“快照”。当 a) 输入更改或 b) 状态更改时,React 将呈现组件。调用 setter 函数进行状态更改。但是,您只能在组件函数的下一次调用中看到新状态。你实际上做得对,只需调用
setValue,React 就会再次渲染你的组件,此时你会看到变化。可以看到<div>{value}</div>后面的值是正确的... -
你设置了其他东西,所以这表明它工作正常。意识到
value变量是const,它是不可变的,一旦设置就不能改变。 -
好的,我明白了,但我不明白如何使用用户输入。在该组件中选择某些内容后,用户按下按钮,按钮需要使用当前选择的值
标签: javascript reactjs react-hooks