当我使用react-router访问一个功能组件时,它会呈现两次。然而,当我刷新该组件的页面时,它只会呈现一次。
对于测试,创建了如下的空功能组件:
import React from 'react'
const TestFunctional: React.FC<any> = () => {
console.log('Test===>>>') // console log twice when navigate to this component
return <></>
}
export default TestFunctional
字符串
这是App.tsx
中的路由器
import React from 'react'
import { Route, Switch, useLocation, withRouter } from 'react-router-dom'
import TestFunctional from 'views/Test'
const AnimatedSwitch = withRouter(({ location }) => (
<Switch>
<Route exact path="/" component={StartPage} />
<Route exact path="/test" component={TestFunctional} />
</Switch>
))
const App = () => {
return (
<div className="app">
<Web3ReactManager>
<AnimatedSwitch />
</Web3ReactManager>
</div>
)
}
export default App
型
我没有在index.tsx
中使用React.StrictMode
。
ReactDOM.render(
<ApolloProvider client={client}>
<Provider store={store}>
<ConnectedRouter history={history}>
<Web3ReactProvider getLibrary={getLibrary}>
<Web3ProviderNetwork getLibrary={getLibrary}>
<App />
</Web3ProviderNetwork>
</Web3ReactProvider>
</ConnectedRouter>
</Provider>
</ApolloProvider>,
document.getElementById('root')
)
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers
serviceWorker.unregister()
型
所以这是一些奇怪的。当我刷新这个页面,console.log('Test===>>>')
只显示一次。什么是错误和如何修复双重渲染问题?
1条答案
按热度按时间64jmpszr1#
为什么这是个问题?你应该设计/编写你的组件,假设它可以在任何时候重新渲染。React甚至可以在a new rendering mode上工作,在那里你的组件可能会在它真正“在DOM中渲染”之前被渲染多次。
至于为什么它实际上渲染了两次?不确定,可能只是快速的ReactDOM。作为一个侧记,documentation for
component
确实有Route
的警告:使用组件时,(而不是下面的
render
或children
)路由器使用React.createElement
从给定的组件创建一个新的React元素。这意味着如果你向组件prop提供一个内联函数,你会在每次渲染时创建一个新的组件。这会导致现有组件的卸载和新组件的安装,而不仅仅是更新现有组件。当使用一个用于内联渲染的内联函数,使用render
或children
prop(下面)。虽然这不应该适用于这种情况下,仍然方便知道。