useImperativeHandle返回值未同步至ref,路由切换需两次点击问题排查
上下文值未实时同步ref状态
ExploreFilterContext.Provider直接把filterRef.current作为value传递,但组件首次渲染时,Filter还没完成挂载,useImperativeHandle还没给ref赋值,所以上下文一开始传的是undefined。而且useRef的current字段变化不会触发组件重渲染,就算之后ref有了有效值,上下文的value也不会自动更新,得等Explore组件因为路由参数变化这类原因重渲染时,才会把最新的ref值传进去。路由切换时ref赋值时机滞后
路由切换时,Explore组件先重渲染,而Filter是通过setSubHeader挂载到子头部的,它的挂载时机晚于Explore的渲染周期。第一次切路由时,Explore渲染完,Filter才开始挂载,这时候ref还没被赋值;第二次切路由时,之前的Filter已经完成挂载,ref有了值,所以才能拿到有效值。useEffect清理逻辑失效
你在useEffect里把filterRef.current赋值给cleanUp的时候,Filter还没挂载,cleanUp是undefined,所以返回的清理函数里cleanUp?.resetFilters()根本不会执行,起不到清理过滤器的作用。useEffect依赖设置不合理
useEffect的依赖只有setSubHeader,如果setSubHeader是稳定的(比如来自useState的setter),那当路由参数变化时,这个useEffect不会重新执行,setSubHeader里的Filter组件可能不会更新,导致ref一直是旧值或者未赋值。
内容的提问来源于stack exchange,提问作者Stefan Falk

