Redux & React Router:结合调度和导航(history.push)

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.

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

任何建议将被认真考虑。

Den*_*lka 7

您可以使用 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)