Hir*_*oki 7 javascript react-router redux react-redux
我对如何将 React Routerhistory.push('/route')
与Redux
.
换句话说,如果你将一个组件与 Redux 的 连接起来,你mapDispatchToProps
如何放置history.push('/route')
它应该在调度某个动作后被触发?
为了澄清这个问题,这是我的实验片段......
class PostContainer extends React.Component {
handleSubmit(data) {
return this.props.addPost(data);
}
render() {
return (<Post onSubmit={data=> this.handleSubmit(data)}/>);
}
}
const mapDispatchToProps = (dispatch) => {
return {
addPost: (data) => {
dispatch(addPost(data)).data.then((result) => {
dispatch(addPostFulfilled(result.data));
//How do you call the following function?
this.props.history.push('/posts')
}).catch((error) => {
dispatch(addPostRejected());
});
},
}
}
export default connect(null, mapDispatchToProps)(PostContainer);
Run Code Online (Sandbox Code Playgroud)
如您所见,只要通过 将帖子添加到 Redux 的状态addPostFulfilled
,页面就需要/posts
通过 history.push移动到。
根据 Redux 的文档,容器用于更新状态(以及获取数据)。所以,愚蠢的组件不应该把history.push
.
有什么比上面的代码更好的方法?
任何建议将被认真考虑。
您可以使用 react-router-redux (需要初始设置)并从动作创建者处分派您的动作
import { push } from 'react-router-redux'
class PostContainer extends React.Component {
handleSubmit(data) {
return this.props.addPost(data);
}
render() {
return (
<div>
<Post onSubmit={data=> this.handleSubmit(data)}/>
</div>
);
}
}
const mapDispatchToProps = (dispatch) => {
return {
addPost: (data) => {
dispatch(addPost(data)).data.then((result) => {
dispatch(addPostFulfilled(result.data));
//How do you call the following function?
dispatch(push('/posts'));
}).catch((error) => {
dispatch(addPostRejected());
});
},
}
}
export default connect(null, mapDispatchToProps)(PostContainer);
Run Code Online (Sandbox Code Playgroud)
或者只是将推送作为“完成回调”传递。
class PostContainer extends React.Component {
handleSubmit(data, done) {
return this.props.addPost(data, done);
}
render() {
const { push } = this.props.history;
return (
<div>
<Post onSubmit={data=> this.handleSubmit(data, push)}/>
</div>
);
}
}
const mapDispatchToProps = (dispatch) => {
return {
addPost: (data, done) => {
dispatch(addPost(data)).data.then((result) => {
dispatch(addPostFulfilled(result.data));
//How do you call the following function?
done('/posts')
}).catch((error) => {
dispatch(addPostRejected());
});
},
}
}
export default connect(null, mapDispatchToProps)(PostContainer);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10994 次 |
最近记录: |