• React Navigation验证流程


    项目需求

    普通登录项目的跳转流程

    • 闪屏(splash)->登录页->首页
    • 闪屏(splash)->首页 (以登录)

    通过context 在个页面中传递数据,新建context的工具类

    export  const AuthContext = React.createContext();
    

    页面需要用AuthContext.Provider 包装

        if (state.isLoading) { //splash 
            return <AuthContext.Provider value={authContext}>
                <SplashScreen></SplashScreen>
            </AuthContext.Provider> 
        }
        return (
            <NavigationContainer>
                <AuthContext.Provider value={authContext}>
                {             
                    state.userToken == null ? ( //未登录
                        <Stack.Navigator screenOptions={{ headerShown: true }}>
                            <Stack.Screen name="Login" component={LoginScreen} options={{ title: "登录" ,animationTypeForReplace: state.isSignout ? 'pop' : 'push'}} />
     
                        </Stack.Navigator>) : ( //已登录
                        <Stack.Navigator screenOptions={{ headerShown: true }}>
                            <Stack.Screen name="Tab" component={HomeTab} options={{ title: "首页" }} />
                            <Stack.Screen name="List" component={ListScreen} />
                            <Stack.Screen name="Profile" component={ProfileScreen} />
                        </Stack.Navigator>)
    
    
                }
                </AuthContext.Provider>
            </NavigationContainer>
        )
    

    在个页面通过context获取值,function组件使用useContext(),详见HookApi

      static contextType = AuthContext;
      this.context
    

    完整代码
    首页

    import 'react-native-gesture-handler';
    import React, { Component, useState,useEffect } from 'react';
    import { NavigationContainer } from '@react-navigation/native';
    import { createStackNavigator } from '@react-navigation/stack';
    import { Image, Button, View, Text, StyleSheet } from 'react-native'
    import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
    
    
    //引入页面模块
    
    import HomeScreen from './HomeScreen';
    import ListScreen from './ListScreen'
    
    import Setting from './Setting'
    import ProfileScreen from './ProfileScreen'
    import SplashScreen from './SplashScreen'
    import LoginScreen from './LoginScreen'
    import {AuthContext} from './Util'
       
    
    function Tab() {
     
        const RootTab = createBottomTabNavigator();
        const Stack = createStackNavigator()
       
     
     
        function switchState(state,action){
            switch (action.type) {
                case 'RESTORE_TOKEN':
                  return {
                    ...state,
                    userToken: action.token,
                    isLoading: false,
                  };
                case 'SIGN_IN':
                  return {
                    ...state,
                    isSignout: false,
                    userToken: action.token,
                  };
                case 'SIGN_OUT':
                  return {
                    ...state,
                    isSignout: true,
                    userToken: null,
                  };
              }
        }
        const [state,dispatch]  = React.useReducer(switchState,{
            isLoading: true,
            isSignout: false,
            userToken: null,
        });
     
        const authContext = React.useMemo(
            () => ({
               
              splashOver: ()=>dispatch({type:"RESTORE_TOKEN"}),
              signIn: async data => {
                // 添加登录逻辑
                await xxxx
                console.log("login"+data)
                dispatch({ type: 'SIGN_IN', token: 'dummy-auth-token' });
              },
              signOut: () => dispatch({ type: 'SIGN_OUT' }),
              signUp: async data => {
            
        
                dispatch({ type: 'SIGN_IN', token: 'dummy-auth-token' });
              },
            }),
            []
          );
        if (state.isLoading) { //splash 
            return <AuthContext.Provider value={authContext}>
                <SplashScreen></SplashScreen>
            </AuthContext.Provider> 
        }
        return (
            <NavigationContainer>
                <AuthContext.Provider value={authContext}>
                {             
                    state.userToken == null ? ( //未登录
                        <Stack.Navigator screenOptions={{ headerShown: true }}>
                            <Stack.Screen name="Login" component={LoginScreen} options={{ title: "登录" ,animationTypeForReplace: state.isSignout ? 'pop' : 'push'}} />
     
                        </Stack.Navigator>) : ( //已登录
                        <Stack.Navigator screenOptions={{ headerShown: true }}>
                            <Stack.Screen name="Tab" component={HomeTab} options={{ title: "首页" }} />
                            <Stack.Screen name="List" component={ListScreen} />
                            <Stack.Screen name="Profile" component={ProfileScreen} />
                        </Stack.Navigator>)
    
    
                }
                </AuthContext.Provider>
            </NavigationContainer>
        )
    
    }
    function HomeTab(params) {
        //...
        return (
            <RootTab.Navigator screenOptions={screenOptionss} tabBarOptions={tabBarOptions}>
                <RootTab.Screen name="Home" component={HomeScreen} options={{ tabBarBadge: 3, title: "首页" }}
                />
                <RootTab.Screen name="Settings" options={{ tabBarBadge: 3, title: "设置" }} component={Setting} />
            </RootTab.Navigator>
        )
    }
     
    export default Tab;
    

    splash页面

    import React, { Component} from 'react';
    import {View,Text,SafeAreaView,Button} from 'react-native'
    import {AuthContext} from './Util'
    
    class SplashScreen extends Component {
        static contextType = AuthContext;
        constructor(props) {
            super(props);
            this.state = {  }
        }
        render() { 
            return ( <SafeAreaView>
                <Text>spalash view</Text>
                <Button title="over" onPress={this.context.splashOver}></Button>
            </SafeAreaView> );
        }
    }
    export default SplashScreen;
    

    登录页

    export default class LoginScreen extends Component {
        constructor(props) {
            super(props);
        }
        static contextType = AuthContext;
        render() {
            return (
                <View>
         
                    <Button title="登录" onPress={this.onAlert.bind(this)}></Button>
                </View>
            )
        }
        onAlert = () => {
            Alert.alert("提示", "是否登录", [
                {
                    text: "是",
                    onPress: () => {
                       this.context.signIn({name:"jack",password:"123"});
                        console.log("登录了!!!")
                    }
                },
                {
                    text: "否",
                    onPress: () => {
                        console.log("取消登录" )
                    }
                }
            ])
        }
    }
    

    退出登录

    class ProfileScreen extends Component {
     
        static contextType = AuthContext;
        
        render() { 
            return ( <View>
                <Text>Profile </Text>
                <Button title="退出登录" onPress={this.context.signOut}></Button>
            </View> );
        }
    }
    
  • 相关阅读:
    创意吃鱼法
    雅礼上课
    坏掉的项链Broken Necklace
    2018-04-02练习
    【11月12日】Hadoop架构
    【11月10日】Redis 主从复制技术
    【11月10日】Redis 缓存系统常见问题及解决方案
    【11月9日】Redis 持久化
    【11月7日】Redis核心对象和数据类型
    【11月7日】Redis简介
  • 原文地址:https://www.cnblogs.com/cnman/p/14951161.html
Copyright © 2020-2023  润新知