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

标签 javascript redux react-router react-redux

对于如何将 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/

相关文章:

javascript - 集合内的 meteor 显示数组

javascript - 更好的缓存以消除帧丢失

reactjs - 使用一个大型 React 组件有哪些缺点?

firebase - 我在独立应用程序 expo-deeplink 上测试后,调度功能似乎运行了不止一次

reactjs - 使用react-router获取所有可能路径的列表

express - 允许express将路由传递给react-router

javascript - 单行辅助函数上是否可以有或是否有 Javascript addEventListener 多个参数?

javascript - 在相同 ip 但不同端口上使用 Rest API

reactjs - 如何正确设置对 React 组件的引用?

reactjs - 是否可以将 Gatsby 与常规的 React 单页应用程序并排运行?