React-navigation导航系统(4)-Redux的整合实例
来源:互联网 发布:coc淘宝买宝石安全吗 编辑:程序博客网 时间:2024/06/07 23:36
tags: React-Native
整合实例,其实这完全是Redux的使用,文档里的例子没有写全所以不太好看,github的例子,代码就比较全了.
对Redux的概念理解了这个看起来就简单一点.如果对于Redux的概念不理解,可以看我的几篇翻译文章和前面写的Redux的理解文章.
简书没有目录导航,不是太好看.可以看看我的博客,里面有目录结构.
我理解其中的流程就是,
- React组件接受props,获取state和dispatch.
- 组件dispatch action改变navigation的state.
3.根据state的相应变化加载对应的screen.
/** * @flow */import React from 'react';import { AppRegistry, AsyncStorage, Button, StyleSheet, Text, View,} from 'react-native';import { NavigationActions, addNavigationHelpers, StackNavigator,} from 'react-navigation';import { Provider, connect,//redux,connect函数,负责向展示组件注入state和dispatch} from 'react-redux';import { createStore, combineReducers,} from 'redux';import { persistStore, autoRehydrate,} from 'redux-persist';//redux state持久化的中间件const ProfileScreen = ({ navigation }) => (//这个组件没有dispatch <View style={styles.container}> <Text style={styles.welcome}> Profile Screen </Text> </View>);ProfileScreen.navigationOptions = {//配置navigationOptions对象 title: 'Profile',};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>);LoginScreen.navigationOptions = { title: 'Log In',};//connect 注入state和dispatch//connect注入的组件是动态加载的const LoginStatusMessage = connect(state => ({ isLoggedIn: state.auth.isLoggedIn,}))(({ isLoggedIn, dispatch }) => {//注入组件的动态加载部分 if (!isLoggedIn) { return <Text>Please log in</Text>; } return ( <View> <Text style={styles.welcome}> {'You are "logged in" right now'} </Text> <Button onPress={() => dispatch(NavigationActions.navigate({ routeName: 'Profile' }))} title="Profile" /> </View> );});const AuthButton = connect(state => ({ isLoggedIn: state.auth.isLoggedIn,}), dispatch => ({ logout: () => dispatch({ type: 'Logout' }), login: () => dispatch(NavigationActions.navigate({ routeName: 'Login' })),}))(({ logout, login, isLoggedIn }) => ( <Button title={isLoggedIn ? 'Log Out' : 'Log In'} onPress={isLoggedIn ? logout : login} />));const MainScreen = () => ( <View style={styles.container}> <LoginStatusMessage /> <AuthButton /> </View>);MainScreen.navigationOptions = { title: 'Home Screen',};const AppNavigator = StackNavigator({ Login: { screen: LoginScreen }, Main: { screen: MainScreen }, Profile: { screen: ProfileScreen },});const AppWithNavigationState = connect(state => ({ nav: state.nav,}))(({ dispatch, nav }) => ( <AppNavigator navigation={addNavigationHelpers({ dispatch, state: nav })} />));const initialNavState = { index: 1, routes: [ { key: 'InitA', routeName: 'Main' }, { key: 'InitB', routeName: 'Login' }, ],};const initialAuthState = { isLoggedIn: false };const AppReducer = combineReducers({//路由状态的改变实际逻辑 nav: (state = initialNavState, action) => { if (action.type === 'Login') { return AppNavigator.router.getStateForAction(NavigationActions.back(), state); } if (action.type === 'Logout') { return AppNavigator.router.getStateForAction(NavigationActions.navigate({ routeName: 'Login' }), state); } return AppNavigator.router.getStateForAction(action, state); }, auth: (state = initialAuthState, action) => { if (action.type === 'Login') { return { ...state, isLoggedIn: true }; } if (action.type === 'Logout') { return { ...state, isLoggedIn: false }; } return state; },});class ReduxExampleApp extends React.Component {//创建store store = createStore(AppReducer, undefined, autoRehydrate()); componentDidMount() {//持久化恢复储存的state persistStore(this.store, { storage: AsyncStorage }); } render() { return ( <Provider store={this.store}> <AppWithNavigationState /> </Provider> ); }}const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', }, welcome: { fontSize: 20, textAlign: 'center', margin: 10, }, instructions: { textAlign: 'center', color: '#333333', marginBottom: 5, },});AppRegistry.registerComponent('ReduxExample', () => ReduxExampleApp);
0 1
- React-navigation导航系统(4)-Redux的整合实例
- React-Navigation与Redux整合详解
- React-Navigation与Redux整合详解
- React-navigation导航系统(1)
- React-navigation导航系统(2)
- React-navigation导航系统(5)-Router
- React-navigation导航系统(6)-Views
- react-native react-navigation集成redux以及验证的flow
- React-navigation导航系统(3)-高级指南
- react-redux使用实例
- Navigation导航系统
- react-Native-Experimental-Navigation-with-redux(一)
- 最简单的React和Redux整合的例子
- 最简单的React和Redux整合的例子
- React和Redux的连接react-redux
- React和Redux的连接react-redux
- React和Redux的连接react-redux
- React和Redux的连接react-redux
- Android Arcgis入门(11)、Callout气泡的显示
- Git入门——分支的基本使用与'合并'、'多人协作'常遇到的问题
- 初入Fragment(1)——静态加载fragment
- 多tomcat服务器配置,明天做的e1
- Hibernate 的三种查询方式:HQL、Criteria、Sql
- React-navigation导航系统(4)-Redux的整合实例
- BZOJ 2927: [Poi1999]多边形之战
- 查看os上安装了几块HCA卡
- 1
- JavaScript的数据类型和包装对象
- 算法竞赛入门经典(第2版) 习题2-2
- 广度优先搜索算法
- 2
- 使用jquery.autocomplete.js插件实现自动补全进行查询