• react-native中的navigator


    第一步安装相关插件

    添加一些依赖

    package com.awesomeproject;
    
    import com.facebook.react.ReactActivity;
    import com.facebook.react.ReactActivityDelegate;
    import com.facebook.react.ReactRootView;
    import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
    
    public class MainActivity extends ReactActivity {
    
        /**
         * Returns the name of the main component registered from JavaScript.
         * This is used to schedule rendering of the component.
         */
        @Override
        protected String getMainComponentName() {
            return "AwesomeProject";
        }
         @Override
    	  protected ReactActivityDelegate createReactActivityDelegate() {
    	    return new ReactActivityDelegate(this, getMainComponentName()) {
    	      @Override
    	      protected ReactRootView createRootView() {
    	       return new RNGestureHandlerEnabledRootView(MainActivity.this);
    	      }
    	    };
    	 	}
    }
    
    

    在app.js中添加

    import React from "react";
    import { View, Text } from "react-native";
    import { createStackNavigator, createAppContainer } from "react-navigation";
    
    class HomeScreen extends React.Component {
      render() {
        return (
          <View style={{ flex: 1, alignItems: "center", justifyContent: "center" }}>
            <Text>Home Screen</Text>
          </View>
        );
      }
    }
    
    const AppNavigator = createStackNavigator({
      Home: {
        screen: HomeScreen
      }
    });
    
    export default createAppContainer(AppNavigator);
    

    项目运行为

    In React Native, the component exported from App.js is the entry point (or root component) for your app -- it is the component from which every other
    component descends. It's often useful to have more control over the component at the root of your app than you would get from exporting the result of
    createAppContainer, so let's export a component that just renders our AppNavigator stack navigator.

    Adding a second route
    The component doesn't accept any props -- all configuration is specified in the options parameter to the
    AppNavigator createStackNavigator function. We left the options blank, so it just uses the default configuration. To see an example
    of using the options object, we will add a second screen to the stack navigator.

    import React from "react";
    import { View, Text } from "react-native";
    import { createStackNavigator, createAppContainer } from "react-navigation";
    
    class HomeScreen extends React.Component {
      render() {
        return (
          <View style={{ flex: 1, alignItems: "center", justifyContent: "center" }}>
            <Text>Home Screen</Text>
          </View>
        );
      }
    }
    class DetailsScreen extends React.Component {
      render() {
        return (
          <View style={{ flex: 1, alignItems: "center", justifyContent: "center" }}>
            <Text>Details Screen</Text>
          </View>
        );
      }
    }
    
    
    const AppNavigator = createStackNavigator(
      {
        Home: HomeScreen,
        Details: DetailsScreen
      },
      {
        initialRouteName: "Home"
      }
    );
    
    export default createAppContainer(AppNavigator);
    

    运行项目,发现没有变

    我们想要的是点击或者怎么样进入详情页
    看下面代码

    import React from 'react';
    import { View, Text, Button } from 'react-native';
    import { createAppContainer, createStackNavigator, StackActions, NavigationActions } from 'react-navigation'; // Version can be specified in package.json
    
    class HomeScreen extends React.Component {
      render() {
        return (
          <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
            <Text>Home Screen</Text>
            <Button
              title="Go to Details"
              onPress={() => {
                this.props.navigation.dispatch(StackActions.reset({
                  index: 0,
                  actions: [
                    NavigationActions.navigate({ routeName: 'Details' })
                  ],
                }))
              }}
            />
          </View>
        );
      }  
    }
    
    class DetailsScreen extends React.Component {
      render() {
        return (
          <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
            <Text>Details Screen</Text>
          </View>
        );
      }  
    }
    
    const AppNavigator = createStackNavigator({
      Home: {
        screen: HomeScreen,
      },
      Details: {
        screen: DetailsScreen,
      },
    }, {
        initialRouteName: 'Home',
    });
    
    export default createAppContainer(AppNavigator);
    

    运行效果如下

    我们会发现,只是点击进去了详情,但是不能从详情页返回
    要从详情返回可以
    We'll do something similar to the latter, but rather than using a document global we'll use the navigation
    prop that is passed down to our screen components.

    import React from 'react';
    import { Button, View, Text } from 'react-native';
    import { createStackNavigator, createAppContainer } from 'react-navigation'; // Version can be specified in package.json
    
    class HomeScreen extends React.Component {
      render() {
        return (
          <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
            <Text>Home Screen</Text>
            <Button
              title="Go to Details"
              onPress={() => this.props.navigation.navigate('Details')}
            />
          </View>
        );
      }
    }
    
    class DetailsScreen extends React.Component {
      render() {
        return (
          <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
            <Text>Details Screen</Text>
          </View>
        );
      }
    }
    
    const RootStack = createStackNavigator(
      {
        Home: HomeScreen,
        Details: DetailsScreen,
      },
      {
        initialRouteName: 'Home',
      }
    );
    
    const AppContainer = createAppContainer(RootStack);
    
    export default class App extends React.Component {
      render() {
        return <AppContainer />;
      }
    }
    

    效果如下

    如果我们要进入深一级的详情呢?

    import React from 'react';
    import { Button, View, Text } from 'react-native';
    import { createStackNavigator, createAppContainer } from 'react-navigation'; // Version can be specified in package.json
    
    class HomeScreen extends React.Component {
      render() {
        return (
          <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
            <Text>Home Screen</Text>
            <Button
              title="Go to Details"
              onPress={() => this.props.navigation.navigate('Details')}
            />
          </View>
        );
      }
    }
    
    class DetailsScreen extends React.Component {
      render() {
        return (
          <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
            <Text>Details Screen</Text>
            <Button
              title="Go to Details... again"
              onPress={() => this.props.navigation.navigate('Details')}
            />
          </View>
        );
      }
    }
    
    const RootStack = createStackNavigator(
      {
        Home: HomeScreen,
        Details: DetailsScreen,
      },
      {
        initialRouteName: 'Home',
      }
    );
    
    const AppContainer = createAppContainer(RootStack);
    
    export default class App extends React.Component {
      render() {
        return <AppContainer />;
      }
    }
    
    

    效果图如下,我们会发现进入详情页again,页面没有刷新

    如果我们想多次进入详情页呢?

    import React from 'react';
    import { Button, View, Text } from 'react-native';
    import { createStackNavigator, createAppContainer } from 'react-navigation'; // Version can be specified in package.json
    
    class HomeScreen extends React.Component {
      render() {
        return (
          <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
            <Text>Home Screen</Text>
            <Button
              title="Go to Details"
              onPress={() => this.props.navigation.navigate('Details')}
            />
          </View>
        );
      }
    }
    
    class DetailsScreen extends React.Component {
      render() {
        return (
          <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
            <Text>Details Screen</Text>
            
            {/* Look here! We "push" the Details route */}
            
            <Button
              title="Go to Details... again"
              onPress={() => this.props.navigation.push('Details')}
            />
          </View>
        );
      }
    }
    
    const RootStack = createStackNavigator(
      {
        Home: HomeScreen,
        Details: DetailsScreen,
      },
      {
        initialRouteName: 'Home',
      }
    );
    
    const AppContainer = createAppContainer(RootStack);
    
    export default class App extends React.Component {
      render() {
        return <AppContainer />;
      }
    }
    
    

    运行效果如下:

    我们会发现,点击进入详情页again页面是有继续刷新
    那如果我们想做返回的功能呢?我们上面的页面进入详情页就不能返回主页面了

    import React from 'react';
    import { Button, View, Text } from 'react-native';
    import { createAppContainer, createStackNavigator } from 'react-navigation'; // Version can be specified in package.json
    
    class HomeScreen extends React.Component {
      render() {
        return (
          <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
            <Text>Home Screen</Text>
            <Button
              title="Go to Details"
              onPress={() => this.props.navigation.navigate('Details')}
            />
          </View>
        );
      }
    }
    
    class DetailsScreen extends React.Component {
      render() {
        return (
          <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
            <Text>Details Screen</Text>
            <Button
              title="Go to Details... again"
              onPress={() => this.props.navigation.push('Details')}
            />
            <Button
              title="Go to Home"
              onPress={() => this.props.navigation.navigate('Home')}
            />
            <Button
              title="Go back"
              onPress={() => this.props.navigation.goBack()}
            />
          </View>
        );
      }
    }
    
    const RootStack = createStackNavigator(
      {
        Home: {
          screen: HomeScreen,
        },
        Details: {
          screen: DetailsScreen,
        },
      },
      {
        initialRouteName: 'Home',
      }
    );
    
    const AppContainer = createAppContainer(RootStack);
    
    export default class App extends React.Component {
      render() {
        return <AppContainer />;
      }
    }
    

    本文学自官网:https://reactnavigation.org/docs/en/navigating.html

  • 相关阅读:
    MongoDB数据查询详解
    MongoDB增加数据
    laravel安装初体验
    操作MongoDB
    MongoDB基本概念和安装配置
    tp5操作mongo
    c语言运算符优先级与while循环案例
    tp5下通过composer实现日志记录功能
    c语言中类型转换与赋值运算符、算术运算符、关系运算符、逻辑运算符。原码、反码、补码。小解。
    scanf使用与运算符
  • 原文地址:https://www.cnblogs.com/smart-girl/p/10646388.html
Copyright © 2020-2023  润新知