You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Hooks中如何在useEffect内判断布尔值并触发其他状态更新

问题原因

React 的状态更新为异步批处理逻辑,调用setNomStatus之后,当前作用域内的nomStatus仍然是本次渲染周期捕获的旧值(也就是初始定义的false),不会立刻更新为接口返回的最新值,所以你写的判断逻辑无法触发。

解决方法

方法1:直接使用接口返回值判断

你已经在接口响应中拿到了status的实际值,不需要等待状态更新后再判断,直接使用返回值判断即可,修改后代码如下:

const [nomStatus, setNomStatus] = useState(false);

useEffect(() => {
  const fetchData = async () => {
    const email = localStorage.getItem("loginEmail");
    try {
      const res = await Axios.get(
        "http://localhost:8000/service/activeStatus", 
        // 注意:get请求参数需要放在params字段中,原写法无法正确传参
        { params: { email } }
      );
      const currentStatus = res.data[0].status;
      setNomStatus(currentStatus);
      console.log("Get status data :" + currentStatus);
      // 直接用接口返回的最新值判断
      if (currentStatus) {
        setShowCalender(true);
      }
    } catch (e) {
      console.log(e);
    }
  };
  fetchData();
}, []);

方法2:单独监听nomStatus状态变化

如果你后续存在其他修改nomStatus的场景,且每次nomStatus变为true都需要触发日历显示,可以单独新增一个监听nomStatus变化的副作用:

const [nomStatus, setNomStatus] = useState(false);

// 原有获取状态的副作用
useEffect(() => {
  const fetchData = async () => {
    const email = localStorage.getItem("loginEmail");
    try {
      const res = await Axios.get(
        "http://localhost:8000/service/activeStatus", 
        { params: { email } }
      );
      setNomStatus(res.data[0].status);
    } catch (e) {
      console.log(e);
    }
  };
  fetchData();
}, []);

// 新增监听nomStatus变化的副作用
useEffect(() => {
  if (nomStatus) {
    setShowCalender(true);
  }
}, [nomStatus])

补充说明:方法1适合仅在接口请求后做一次判断的场景,方法2适合所有nomStatus变更都要联动触发逻辑的场景,可根据实际业务需求选择。

内容的提问来源于stack exchange,提问作者soccerway

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:18:00