vic*_*nyy 5 javascript reactjs react-router
我有服务器端React/Redux/Express应用程序.React-router v4为使用Switch的服务器应用程序提供解决方案,我需要使用一些东西来改变我的NavBar组件的位置
应用
import React, { Component } from 'react'
import { connect } from 'react-redux'
import { bindActionCreators } from 'redux'
import { Switch, Route, Redirect, Link} from 'react-router-dom'
import FirstPage from './FirstPage'
import Test from './Test'
import LoginPage from './login/LoginPage'
import NoMatch from '../components/NoMatch'
import NavBar from '../components/NavBar'
import * as loginActions from '../actions/login'
import 'bootstrap/dist/css/bootstrap.css';
class App extends Component {
render(){
return (
<div>
<NavBar/>
<h1>EffortTracker v3.0.1</h1>
<Switch >
<Route exact path="/" render={loginRedirect(<FirstPage/>)}/>
<Route path="/first" render={loginRedirect(<FirstPage/>)}/>
<Route path="/second" render={loginRedirect(<Test/>)}/> />
<Route path="/login" render={()=><LoginPage {...this.props.login}/>} />
<Route component={NoMatch}/>
</Switch>
<Link to={'/first'}>First</Link>
</div>
)
}
}
const loginRedirect=(component) => {
if(!isLoggedIn()) return ()=> <Redirect to='login'/>
return ()=> component
}
const isLoggedIn= ()=>{
let token = localStorage.getItem('token')
if (token !== null)return false
else return true
}
const mapStateToProps = state => ({
login: state.login,
error: state.error,
isLoading: state.isLoading,
})
const mapDispatchToProps = dispatch => ({
loginActions: bindActionCreators(loginActions, dispatch)
})
export default connect(
mapStateToProps,
mapDispatchToProps
)(App)
Run Code Online (Sandbox Code Playgroud)
需要从NavBar更改
import React from 'react'
import { Link, NavLink } from 'react-router-dom'
import classnames from 'classnames'
const NavBar =()=> {
return (
<nav className={classnames("navbar", "navbar-inverse bg-inverse")}>
<form className="form-inline">
<Link to={'/'}>
<button className={classnames("btn", "btn-sm", "align-middle", "btn-outline-secondary")}
type="button">
Smaller button
</button>
</Link>
<NavLink to='/login'>
Login
</NavLink>
</form>
</nav>
)
}
export default NavBar
Run Code Online (Sandbox Code Playgroud)
如果我从浏览器URL手动导航它的工作就好了,但如果我点击链接或NavLink网址更新但不是应用程序切换.当loginRedirect到/ login它没有出现并且需要刷新页面时我也遇到了问题(可能这两个是相关的).如何解决这个问题?
我认为这里的问题在于 redux .. 因为只要 props 没有改变,它就会阻止重新渲染组件,
\n\n\n这是因为 connect() 默认实现 shouldComponentUpdate,假设您的组件在给定相同的 props 和 state 的情况下将产生相同的结果。
\n最好的解决方案是确保您的组件是纯粹的,并通过 props 将任何外部状态传递给它们。这将确保您的视图不会重新渲染,除非它们确实需要重新渲染,并且将大大加快您的应用程序的速度。
\n如果 \xe2\x80\x99 无论出于何种原因都不实用(例如,如果你\xe2\x80\x99 使用的库严重依赖于 React 上下文),则可以将 pure: false 选项传递给 connect():
\n
function mapStateToProps(state) {\n return { todos: state.todos }\n}\n\nexport default connect(mapStateToProps, null, null, {\n pure: false\n})(TodoApp)\nRun Code Online (Sandbox Code Playgroud)\n以下是更多解释的链接:
\n\n\n| 归档时间: |
|
| 查看次数: |
1099 次 |
| 最近记录: |