reactjs React Js材料UI在设置时未更新值

ovfsdjhp  于 2023-02-04  发布在  React
关注(0)|答案(1)|浏览(177)

所以我在Material UI react js中有这段代码,它没有正确更新值,或者我认为,为了进一步解释这一点,我有这段代码

import * as React from 'react';
import Tabs from '@mui/material/Tabs';
import Tab from '@mui/material/Tab';

export function Home() {

const [value, setValue] = React.useState('Pending');

  const handleChange = (event, newValue) => {
      setValue(newValue);
      console.log(value);
  };

  return (
    <div>
        <>
        <Tabs
          value={value}
          onChange={handleChange}
          textColor="secondary"
          indicatorColor="secondary"
          aria-label="secondary tabs example"
        >
          <Tab value="Pending" label="Pending" />
          <Tab value="Received" label="Received" />
          <Tab value="Prepared" label="Prepared" />
          <Tab value="Cancelled" label="Cancelled" />
        </Tabs>
        </>
    </div>
  );
}

如果我运行此代码并单击标签为"挂起"的选项卡,console.log将不会被触发。如果我再次单击标签为"已接收"的console.log将显示"挂起"而不是"已接收"。
这种情况经常发生,我以为当你设置值和控制台日志时,它应该显示你选择的最新值。
样本输出:

如您所见,我当前选择了"已接收"标签,但在显示屏上显示"待定"
这是react js/Material UI的行为方式吗?还是我在这里遗漏了什么?
谢谢

lpwwtiir

lpwwtiir1#

正如DaveNewton在评论中所说的,设置状态是异步的,如ReactDocs中所述:https://reactjs.org/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous
如果要对该值执行console.log操作,可以更新处理程序以记录新值

const handleChange = (event, newValue) => {
  setValue(newValue);
  console.log(newValue);
};

或者,您可以在处理程序外部使用useEffect,以便在value发生更改时始终记录它

useEffect(() => {
    console.log(value);
}, [value]);

相关问题