javascript - 在 React 上更改 Route 时,Header 组件不断重新渲染
问题描述
当按下 {Link} 并更改 Route 时,标题组件 NavBar 会继续重新渲染,即使在 react-router-dom 的 Switch 组件之外也是如此。
这里是文件:
主 index.js 文件:
import React from 'react'
import styles from './styles.css'
import {Route, Switch} from 'react-router-dom'
import Home from './Home'
import Settings from './Settings'
import Layout from './Layout'
import Contact from './Contact'
import NavBar from 'App/components/NavBar'
export default class MainHome extends React.Component {
static propTypes = {}
render() {
return (
<div className={styles.container}>
<NavBar />
<Switch>
<Route path="/settings" component={Settings} />
<Route path="/contact" component={Contact} />
<Route path="/" component={Home} />
</Switch>
</div>
)
}
}
主页.js
import React from 'react'
import styles from './styles.css'
import {Link} from 'react-router-dom'
export default class Home extends React.Component {
static propTypes = {}
render() {
return (
<div className={styles.container}>
<h1>Hello world</h1>
<Link to="/contact">Contact</Link>
</div>
)
}
}
联系.js
import React from 'react'
import styles from './styles.css'
import {Link} from 'react-router-dom'
export default class Contact extends React.Component {
static propTypes = {}
render() {
return (
<div className={styles.container}>
Contact
<Link to="/">Home</Link>
</div>
)
}
}
当前项目非常简单:index.js 文件包含在 Home 和 Contact 组件中,而 NavBar 组件作为 Switch 之外的标题。
解决方案
@MattyJ 我正在使用 react-router-dom@^4.2.1。带有路由器的组件如下所示:
import React from 'react'
import Root from 'App/Root'
import Pages from './Pages'
import {BrowserRouter} from 'react-router-dom'
export default class App extends React.Component {
render() {
return (
<BrowserRouter key={Math.random()}>
<Root>
<Pages />
</Root>
</BrowserRouter>
)
}
}
Pages 封装了两个组件:App,我的问题中的 Switch 组件位于何处,以及用于管理身份验证的 Auth:
import React from 'react'
import authRouteRegex from './Auth/routeRegex'
import {withRouter} from 'react-router'
import PropTypes from 'prop-types'
import DynamicComponent from 'App/components/DynamicComponent'
import App from './App'
@withRouter
export default class Pages extends React.Component {
static propTypes = {
location: PropTypes.object
}
render() {
if (authRouteRegex.test(this.props.location.pathname)) {
const Component = DynamicComponent(() => import('./Auth'))
return <Component />
}
return <App />
}
}
推荐阅读
- angular - Angular:在字符串上使用 ngSwitch 包括?
- java - Logback 错误:未找到附加的附加程序
- json - 从 json 中检索原始值的问题
- javascript - 如何在 jquery 中切换按钮?
- python-3.x - Python3 - 使用单键访问多键字典
- regex - 从 bash 列表中获取第一个百分比
- jenkins-pipeline - 脚本式和声明式是否同样强大?
- jquery - 登陆第一个 div,向下滚动到下一个 div,然后禁用滚动回第一个 div。如何做到这一点?
- jsf - 使用 CombinedResourceHandler 时出现“无法使用 clientId 'j_idX' 保存动态操作,因为找不到 UIComponent”的警告
- java - 如何在与java对象的所有成员匹配的java对象列表中进行关键字搜索