Reactjs React路由器组件DIDMOUNT在切换路由后未执行

Reactjs React路由器组件DIDMOUNT在切换路由后未执行,reactjs,react-router,Reactjs,React Router,我正在创建一个react web应用程序,使用react路由器在页面之间导航。其中一些页面依赖于导航到该页面时运行的componentDidMount。然而,除非我刷新页面,否则它似乎不会运行,这对用户来说似乎非常违反直觉 有没有办法强制componentDidMount在render方法完成时运行 很抱歉,如果这是一个重复的问题,但我所看到的没有帮助我理解如何解决这个问题 componentDidMount = async () => { //initialize web3

我正在创建一个react web应用程序,使用react路由器在页面之间导航。其中一些页面依赖于导航到该页面时运行的componentDidMount。然而,除非我刷新页面,否则它似乎不会运行,这对用户来说似乎非常违反直觉

有没有办法强制componentDidMount在render方法完成时运行

很抱歉,如果这是一个重复的问题,但我所看到的没有帮助我理解如何解决这个问题

componentDidMount = async () => {
    //initialize web3
    const web3 = await getWeb3();

    // get contract address
    const ethAddress = await storehash.options.address
    this.setState({ethAddress})

    //set account for Blockchain network
    this.setState({account: await web3.eth.getAccounts()})
    }

tl;dr-仅路由渲染的组件(及其子组件)将在路由更改时重新渲染。

我要做一些假设。一个是您尝试使用的
componentDidMount
位于不是您的路由组件的子组件上

我要做的第二个假设是,当该组件挂载时,您不需要运行,而是当一个新路由的组件挂载时运行

路由呈现的组件中的
componentDidMount
函数可能就是您需要的位置。但是,如果您需要在某个组件的子组件挂载时更新该组件的状态,那么这将无济于事。然而,你可以用两种不同的方法来解决这个问题

又快又脏不要养成这样做的习惯

如果您只是在测试某些东西,那么一种快速而肮脏的方法是使用路由的
渲染
属性,而不是
组件

例如,如果您的路线如下所示:

<Route path="/some-route" component={NewComponent} />
然后您将拥有一个函数(
this.props.onRouteLoaded(…)
),可以在
NewComComponent
componentDidMount
上运行,而不是在此父组件上运行。如果需要访问父组件的状态、道具等,这将允许您向上传递变量

如果需要,建议您这样做


一种更简洁的方法是使用Redux状态来传递值,但是(完全尊重地)在违反Redux之前(但是您应该违反Redux!)先了解React生命周期。

Componentdidmount只在呈现组件时运行一次。您可以尝试使用其他生命周期。此外,如果您在多个组件上执行相同的初始化,您可以将其移动到父级并通过props传递,或者将逻辑移动到您要查找的事件中,我猜是
组件将接收props
。。每次组件收到新的道具时都会调用它,需要重新渲染。不过,我没有向新页面发送任何道具,我只是想在新路由加载时运行一些代码。您导航到的地址与相同的
路由匹配,但具有不同的参数,对吗?
<Route path="/some-route" render={(props) => {
    //do your console log or temporary testing stuff here
    return <NewComponent ...props />
}} />
someFunction = (passedVar) => {
    // do something with passedVar, which you'll pass from the new component
}

// ... then in the Router...

<Route path="/some-route" render={(props) => <NewComponent ...props onRouteLoaded={this.someFunction} />}} />