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