笔者原本想的是在ProFormSelect中对temp设置值,在使用setTemp之后发现useState中的值并没有发生变化
const [temp,setTemp] = useState(0)
const unitChanage = (value) =>{
console.log("++++++");
setTemp(1)
console.log(temp);
}
<ProFormSelect
defaultValue="Kbps"
onChange={unitChanage}
options={[
{ label: 'Kbps', value: 1000 / 8 },
{ label: 'Mbps', value: 1000 * 1000 / 8 },
{ label: 'Gbps', value: 1000 * 1000 * 1000 / 8 },
]}
placeholder="选择一个单位"
/>
这是在控制台打印输出的结果,由此可见temp的值并没有发生变化,也就是useState并没有监听到temp属性的变化
解决思路:
刚开始我的思路是:因为useState是异步的,所以他可能是因为有一个延迟的问题,所以我就尝试在useEffect钩子中去解决
useEffect(() => {
getData()
}, [temp])
结果依然是
然后我又尝试设置等待时间,在setTimeout中等待两秒后去获取temp的值
const unitChanage = (value) =>{
console.log("++++++");
setTemp(1)
// console.log(temp);
setTimeout(() => {
console.log(temp);
}, 2000);
然而结果还是不行,之后我去百度了一下,网上的结果是这样的:函数更新状态的当前闭包和状态更新使用状态值这一事实将放映在下一次重新渲染中,现有的闭包不会收到影响,而是会创建新的闭包。 现在,在当前状态下,挂钩中的值是由现有的闭包获得的,并且在重新渲染时,将根据是否再次创建函数来更新闭包。即使添加了一个setTimeout函数,尽管超时将在重新渲染的一段时间后运行,setTimeout仍将使用其先去关闭而不是更新后的值。
问题解决:
其实在select中,他的外部默认是由一层form表单进行包裹的,被Form.item包裹,在触发onchange事件的时候,可以对useState的状态进行修改,具体是怎样的原因,还有待探究。