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

react-router-dom使用navigate()跳转后状态变更未触发组件渲染的问题

react-router-dom使用navigate()跳转后状态变更未触发组件渲染的问题

兄弟我看了你的代码,核心问题出在异步请求的时序上!

你现在的流程是这样的:
当从其他页面跳转到BuildBoxPage时,组件会先执行挂载阶段的两个useEffect:一个发起fetchBoxes请求(异步,需要等接口返回数据),另一个监听state的变化。这时候state有值,会立刻调用updateBox,但此时boxes还是初始的空数组,boxes.find根本找不到对应的box,所以box一直是undefined,自然不会渲染BuildBoxForm。

而当你在当前页面导航时,boxes已经提前加载完成了,所以updateBox能正常找到box,渲染就没问题。

给你两个可行的解决方案:

方案一:让updateBox在boxes加载完成后再执行

修改监听state的useEffect,把boxes加入依赖数组,这样当boxes从接口加载完成后,只要state存在,就会重新执行updateBox,这时候就能找到对应的box了:

useEffect(() => {
    // 加上boxes长度判断,避免空数组时无效查找
    if (state != undefined && boxes.length > 0) {
        updateBox(state.barcode)
    }
}, [state, boxes]); // 这里新增boxes作为依赖

方案二:在fetchBoxes完成后处理state里的条码

直接在获取到boxes数据后,检查是否有state传入的条码,如果有就立刻更新box,这样能确保操作时boxes已经有数据了:

useEffect(() => {
    const fetchBoxes = async () => {
        try {
            const res = await fetch('/food/box/v1/boxes', {
                method: "GET",
                headers: {
                    // 这里注意修正:原来的ContentType写错了,应该是带引号的"Content-Type"
                    "Content-Type": "application/json"
                },
            });
            const data = await res.json();
            setBoxes(data.boxes);
            
            // 新增:当boxes加载完成后,检查是否有state条码,有的话更新box
            if (state?.barcode) {
                updateBox(state.barcode);
            }
        } catch (error) {
            console.log("Error fetching boxes", error);
        }
    }
    fetchBoxes();
}, [state]); // 加上state作为依赖,确保state变化时重新执行

另外提个小细节:你fetchBoxes里的请求头ContentType写错了,应该是"Content-Type",少了引号和横线,可能会导致接口请求异常,记得修正哦~

备注:内容来源于stack exchange,提问作者Andreas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 18:08:03