navigation基本概述

基本介绍

  • react-navigation 的出现替代了Navigator、 Ex-Navigation等老一代的导航组件,react-navigation可以说是Navigator的加强版,不仅有Navigator的全部功能,另外还支持底部导航类似于与iOS中的UITabBarController,此外它也支持侧拉效果方式的导航类似于Android中的抽屉效果。

基本分类

  • StackNavigator: 类似于普通的Navigator,屏幕上方导航栏;
  • TabNavigator: 相当于iOS里面的TabBarController,屏幕下方的标签栏;
  • DrawerNavigator: 抽屉效果,侧边滑出;

重要属性

# navigation

  • 通过navigation可以完成屏幕之间的调度操作,例如打开另一个屏幕;
  • 当打开页面与导航器存在映射关系,那么当前页面 const {navigation} = this.props 会拿到 navigation属性,通过此属性又包含以下属性:
1. navigate
  • 使用进行界面之间的跳转

    • navigate(routeName,params,action)
    • routeName:要跳转的界面的路由名(在导航中注册的路由名)
    • params:要传递给下一个界面的参数
    • action:若当前界面是一个navigator的话,将运行这个sub-action
  • 基本操作
    export const AppStackNavigator = StackNavigator({
        HomeScreen: {
            screen: HomeScreen
        },
        Page1: {
            screen: Page1
        })
    
    class HomeScreen extends React.Component {
      render() {
        const {navigate} = this.props.navigation;
    
        return (
          <View>
            <Text>This is HomeScreen</Text>
            <Button
              onPress={() => navigate('Page1', {name: 'Devio'})}
              title="Go to Page1"
            />
          </View>
         )
       }
    }
2. state
  • 获取屏幕的当前state
  • 可以通过this.props.state.params来获取通过setParams(),或navigation.navigate()传递的参数。
  • 基本操作
    <Button
        title={params.mode === 'edit' ? '保存' : '编辑'}
        onPress={() =>
            setParams({mode: params.mode === 'edit' ? '' : 'edit'})}
    />
    <Button
        title="Go To Page1"
        onPress={() => {
            navigation.navigate('Page1',{ name: 'Devio' });
        }}
    />
    const {navigation} = this.props;
    const {state, setParams} = navigation;
    const {params} = state;
    const showText = params.mode === 'edit' ? '正在编辑' : '编辑完成';
3. setParams
  • 改变路由的params
  • setParams: function setParams(params): 我们可以借助setParams来改变route params,比如,通过setParams来更新页面顶部的标题,返回按钮等
  • 注意navigation.setParams改变的是当前页面的Params,如果要改变其他页面的Params可以通过NavigationActions.setParams完成,下文会讲到
  • 基本操作
    class ProfileScreen extends React.Component {
      render() {
        const {setParams} = this.props.navigation;
        return (
          <Button
            onPress={() => setParams({name: 'Lucy'})}
            title="Set title name to 'Lucy'"
          />
         )
       }
    }
4. goBack
  • 关闭当前屏幕
  • goBack: function goBack(key):我们可以借助goBack返回到上一页或者路由栈的指定页面
    • 其中key表示你要返回到页面的页面标识如id-1517035332238-4,不是routeName。
    • 可以通过指定页面的navigation.state.key来获得页面的标识。
    • key非必传,也可传null。
  • 基本操作
    export default class Page1 extends React.Component {
        render() {
            const {navigation} = this.props;
            return <View style=>
                <Text style={styles.text}>欢迎来到Page1</Text>
                <Button
                    title="Go Back"
                    onPress={() => {
                        navigation.goBack();
                    }}
                />
            </View>
        }
    }
5. dispatch
  • 向路由发送一个action
  • dispatch: function dispatch(action):给当前界面设置action,会替换原来的跳转,回退等事件。
  • 基本操作
    const resetAction = NavigationActions.reset({
      index: 0,
      actions: [
          NavigationActions.navigate({
              routeName: 'HomePage',
              params:{
                  theme:theme,
                  selectedTab:selectedTab
              },
          })
      ]
      })
    navigation.dispatch(resetAction)

# navigationOptions

1. title
2. headerRight
3. 动态配置

NavigationActions

1. navigate

  • 导航到其他的页面
  • 三个参数
    • routeName:字符串,必选项,在app的router里注册的导航目的地的routeName。
    • params:对象,可选项,融合进目的地route的参数。
    • actions:对象,可选项(高级),如果screen也是一个navigator,次级action可以在子router中运行。在文档中描述的任何actions都可以作为次级action。
  • 基本操作
    import { NavigationActions } from 'react-navigation'
    
    const navigateAction = NavigationActions.navigate({
      routeName: 'Profile',
      params: {},
      action: NavigationActions.navigate({ routeName: 'SubProfileRoute'})
    })
    this.props.navigation.dispatch(navigateAction)

2. reset

  • 删掉所有的navigation state并且使用这个actions的结果来代替
  • 两个参数:
    • index,number,必选,navigation state中route数组中激活route的index。
    • actions,array,必选项,Navigation Actions数组,将会替代navigation state
  • 基本操作
    import { NavigationActions } from 'react-navigation'
    
    const resetAction = NavigationActions.reset({
      index: 0,
      actions: [
        NavigationActions.navigate({ routeName: 'Profile'})
      ]
    })
    this.props.navigation.dispatch(resetAction)
  • 使用场景:比如进入APP首页后的splash页不在使用,这时可以使用*NavigationActions.reset重置它。
  • index 参数被用来定制化当前激活的route。举个例子:使用两个routes WelcomePage和HomePage给一个基础的stack navigation设置。为了重置route到HomePage,但是在堆栈中又存放在WelcomePage之上,你可以这么做:
    import { NavigationActions } from 'react-navigation'
    
    const resetAction = NavigationActions.reset({
        index: 1,
        actions: [
            NavigationActions.navigate({ routeName: 'WelcomePage'}),
            NavigationActions.navigate({ routeName: 'HomePage'})
        ]
    });
    this.props.navigation.dispatch(resetAction);

3. back

  • 返回到前一个screen并且关闭当前screen.backaction creator接受一个可选的参数:
  • 参数:
    • key:这个可以和上文中讲到的goBack的key是一个概念;
  • 基本操作
    import { NavigationActions } from 'react-navigation'
    const backAction = NavigationActions.back();
    this.props.navigation.dispatch(backAction);

4. SetParams

  • 通过SetParams我们可以修改指定页面的Params。
  • 两个参数:
    • params:对象,必选参数,将会被合并到已经存在页面的Params中。
    • key:字符串,必选参数,页面的key。
  • 基本操作 :
    import { NavigationActions } from 'react-navigation'
    const setParamsAction = NavigationActions.setParams({
        params: { title: 'HomePage' },
        key: 'id-1517035332238-4',
    });
  • navigation中有setParams为什么还要有NavigationActions.setParams?
    • 在上文中讲到过navigation中有可能只有state与dispatch,这个时候如果要修改页面的Params,则只能通过NavigationActions.setParams
    • 另外,navigation.setParams只能修改当前页面的Params,而NavigationActions.setParams可以修改所有页面的Params;

5. Init

  • 初始化一个 state 如果 state 是 undefined;

ref

  • 有一种场景:有的时候我们需要在导航器中所定义的屏幕之外使用导航器来做页面跳转。

    • 屏幕之间的跳转是需要借助navigation来完成的;
    • 我们知道导航器中定义的屏幕可以通过const {navigation} = this.props;来获取navigation
    • 那么,如果我们在非导航器中所定义的屏幕中做屏幕跳转的关键一步,就是要想法获取navigation
    • 那么,如何才能在非导航器中所定义的屏幕中获取到这个navigation呢?
  • 基本操作:
    import { NavigationActions } from 'react-navigation';
    
    const AppNavigator = StackNavigator(SomeAppRouteConfigs);
    
    class App extends React.Component {
      someEvent() {
        // call navigate for AppNavigator here:
        this. navigation && this. navigation.dispatch(
          NavigationActions.navigate({ routeName: someRouteName })
        );
      }
      render() {
        return (
          <AppNavigator ref={nav => { navigation = nav; }} />
        );
      }
    }
  • 上述代码通过导航器的顶级节点ref属性获取到navigation,当上述代码的AppNavigator节点被渲染时,ref会被回调这是就可以获取到navigation了,需要提醒大家的是,这种用法对除StackNavigator之外的其他两种类型的导航器也是实用的哦;

原文地址:https://www.cnblogs.com/cnloop/p/10518238.html

时间: 2024-08-26 00:19:23

navigation基本概述的相关文章

WebKit加载流程 - 概述

之前写了几篇加载流程的说明,是从下向上看,有点只见树木不见森林的感觉.经过最近一段时间的学习,有了能加以概括抽象的方法. WebKit加载流程和页面组成是直接相关的,页面就是WebKit要加载的对象.所以WebKit负责加载的类也与负责页面管理的类相对应.Apple关于WebView的说明里清楚表现了页面视图上的MVC结构: 一个页面从元素上也有其层次结构,并且和加载类对应,如下: 从页面元素上讲WebView代表了一个页面的呈现,对应一个Page. 一个Page包含一个或多个Frame,其中一

[Learn Android Studio 汉化教程]第二章:Android Studio概述(一)

[Learn Android Studio ]第二章:Android Studio概述(一) Android Studio是一个视窗化的开发环境.为了充分利用有限的屏幕空间,不让你束手束脚,Android Studio 在特定的时间仅仅显示一小部分可用窗口.除了一些上下文敏感的窗口和上下文相关的窗口显示出来外,其他的仍旧隐藏,除非你主动打开它们.或者相反,一些可见的窗口直到你主动隐藏它们.为了充分利用Android Studio,你就需要明白这些窗口的功能以及如何.何时去显示它们.在这一章,我们

Struts2概述、开发环境搭建

一.概述 Struts 2是在WebWork2基础发展而来的.和struts1一样同属于MVC框架. 注意:struts 2和struts 1在代码风格上几乎不一样. Struts 2 相比Struts 1的优点: 1.在软件设计上Struts 2 没有像Struts 1那样跟Servlet API 和 struts API 有着紧密的耦合.Struts 2的应用可以不依赖于Servlet API和Struts API .struts2的这种设计属于无侵入式设计,而struts1却属于侵入式设计

UI: 概述, 启动屏幕, 屏幕方向

UI 设计概述 启动屏幕(闪屏) 屏幕方向 示例1.UI 设计概述UI/Summary.xaml <Page x:Class="Windows10.UI.Summary" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local=&qu

第一课 MongoDB 概述与安装

1.课程大纲 本次课主要介绍 MongoDB 背景知识和 MongoDB 的安装与配置,让大家对 MongoDB 有一个初认识. 其基本的知识点包含: NoSQL数据库概述 MongoDB 数据库简单介绍 Linux 下安装 MongoDB 数据库 Mac 和 Windows 下安装 MongoDB 数据库 2.课程简单介绍 MongoDB是由MongoDB.inc研发的一款NoSQL类型的文档型数据库,MonogoDB名字来源于英文单词humongous,这个单词的意思是巨大无比.暗喻Mong

java面向对象:面向对象的思想和概述

1:面向对象思想 面向对象是基于面向过程的编程思想. 面向过程:强调的是每一个功能的步骤 面向对象:强调的是对象,然后由对象去调用功能 2:面向对象的思想特点 A:是一种更符合我们思想习惯的思想 B:可以将复杂的事情简单化 C:将我们从执行者变成了指挥者 开发,设计,特征 面向对象开发 就是不断的创建对象,使用对象,指挥对象做事情. 面向对象设计 其实就是在管理和维护对象之间的关系. 面向对象特征 封装(encapsulation) 继承(inheritance) 多态(polymorphism

java基础总结——概述

  一.java语言概述 来自维基百科 https://zh.wikipedia.org/wiki/Java Java是一种计算机编程语言,拥有跨平台.面向对象.泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发. 任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言,应用在电视机.电话.闹钟.烤面包机等家用电器的控制和通信.由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划.随着1990

译-BMC Remedy Action Request System权限控制概述

原文链接:Access control overview 说明: BMC Remedy Action Request System是BMC ITSM产品平台,简称AR 或者Remedy,可实现基于ITIL标准的整个IT管理流程的实施定制.该平台可实现多种权限级别的管理,包括人员.组.角色,以及表.字段.行级别等.本文可以用作其他对权限要求比较精细的系统参考. 为了便于理解,部分名词翻译如下: Server:服务器Form (or table):表单Field (or column):字段Acti

Aircrack-ng: (1) 概述

作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 目录 一.概述 二.工具与命令介绍 Linux命令 (1) ifconfig (2) macchanger (3) iwconfig (4) iwlist Aircrack-ng 工具 (1) airmon-ng (2) airodump-ng (3) aireplay-ng (4) aircrack-ng 其他Aircrack-ng工具 一.概述 Aircrack-ng是一款用于破解无线