Javascript 我应该使用Redux Saga进行导航吗?

Javascript 我应该使用Redux Saga进行导航吗?,javascript,react-native,react-redux,react-navigation,redux-saga,Javascript,React Native,React Redux,React Navigation,Redux Saga,我很难理解如何最好地使用 从Redux Saga文档: redux saga是一个库,旨在使React/redux应用程序中的副作用(如数据获取等异步事件和访问浏览器缓存等不纯事件)变得更简单、更好 心智模型是,传奇就像应用程序中的一条单独的线程,只对副作用负责 在React Navigation的redux集成部分中,它链接到显示在没有redux传奇的情况下使用redux的部分。在本例中,组件直接将操作分派给还原器,而不使用中间件 即 src/components/LoginScreen.js

我很难理解如何最好地使用

从Redux Saga文档:

redux saga是一个库,旨在使React/redux应用程序中的副作用(如数据获取等异步事件和访问浏览器缓存等不纯事件)变得更简单、更好

心智模型是,传奇就像应用程序中的一条单独的线程,只对副作用负责

在React Navigation的redux集成部分中,它链接到显示在没有redux传奇的情况下使用redux的部分。在本例中,组件直接将操作分派给还原器,而不使用中间件

src/components/LoginScreen.js 考虑到这一点,我认为有两种选择:

1) 将常规操作(导航等)与产生副作用的操作(异步api请求)分开,并仅将后者用于redux sagas。我假设这需要connect()包装中的mapDispatchToProps选项

2) 要么全力以赴,要么什么都不做,确保一切都通过redux传奇进行调度,这样动作和减缩器就可以尽可能保持纯净。不过,对于导航来说,这是不必要的复杂


你认为哪种做法更好?

不确定你是否完全掌握了传奇的概念。使用sagas,您可以声明某些操作的副作用,这些副作用可能会分派其他操作。但你不会改变你行动的方式。而且这与导航无关。导航没有任何副作用,它是带减缩器的纯状态操作。当然,某些导航操作可能会触发加载数据的副作用。然后你会在那些有副作用的具体行动上使用传奇故事。但这就像其他副作用一样。因此,关于使用redux saga的决定应该与您的导航解决方案无关

一般来说,传奇故事会对引发副作用的行为做出反应,并可能会采取其他行动。减速器将通过改变状态对动作作出反应,而不会产生副作用


您的备选方案是在动作创建者中分派动作之前处理副作用(就像redux thunk那样)。还有redux observable,它的模式与redux saga类似,但基于RxJS,没有使用redux saga的elm模式

我问了同样的问题,但我不明白你们的意思,用减速器改变路线是什么意思?react router dom为您提供了一些导航方法,如useHistory和push方法,我通常使用链接组件来导航90%的应用程序,但我不确定组件是否应该以编程方式向后导航,或者使用saga捕获并执行goback的导航操作
const LoginScreen = ({ navigation }) => (
  <View style={styles.container}>
    <Text style={styles.welcome}>
      Screen A
    </Text>
    <Text style={styles.instructions}>
      This is great
    </Text>
    <Button
      onPress={() => navigation.dispatch({ type: 'Login' })}
      title="Log in"
    />
  </View>
);
function nav(state = initialNavState, action) {
  let nextState;
  switch (action.type) {
    case 'Login':
      nextState = AppNavigator.router.getStateForAction(
        NavigationActions.back(),
        state
      );
      break;
    case 'Logout':
      nextState = AppNavigator.router.getStateForAction(
        NavigationActions.navigate({ routeName: 'Login' }),
        state
      );
      break;
    default:
      nextState = AppNavigator.router.getStateForAction(action, state);
      break;
  }

  // Simply return the original `state` if `nextState` is null or undefined.
  return nextState || state;
}