React native React路由器与Redux循环-还原器可能不调度操作

React native React路由器与Redux循环-还原器可能不调度操作,react-native,redux,react-router,react-router-redux,redux-loop,React Native,Redux,React Router,React Router Redux,Redux Loop,我正在尝试在重新执行操作后导航到上一个屏幕。我正在使用react-router和react-router-redux以及redux-loop 以下是场景: 在主屏幕上有一个用户列表/home 点击用户进入其个人资料/home/profile/1234 编辑用户名并点击保存this.props.dispatch(UserState.updateUser(id,user,history) 成功更新用户后,返回主屏幕/home 下面是一些代码: 查看: saveProfile = () => {

我正在尝试在重新执行操作后导航到上一个屏幕。我正在使用
react-router
react-router-redux
以及
redux-loop

以下是场景:

  • 在主屏幕上有一个用户列表
    /home
  • 点击用户进入其个人资料
    /home/profile/1234
  • 编辑用户名并点击保存
    this.props.dispatch(UserState.updateUser(id,user,history)
  • 成功更新用户后,返回主屏幕
    /home
  • 下面是一些代码:

    查看:

    saveProfile = () => {
      const user = {
        name: this.state.name
      }
      this.props.dispatch(UserState.updateUser(this.state.id, user, this.props.history))
    }
    
    export function updateUser(id, user, history) {
      return {
        type: UPDATE_USER,
        payload: {
          id,
          user,
          history
        }
      }
    }
    
    case UPDATE_USER:
      return loop(
        state.updateIn(['users', action.payload.id], user => user.merge(fromJS(action.payload.user))),
        Effects.constant(action.payload.history.goBack())
      )
    
    行动:

    saveProfile = () => {
      const user = {
        name: this.state.name
      }
      this.props.dispatch(UserState.updateUser(this.state.id, user, this.props.history))
    }
    
    export function updateUser(id, user, history) {
      return {
        type: UPDATE_USER,
        payload: {
          id,
          user,
          history
        }
      }
    }
    
    case UPDATE_USER:
      return loop(
        state.updateIn(['users', action.payload.id], user => user.merge(fromJS(action.payload.user))),
        Effects.constant(action.payload.history.goBack())
      )
    
    减速器:

    saveProfile = () => {
      const user = {
        name: this.state.name
      }
      this.props.dispatch(UserState.updateUser(this.state.id, user, this.props.history))
    }
    
    export function updateUser(id, user, history) {
      return {
        type: UPDATE_USER,
        payload: {
          id,
          user,
          history
        }
      }
    }
    
    case UPDATE_USER:
      return loop(
        state.updateIn(['users', action.payload.id], user => user.merge(fromJS(action.payload.user))),
        Effects.constant(action.payload.history.goBack())
      )
    
    这会导致一个错误
    减速机可能无法调度操作

    在另一个项目中,我使用了
    redux saga
    ,并且能够成功地将历史对象传递到saga和push/goBack。似乎在尝试传递历史对象并在
    redux循环中调用它时出现了一些问题

    我正在为现有生产应用程序的更新导航系统开发POC,因此需要使用
    redux loop


    任何提示/帮助都将不胜感激。如果我遗漏了任何有帮助的代码,请告诉我。

    我认为@bradford medeiros关于存在的问题是正确的

    Effects.constant(action.payload.history.goBack())

    这是一个副作用,所以它不应该发生在减速器中。您不需要传递历史对象

    不确定您拥有的
    react router redux
    的版本,但它通常会公开一些操作,这些操作可能会导致您想要的更改

    import {goBack} from 'react-router-redux';
    
    
    //in reducer
    return loop(
       state.updateIn(['users', action.payload.id], user => user.merge(fromJS(action.payload.user))),
       Effects.constant(goBack())
    );
    

    它会随着Effects.constant(action.payload.history.goBack())消失吗删除?我假设该库的内部实现导致调度一个操作,这可能是您代码其余部分的副作用。我猜是的。@BradfordMedeiros是的。这也是我的直觉。只是不确定如何正确处理此问题。谢谢提示。我尝试了此方法,尽管我不再使用它t错误,似乎什么也没有发生。看起来好像设置了redux操作,但屏幕上没有任何更改。有什么想法吗?如果您对可能出现的错误有任何想法,请参阅我的代码的公共repo。您似乎调用了createHistory两次。您传递给的历史对象需要与创建存储和middl时使用的历史对象相同电子软件。这将允许您发送的任何操作保持您的react组件树的同步。就是这样!非常感谢您,救了我一天。太好了!很高兴这有帮助。