gpt4 book ai didi

javascript - Redux 和 React 路由器 : Combing dispatch and navigation (history. 推送)

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:41:04 25 4
gpt4 key购买 nike

对于如何将 React Router 的 history.push('/route')Redux 结合使用,我有点一头雾水。

换句话说,如果你用 Redux 的 mapDispatchToProps 连接一个组件,你怎么把应该在之后触发的 history.push('/route')调度某个 Action ?

为了澄清这个问题,这里是我的实验片段......

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);

如您所见,一旦通过 addPostFulfilled 将帖子添加到 Redux 的状态中,页面就需要通过 history.push 移动到 /posts

根据 Redux 的文档,容器用于更新状态(以及获取数据)。因此,dumb组件不应该放置任何类似 history.push 的内容。

有什么方法比上面的代码更好?

任何建议将不胜感激。

最佳答案

您可以使用 react-router-redux(需要初始设置)并从 Action 创建者发送您的 Action

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);

或者只是将推送作为“完成回调”传递。

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);

关于javascript - Redux 和 React 路由器 : Combing dispatch and navigation (history. 推送),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47957851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com