代码之家  ›  专栏  ›  技术社区  ›  Hauuguu

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

  •  5
  • Hauuguu  · 技术社区  · 7 年前

    Redux-Saga 具有 React-Navigation .

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

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

    在React Navigation的redux集成部分,它链接到 this example 这表明在没有Redux传奇的情况下使用Redux。在本例中,组件直接向还原器调度动作,而不需要中间件。

    即。

    src/components/LoginScreen。js公司

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

    src/减速器/导航。js公司

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

    考虑到这一点,我看到了两种选择:

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

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   MrLoh    7 年前

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

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

    你的选择是在动作生成器中调度动作之前处理副作用(就像redux thunk那样)。还有redux observable,它的模式与redux saga类似,但基于RxJS,没有使用redux saga的elm模式。