Javascript 我应该使用Redux Saga进行导航吗?
我很难理解如何最好地使用 从Redux Saga文档: redux saga是一个库,旨在使React/redux应用程序中的副作用(如数据获取等异步事件和访问浏览器缓存等不纯事件)变得更简单、更好 心智模型是,传奇就像应用程序中的一条单独的线程,只对副作用负责 在React Navigation的redux集成部分中,它链接到显示在没有redux传奇的情况下使用redux的部分。在本例中,组件直接将操作分派给还原器,而不使用中间件 即 src/components/LoginScreen.js 考虑到这一点,我认为有两种选择: 1) 将常规操作(导航等)与产生副作用的操作(异步api请求)分开,并仅将后者用于redux sagas。我假设这需要connect()包装中的mapDispatchToProps选项 2) 要么全力以赴,要么什么都不做,确保一切都通过redux传奇进行调度,这样动作和减缩器就可以尽可能保持纯净。不过,对于导航来说,这是不必要的复杂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
你认为哪种做法更好?不确定你是否完全掌握了传奇的概念。使用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;
}