zoukankan      html  css  js  c++  java
  • 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> );
        }
    }
    
  • 相关阅读:
    poj 1860 Currency Exchange(最短路径的应用)
    poj 2965 The Pilots Brothers' refrigerator
    zoj 1827 the game of 31 (有限制的博弈论)
    poj 3295 Tautology (构造法)
    poj 1753 Flip Game(枚举)
    poj 2109 (贪心)
    poj 1328(贪心)
    Qt 对单个控件美化
    Qt 4基础
    Bash Shell
  • 原文地址:https://www.cnblogs.com/cnman/p/14951161.html
Copyright © 2011-2022 走看看