reactjs React Functional Component在导航到该组件后渲染两次,但在尝试刷新时,仅渲染一次

0ve6wy6x  于 9个月前  发布在  React
关注(0)|答案(1)|浏览(115)

当我使用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===>>>')只显示一次。什么是错误和如何修复双重渲染问题?

64jmpszr

64jmpszr1#

为什么这是个问题?你应该设计/编写你的组件,假设它可以在任何时候重新渲染。React甚至可以在a new rendering mode上工作,在那里你的组件可能会在它真正“在DOM中渲染”之前被渲染多次。
至于为什么它实际上渲染了两次?不确定,可能只是快速的ReactDOM。作为一个侧记,documentation for component确实有Route的警告:
使用组件时,(而不是下面的renderchildren)路由器使用React.createElement从给定的组件创建一个新的React元素。这意味着如果你向组件prop提供一个内联函数,你会在每次渲染时创建一个新的组件。这会导致现有组件的卸载和新组件的安装,而不仅仅是更新现有组件。当使用一个用于内联渲染的内联函数,使用renderchildren prop(下面)。
虽然这不应该适用于这种情况下,仍然方便知道。

相关问题