我正在使用以下内容:
反应v16.2.0,react-redux v5.0.7,react-router-dom v4.2.2,redux v3.7.2
我想要实现的是从 Auth
组件更新一些道具,当用户导航到 /user
(加载 Userpage
组件)时,应显示修改过的道具 . 这是我的代码的简化版本:
在App.js中:
import React, { Component } from 'react';
import { Provider } from 'react-redux';
import Store from './components/Store';
import Home from './components/Home';
import Auth from './components/auth';
import Userpage from './components/Userpage';
import { BrowserRouter as Router, Route } from 'react-router-dom';
class App extends Component {
render() {
return (
<Provider store={Store}>
<Router>
<div>
<Route exact path="/" component={Home}/>
<Route path="/login" component={Auth}/>
<Route path="/user" component={Userpage}/>
</div>
</Router>
</Provider>
);
}
}
export default App;
在Store.js中:
import { createStore } from 'redux';
const reducer = (state,action) => {
if(action.type == 'TEST'){
return Object.assign({},state,{test:action.payload.test});
} else
return state;
}
export default createStore(reducer,{
test:'DOES NOT WORK',
})
在Auth.js:
import React from 'react';
import { connect } from 'react-redux';
import Userpage from './Userpage';
class Auth extends React.Component {
componentWillMount() {
this.props.update('TEST',{test:'WORKS'});
}
render() {
return(
<div>
<Userpage/>
</div>
);
}
}
export default connect(
(store) => {
return store;
},
(dispatch) => {
return {
update:(dispatchType, dispatchPayload) => {
dispatch({type:dispatchType,payload:dispatchPayload});
}
}
}
)(Auth);
在Userpage.js中:
import React, { Component } from 'react';
import { connect } from 'react-redux';
class Userpage extends Component{
componentDidMount(){
console.log(this.props.test);
}
render(){
return null;
}
}
export default connect(
(store) => {
return store;
}
)(Userpage);
现在,当我导航到/ login时,商店已更新, test
设置为"WORKS" . 但是,如果我导航到/ userpage, console.log(this.props.test)
打印"DOES NOT WORK",而不是更新的道具 .
为了测试,我在 Auth
的渲染功能中包含了 Userpage
,并且它正确地控制了日志"WORKS" .
那么为什么redux商店显然会在使用react-router导航到另一个页面时重置为默认值?我怎样才能解决这个问题?
1 回答
找到了解决方案 . 显然,当您手动导航(通过在浏览器中键入URL)时,整个应用程序会重新呈现,从而重置redux存储 .
如react-router docs中所述使用
Link
或使用this.props.history.push('/user')
重定向可以正常工作 .