Reactjs useEffect在依赖项没有变化的情况下执行

Reactjs useEffect在依赖项没有变化的情况下执行,reactjs,redux,react-redux,use-effect,Reactjs,Redux,React Redux,Use Effect,我已经阅读了几个类似的问题,并尝试了每一个问题的解决方案,但似乎没有一个是有效的,不符合我的用例,因为我正在使用react路由器 在我的App.js中,我将refreshTokenId的值设置为某个UUID。我在App.js中有一个子组件,它在初始渲染时发送一个API调用来获取一些数据。现在,我已经将refreshTokenId作为依赖项添加到useEffect挂钩中,其中包含API调用。我正在使用react router,当我从页面导航然后返回时,API调用再次启动,尽管依赖性(即refres

我已经阅读了几个类似的问题,并尝试了每一个问题的解决方案,但似乎没有一个是有效的,不符合我的用例,因为我正在使用react路由器

在我的App.js中,我将refreshTokenId的值设置为某个UUID。我在App.js中有一个子组件,它在初始渲染时发送一个API调用来获取一些数据。现在,我已经将refreshTokenId作为依赖项添加到useEffect挂钩中,其中包含API调用。我正在使用react router,当我从页面导航然后返回时,API调用再次启动,尽管依赖性(即refreshTokenId)没有改变。我通过在Redux开发工具中穿越时间并观察状态来证实这一点。第一次也是唯一一次refreshTokenId更改是在安装my App.js时。这是因为我最初在App.js中的useEffect中设置了refreshTokenId的值

我不明白为什么我的子组件中的useEffect在依赖项不变的情况下启动。 我在下面放了一些代码来演示这个问题:

childComponent:
const DataManager = (props) => {

    const refreshTokenId = props.refreshTokenId
    useEffect(() =>{
        props.datasetInfoRequest() 
    }, [refreshTokenId]); <---refreshTokenId does not change when routing around

const mapDispatchToProps =  dispatch => {
    return {
        datasetInfoRequest: () => dispatch(actions.datasetInfoInit())
}

const mapStateToProps = state => {
    return {
        refreshTokenId: state.refresh.refreshTokenId,
        lastRefreshed: state.refresh.lastRefreshed
    }
};

export default connect(mapStateToProps, mapDispatchToProps)(DataManager);

childComponent:
常量数据管理器=(道具)=>{
const refreshtTokenId=props.refreshtTokenId
useffect(()=>{
props.DataSetteForequest()
},[refreshTokenId]){
返回{
DataSetteForequest:()=>dispatch(actions.DataSetteForeUnit())
}
常量mapStateToProps=状态=>{
返回{
refreshTokenId:state.refresh.refreshTokenId,
LastRefresh:state.refresh.LastRefresh
}
};
导出默认连接(MapStateTrops、mapDispatchToProps)(DataManager);
App.js
常量应用=(道具)=>{
useffect(()=>{
props.refresh();
},[]);
返回(
);
}
const mapDispatchToProps=调度=>{
返回{
刷新:()=>调度(actions.appRefresh())
};
};
导出默认连接(mapStateToProps、mapDispatchToProps)(应用程序);

您可以使用
渲染
而不是
组件

<Route path="/manager" render={DataManager} />

使用组件时,路由器会在每次渲染时创建一个新组件

使用“渲染”时,路由器将只重新渲染组件

如果需要,例如对于类组件,可以传递一个返回JSX的函数:

<Route
  path="/manager"
  render={(props) => <DataManager {...props} />}
/>
}
/>

可能是因为父remountedApp.js不会被重新装载,所以组件被重新装载。我想可能是react router导致它在旧状态下重新呈现。但不确定如何避免,否则我的应用程序会进行额外的API调用,破坏我拥有的D3图形。您可以使用react devtools
Profile
专长然后查看是什么导致它重新呈现或重新计算刷新状态为新对象?使用
重新选择
库中的
createSelector
之类的工具来记忆您的值。刷新操作本身仅在App.js加载时调度一次。然后设置refreshTokenId,然后在用户选择refr时也设置refreshTokenIdesh,在这种情况下,我确实希望发送额外的API调用。但除非点击刷新按钮。react router文档中:“当您使用组件(而不是下面的渲染或子组件)时”路由器使用React.createElement从给定组件创建一个新的React元素。这意味着,如果您向组件道具提供一个内联函数,则您将在每次渲染时创建一个新组件“.我没有提供内联函数,所以这是真的吗?还是我误解了文档…嗨@TeeJ-你的组件是一个函数
<Route
  path="/manager"
  render={(props) => <DataManager {...props} />}
/>