zoukankan      html  css  js  c++  java
  • React-Navigation web前端架构

    React-Navigation

    前端架构

    准备

        /*安装组件*/
        npm install --save react-navigation
        
        npm install --save react-native-gesture-handler
        
        /*添加依赖*/
        react-native link react-native-gesture-handler
        

    tips

        如果是通过react-cli 脚手架打包的工程可能出现安装时缺少依赖,我的根据官网上教程指导,就出现这个问题。
        问题:
        bogon:AwesomeProject fandong$ npm install -g react-navigation
    npm WARN react-navigation@3.8.1 requires a peer of react@* but none is installed. You must install peer dependencies yourself.
    npm WARN react-navigation@3.8.1 requires a peer of react-native@* but none is installed. You must install peer dependencies yourself.
    npm WARN @react-navigation/native@3.4.1 requires a peer of react@* but none is installed. You must install peer dependencies yourself.
    npm WARN @react-navigation/native@3.4.1 requires a peer of react-native@* but none is installed. You must install peer dependencies yourself.
    npm WARN @react-navigation/native@3.4.1 requires a peer of react-native-gesture-handler@* but none is installed. You must install peer dependencies yourself.
    npm WARN react-navigation-tabs@1.1.2 requires a peer of react@* but none is installed. You must install peer dependencies yourself.
    npm WARN react-navigation-tabs@1.1.2 requires a peer of react-native@* but none is installed. You must install peer dependencies yourself.
    npm WARN react-navigation-drawer@1.2.1 requires a peer of react@* but none is installed. You must install peer dependencies yourself.
    npm WARN react-navigation-drawer@1.2.1 requires a peer of react-native@* but none is installed. You must install peer dependencies yourself.
    npm WARN react-navigation-drawer@1.2.1 requires a peer of react-native-gesture-handler@^1.0.12 but none is installed. You must install peer dependencies yourself.
    npm WARN @react-navigation/core@3.3.1 requires a peer of react@* but none is installed. You must install peer dependencies yourself.
    npm WARN react-navigation-stack@1.3.0 requires a peer of react@* but none is installed. You must install peer dependencies yourself.
    npm WARN react-navigation-stack@1.3.0 requires a peer of react-native@* but none is installed. You must install peer dependencies yourself.
    npm WARN react-navigation-stack@1.3.0 requires a peer of react-native-gesture-handler@^1.0.0 but none is installed. You must install peer dependencies yourself.
    npm WARN react-native-screens@1.0.0-alpha.22 requires a peer of react@* but none is installed. You must install peer dependencies yourself.
    npm WARN react-native-screens@1.0.0-alpha.22 requires a peer of react-native@* but none is installed. You must install peer dependencies yourself.
    npm WARN react-native-safe-area-view@0.13.1 requires a peer of react@* but none is installed. You must install peer dependencies yourself.
    npm WARN react-native-safe-area-view@0.13.1 requires a peer of react-native@* but none is installed. You must install peer dependencies yourself.
    npm WARN react-native-tab-view@1.3.4 requires a peer of react@* but none is installed. You must install peer dependencies yourself.
    npm WARN react-native-tab-view@1.3.4 requires a peer of react-native@* but none is installed. You must install peer dependencies yourself.
        提示缺少: react@*
                 react-native@*
                 react-native-gesture-handler@*
                 这可能是由于版本3.X导致的,官网也有相应的提示。
                 如:Since react-navigation@3.x depends on the new React.createContext API, which is added in react@16.3.x, we will require react-native@^0.54.x. Also, react-navigation@3.x needs react-native-gesture-handler to work, you will need to make sure that the version of react-native-gesture-handler you are using matches your current react-native version.
       根据提示 npm install --save react@* ,等等即可。

    导航API

        basic: 顶部导航条
        1> createStackNavigator
           uage:
                 createStackNavigator({
                                              Home: {
                                                screen: HomeScreen
                                              }
                                             )
            参数: Home: 自定义对象,
                  screen: 显示的对象,这里我定义了的一个HomeScreen
                 

    HomeScreen组件

    import React, { Component } from 'react';
    import {View, Text,Button, Alert} from 'react-native';
    import styles from '../basic/style';
    class HomeScreen extends Component {
        static navigationOptions={
            headerTitle:<Text>'uuu'</Text>,
            headerRight:(
                <Button
                    onPress={()=>Alert.alert("hehe")}
                    title="Info"
                    color="blue"
                />
            )
        };
        componentWillMount(){
            //Alert.alert("Will Mount... Home");
        }
        componentWillUnmount(){
            //Alert.alert("Unmount Home");
        }
        render() { 
            return (  
                <View style={styles.container}>
                    <Text>Home Screen</Text>
                    <Button
                        title="touch me"
                        onPress={()=>this.props.navigation.navigate('Details',{
                            id:'home1',
                            other:'done'
                        })}
                    >
                    </Button>
                    <Button
                    title="touch me"
                    onPress={()=>this.props.navigation.navigate('ModalScreen',{
                        id:'home1',
                        other:'done'
                    })}
                >
                </Button>
                </View>
            );
        }
    }
    export default HomeScreen;

    导航函数

       在React Native 开发中,每个组件props 会引入navigation 这个组件对象,常用的函数有;
       
          navigate(<componentName>,{params/*option*/})
          push(<componentName>,{params/*option*/})
          
          区别: 这个函数使用都能通过this.props.navigation.navigate('Details') 到对应的界面。如果当前的界面就是Details 时,使用navigate 不在出现切换界面的效果,即不会导航。
               push不同,push会把这个Details 继续入栈,想下web 中,访问的网页历史记录。

    传参、添加参数、去参数

         navigate(<componentName>,{params/*option*/})
        push(<componentName>,{params/*option*/})
        第二参数即。
        
        添加参数 setParam(key,value)
        去参数: getParam(key,defaultValue)
        第二个有个默认值需要注意下。
    

    导航模式

     默然是左右切换加载 ,第二种为 modal 即上下加载。
     const AppNavigator = createStackNavigator({
      Home:{
        screen: HomeScreen,
        navigationOptions: () => ({
          title: '首页'
        })
      },
      Details:{
        screen:DetailScreen,
        navigationOptions:({navigation})=>{
          return {title: navigation.getParam("id","no-id")};
        }
      },
      ModalScreen:{
          screen:ModalScreen,
          navigationOptions:()=>({
              title:'Modal'
          })
      }
    },{
      initialRouteName:"Home",
      mode:'modal',
      //headerMode:'none'
    });
    const AppContainer=createAppContainer(AppNavigator);
     

    导航的生命周期

         组件跳转当前界面A,表示A 入栈,会触发 组件的生命周期即 componentWillMount 事件触发,如果从A 切换到B,不会触发A 的componentWillUnMount 事件,B的componentWillMount 触发,但是B 切换到A时,B会触发componentWillUnMount。应为A并没有出栈。
         

    导航的样式调整

       /*自定义导航头*/
        static navigationOptions = {
        headerTitle: <LogoTitle />,
        headerRight: (
          <Button
            onPress={() => alert('This is a button!')}
            title="Info"
            color="#fff"
          />
        ),
      };

    其他导航API

        createBottomTabNavigator
        :同第一个
        
        createDrawerNavigator
        usage:
                static navigationOptions = {
                drawerLabel: 'Home',
                drawerIcon: ({ tintColor }) => (
                  <Image
                    source={require('./chats-icon.png')}
                    style={[styles.icon, {tintColor: tintColor}]}
                  />
                ),
              };
        
        createSwitchNavigator
        usage:
                const AppStack = createStackNavigator({ Home: HomeScreen, Other: OtherScreen });
                const AuthStack = createStackNavigator({ SignIn: SignInScreen });
                
                export default createAppContainer(createSwitchNavigator(
                  {
                    AuthLoading: AuthLoadingScreen,
                    App: AppStack,
                    Auth: AuthStack,
                  },
                  {
                    initialRouteName: 'AuthLoading',
                  }
                ));
                
                --
                AuthLoadingScreen 中调用:this.props.navigation.navigate(userToken ? 'App' : 'Auth');

    Navigation 官网API地址

  • 相关阅读:
    Python_day1
    12/04
    Linux基础笔记
    八:动态规划-未名湖边的烦恼
    七:动态规划-数字三角形
    六:大数运算-减法运算
    五:大数运算-加法运算
    四:大数运算-乘法运算
    三:排序-幸运数字
    二:排序-果园
  • 原文地址:https://www.cnblogs.com/fandong90/p/10747257.html
Copyright © 2011-2022 走看看