useEffect 在依赖没有变化的情况下执行
useEffect executing despite no change in dependency
我已经阅读了几个类似的问题并尝试了每个问题的解决方案,但 none 似乎有效并且与我的用例不完全匹配,因为我正在使用 react-router。
在我的 App.js 中,我将 refreshTokenId 的值设置为某个 UUID。我在 App.js 中有一个子组件,它在初始渲染时发送一个 API 调用来获取一些数据。现在,我已将 refreshTokenId 添加为我的 useEffect 挂钩的依赖项,其中包含 API 调用。我正在使用 react-router,当我从页面导航然后返回时,尽管依赖项(即 refreshTokenId)没有改变,但 API 调用再次被触发。我通过在我的 Redux 开发工具中穿越时间并观察状态来确认这一点。第一次,也是唯一一次 refreshTokenId 发生变化,是在安装我的 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);
App.js
const App = (props)=> {
useEffect(()=>{
props.refresh();
},[]);
return (
<div className="App">
<Switch>
<Route path = "/manager" component = {DataManager} />
<Route path = "/index" component = {HomePage} />
<Route path = "/logout" component = {Logout} />
</Switch>
</div>
);
}
const mapDispatchToProps = dispatch => {
return{
refresh: () => dispatch(actions.appRefresh())
};
};
export default connect(mapStateToProps, mapDispatchToProps)(App);
您可以使用 render
代替 component
:
<Route path="/manager" render={DataManager} />
当您使用 组件 时,路由器会在每次渲染时创建一个新组件。
当您使用 render 时,路由器只会重新渲染组件。
如果需要,即对于 class 组件,您可以传递一个 returns JSX:
的函数
<Route
path="/manager"
render={(props) => <DataManager {...props} />}
/>
我已经阅读了几个类似的问题并尝试了每个问题的解决方案,但 none 似乎有效并且与我的用例不完全匹配,因为我正在使用 react-router。
在我的 App.js 中,我将 refreshTokenId 的值设置为某个 UUID。我在 App.js 中有一个子组件,它在初始渲染时发送一个 API 调用来获取一些数据。现在,我已将 refreshTokenId 添加为我的 useEffect 挂钩的依赖项,其中包含 API 调用。我正在使用 react-router,当我从页面导航然后返回时,尽管依赖项(即 refreshTokenId)没有改变,但 API 调用再次被触发。我通过在我的 Redux 开发工具中穿越时间并观察状态来确认这一点。第一次,也是唯一一次 refreshTokenId 发生变化,是在安装我的 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);
App.js
const App = (props)=> {
useEffect(()=>{
props.refresh();
},[]);
return (
<div className="App">
<Switch>
<Route path = "/manager" component = {DataManager} />
<Route path = "/index" component = {HomePage} />
<Route path = "/logout" component = {Logout} />
</Switch>
</div>
);
}
const mapDispatchToProps = dispatch => {
return{
refresh: () => dispatch(actions.appRefresh())
};
};
export default connect(mapStateToProps, mapDispatchToProps)(App);
您可以使用 render
代替 component
:
<Route path="/manager" render={DataManager} />
当您使用 组件 时,路由器会在每次渲染时创建一个新组件。
当您使用 render 时,路由器只会重新渲染组件。
如果需要,即对于 class 组件,您可以传递一个 returns JSX:
的函数<Route
path="/manager"
render={(props) => <DataManager {...props} />}
/>