微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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 [email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN @react-navigation/[email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN @react-navigation/[email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN @react-navigation/[email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN reac[email protected] requires a peer of [email protected]^1.0.12 but none is installed. You must install peer dependencies yourself.
npm WARN @react-navigation/[email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of [email protected]^1.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of [email protected]* but none is installed. You must install peer dependencies yourself.
    提示缺少: [email protected]*
             [email protected]*
             [email protected]*
             这可能是由于版本3.X导致的,官网也有相应的提示。
             如:Since [email protected] depends on the new React.createContext API,which is added in [email protected],we will require [email protected]^0.54.x. Also,[email protected] 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 [email protected]*,等等即可。

导航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地址

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐