【发布时间】:2017-10-23 02:38:52
【问题描述】:
我正在学习 redux 并创建了一个 Navbar 组件来处理用户操作。它使用NavLink 将“活动”类添加到我的链接中,以便我可以设置活动链接的样式。当我浏览我的网站时,活动类不会移动,直到我发送一个动作来做出反应(登录/注销是我到目前为止所做的一切)。如果我取出连接的东西并直接使用类组件@987654325 @ 工作正常。将日志添加到 componentDidUpdate 表明在使用 connect 时它没有被调用。
我错过了什么吗?我看到有react-router-redux,但我正在建立一个有趣的网站来学习整个交易,我刚刚开始接触 redux,我不想引入中间件的概念,我绝对不想使用combineReducers,因为此时它只是意味着拥有路由器属性并将其他所有内容推到状态中的“main”之类的东西下。
我正在考虑使用 context 并将整个 redux 状态放在上面...
更新: - 我添加了 react-router-redux,如果我将新的“路由器”添加到我的映射道具,我只能让它更新路由更改。
我有一个 NavbarC 组件类,其渲染方法如下:
render() {
let { props } = this;
return <header className="navbar">
<nav>
<h1><NavLink to="/" exact>Home</NavLink></h1>
<NavLink to="/friends">Friends</NavLink>
</nav>
<div></div>
<div className="center-flex-row">
{ props.busy ? <section className="nav-right"><p>working<span className="spacer"></span><span className="fa fa-spin fa-spinner"></span></p></section> :
props.user ?
<Logout onSignOutClick={props.onSignOutClick} user={props.user} /> :
<Login onSignInClick={props.onSignInClick}/>
}
</div>
</header>
}
我使用 connect():
const mapStateToProps = (state) => {
return { user: state.auth.user, busy: state.auth.busy
}
}
const mapDispatchToProps = (dispatch) => {
return {
onSignInClick: () => {
dispatch(userLogin());
},
onSignOutClick: () => {
dispatch(userLogout());
}
}
}
const Logout = ({ user, onSignOutClick }) => {
return <section className="nav-right">
<button className="btn" onClick={ onSignOutClick }>Sign Out</button>
</section>
}
const Login = ({ onSignInClick }) => {
return <section className="nav-right">
<button className="btn" onClick={ onSignInClick }>Sign In</button>
</section>
}
export const Navbar = connect(mapStateToProps, mapDispatchToProps)(NavbarC)
【问题讨论】:
-
您的
dispatch是做什么的?它是否正确更新了状态? -
这是有效的,它会在用户登录或注销时更新状态。发生这种情况时,导航栏会更新并突出显示新的
NavLink,问题是仅更改链接时它不会更新,因为没有不同的道具,因此连接会阻止组件重新渲染。 NavLinks 必须使用 react-router 提供的上下文中的值,并且 connect 不知道也不关心这些值是否会更改以防止组件重新渲染。