前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >react-navigation导航器

react-navigation导航器

作者头像
一粒小麦
发布于 2019-09-19 09:28:36
发布于 2019-09-19 09:28:36
6.3K00
代码可运行
举报
文章被收录于专栏:一Li小麦一Li小麦
运行总次数:0
代码可运行

https://reactnavigation.org/ ——源于React Native社区对基于Javascript的可扩展且使用简单的导航解决方案的需求 。

和h5用a标签来跳转不太一样的是,rn必须依赖导航器跳转。导航器也可以看成是一个普通的React组件,你可以通过导航器来定义你的APP中的导航结构。导航还可以渲染通用元素,例如可以配置的标题栏和选项卡栏。

react-natvigation自开源以来。在短短不到3个月的时间,github上星数已达4000+。它是Fb推荐使⽤库, 并且在React Native当前最新版本0.44中将Navigator删除。react-navigation据称有原生般的性能体验效果。可能会成为未来React Native导航组件的主流军 。

可以粗略地理解,navigation就是rn版的router。

安装

注:从19年7月到现在不到两个月,navigation有了大的更新。看官网文档也未必有用。经过笔者一天的踩坑,想要成功运行请严格执行以下操作。其它不能保证。 请确保项目绝对路径无中文。

安装(0.60-)时除了本体,还需要一个手势库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn add react-navigation@3.11.1
yarn react-native-gesture-handler@1.3.0

接着需要手动link它(关联原生):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
react-native link react-native-gesture-handler

此时ios已经可以跑了。但安卓配置还没完。把以下代码添加到 MainActivity.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.rn;

import com.facebook.react.ReactActivity;
// add
import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.ReactRootView;
import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
// end add
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 "rn";
    }
    // add
    @Override
    protected ReactActivityDelegate createReactActivityDelegate() {
        return new ReactActivityDelegate(this, getMainComponentName()) {
            @Override
            protected ReactRootView createRootView() {
            return new RNGestureHandlerEnabledRootView(MainActivity.this);
            }
        };
    }
    // end add
}

到了这一步,就可以启动应用了。

补白
概念
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
在开始学习导航器之前,我们需要了了解两个和导航有关的概念:
  • Screen navigation prop(屏幕导航属性):通过navigation可以完成屏幕之间的调度操作,例如打开另一个屏幕
  • Screen navigationOptions(屏幕导航选项):通过navigationOptions可以定制导航器显示屏幕的方式(例如:头部标题,选项卡标签等)
导航器类型

在react-navigation中有以下类型的导航器:

  • createStackNavigator:类似普通的Navigator,导航上⽅导航栏
  • createTabNavigator:已弃用,使⽤createBottomTabNavigator、 createMaterialTopTabNavigator替代
  • createBottomTabNavigator:相当于IOS里面的UITabBarController,屏幕下⽅的标签
  • createMaterialTopTabNavigator:屏幕顶部的材料设计主题标签栏
  • createDrawerNavigator:抽屉效果,侧边滑出
  • createSwitchNavigator:SwitchNavigator的用途是一次只显示⼀个⻚页⾯面

你可以通过以上几种导航器来创建你的APP,可以是其中一个,也可以多个组合,这个可以根据具体的应 ⽤场景并结合每⼀个导航器器的特性进⾏选择。

项目管理

创建一个src目录,如图:

在page下写几个页面(HomePage,MyPage,HotPage):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React,{Component} from 'react';
import {View,Text,StyleSheet} from 'react-native';

export default class HomePage extends Component{

    render(){
        return (
          <View style={styles.container}>
              <Text style={styles.text}>HomePage</Text>
          </View>
        )

    }
}

const styles=StyleSheet.create({
    container:{
        flex:1,
        justifyContent:'center',
        alignItems:'center',
        backgroundColor:'#f5f5f5'
    },
    text:{
        fontSize:26
    }
})

在Navigator下新建AppNavigator.js:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import {createAppContainer} from 'react-navigation';
import { createStackNavigator } from 'react-navigation-stack';

import HomePage from '../Pages/HomePage';
import MyPage from '../Pages/MyPage';
import HotPage from '../Pages/HotPage';

const AppNavigator=createStackNavigator({
    Home:{
        screen:HomePage
    },
    My:{
        screen:MyPage
    },
    Hot:{
        screen:HotPage
    }
});

export default createAppContainer(AppNavigator);

跑一下程序,看到:

就算运行成功了。

基本使用(重点)

这里使用堆栈导航。

createStackNavigator 提供APP屏幕之间切换的能⼒,它是以栈的形式还管理屏幕之间的切换,新切换到的屏幕会放在栈的顶部。

createStackNavigator API

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
createStackNavigator(RouteConfigs, StackNavigatorConfig):
  • RouteConfigs (必选):路路由配置对象是从路路由名称到路路由配置的映射,告诉导航器器该路路由呈现什什 么。
  • StackNavigatorConfig (可选):配置导航器器的路路由(如:默认⾸首屏,navigationOptions,paths 等)样式(如,转场模式mode、头部模式等)。

在HomePage引入button,给它加个 onPress事件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<View style={styles.container}>
                <Button
                    title={'跳转到我的页面'}
                    onPress={()=>{
                      console.log(this.props)
                    }}
                ></Button>
              <Text style={styles.text}>HotPage</Text>
          </View>

然后页面上出现一个button,点击一下,控制台弹出了以下内容:

通过navigation。封装了一系列方法。

  • navigate:跳转到其他界⾯
  • state:屏幕的当前state
  • setParams:改变路由的params
  • goBack:关闭当前屏幕
  • disPatch:向路由发送一个action
  • addListener:订阅导航生命周期的更新
  • isFocused:true标识屏幕获取了焦点
  • getParam:获取具有回退的特定参数
  • dangerouslyGetParent:返回父导航器

注意:一个navigation有可能没有navigate、setParams以及goBack,只有state与dispatch,所以在使用navigate时要进⾏判断,如果没有navigate可以使⽤navigation去dispatch一个新的action。

跳转

接收两个参数,第一个是定义好的路由名,第二个是页面参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Button
    title={'跳转到我的页面'}
    onPress={()=>{
      console.log(this.props)
      this.props.navigation.navigate('My',{
        title:'我的'
      })
    }}
></Button>
<Button
    title={'跳转到热门页面'}
    onPress={()=>{
      console.log(this.props)
      this.props.navigation.navigate('Hot',{
        title:'热门'
      })
    }}
></Button>

<Text style={styles.text}>HomePage</Text>
返回

留意右上角,原生按钮已经支持返回。但我想自定义一个返回按钮的话可以直接用goBack方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Button
    title={'返回'}
    onPress={()=>{
        this.props.navigation.goBack()
  }}
></Button>

goBack:function goBack(key):我们可以借助goBack返回到上⼀页或者路由栈的指定⻚面。

key标识你要返回到⻚面的⻚面标识符,如:id-1517035332238-4,不是routeName。可以通过指定⻚面的navigation.state.key来获取⻚页⾯面的标识 key必传,不传默认返回上一页

传参

现在我想定义一个参数给下一个也页面,可以这么做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Button
    title={'跳转到热门页面'}
  onPress={()=>{
      console.log(this.props)
    this.props.navigation.navigate('Hot',{
        title:'热门'
    })
  }}
 ></Button>

在被跳转的页面可以通过getParam方法获取:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Text style={styles.text}>{this.props.navigation.getParam('title')}</Text>
在页面中定义标题

留意到以下模拟器中,

这些都是可以自己定义的。

回到AppNavigator,我可以给首页加个标题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Home:{
        screen:HomePage,
        // 导航器配置:
        navigationOptions:{
            // 让导航栏为空
            // header:null 
            // 设置导航栏标题
            headerTitle:'首页'
        }
    },
优雅地定义标题

你还可以自定义navigationOptions:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default class MyPage extends Component{
    static navigationOptions={
        title:'我的'
    }

    render(){
        return (
          <View style={styles.container}>
              <Text style={styles.text}>{this.props.navigation.getParam('title')}</Text>
          </View>
        )

    }
}

接下来可以组合页面穿参来用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static navigationOptions=({navigation})=>{
        return {
            headerTitle:navigation.getParam('title')
        }
    }

!image-20190914172536556

更新参数

有getParam就有setParams。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default class MyPage extends Component{
    static navigationOptions=({navigation})=>{
        return {
            headerTitle:navigation.getParam('title')
        }
    }

    render(){
        return (
          <View style={styles.container}>
              <Text style={styles.text}>{this.props.navigation.getParam('title')}</Text>
              <Button
                    title={'更新页面参数'}
                    onPress={()=>{
                      this.props.navigation.setParams({
                          title:'aaa'
                      })
                    }}
                ></Button>
          </View>
        )

    }
}

一点击,你的title就全变成了aaa。

注意:navigation.setParams改变的是当前页⾯的Params,如果要改变其他⻚面的Params可以通过 NavigationActions.setParams完成。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一Li小麦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
jQuery(操作Dom-节点操作①)
selector.append(节点对象):在selector元素内部的最后插入"节点对象"
全栈开发日记
2022/05/12
1.4K0
JQuery
版权声明:Copyright © https://blog.csdn.net/zzw19951261/article/details/81148578
zhengzongwei
2019/07/31
9610
JQuery_
版权声明:Copyright © https://blog.csdn.net/zzw19951261/article/details/80347297
zhengzongwei
2019/07/31
7250
jQuery 之 元素节点操作滚轮事件与函数节流
元素节点操作 创建节点 var $div = $('<div>'); var $div2 = $('<div>这是一个div元素</div>'); 插入节点 1、append()和appendTo():在现存元素的内部,从后面插入元素 var $span = $('<span>这是一个span元素</span>'); $('#div1').append($span); ...... <div id="div1"></div> 2、prepend()和prependTo():在现存元素的内部,从前面插入元素
IT架构圈
2018/06/01
1.3K0
前端基础-jQuery节点操作
第10章 jQuery节点操作 10.1 创建节点 // $(htmlStr) // htmlStr:html格式的字符串 $('<span-这是一个span元素</span-'); 10.2 添加节点 append appendTo 在被选元素的结尾插入内容 父.append(子) 子.appendTo(父) prepend prependTo 在被选元素的开头插入内容 父.prepend(子) 子.prependTo(父) before insertBefore 在被选元素之后插入内容
cwl_java
2020/03/26
7810
04-老马jQuery教程-DOM节点操作及位置和大小
1. jQuery创建DOM标签 1.1 DOM动态创建标签的方法 DOM时代我们通过document的createElement方法动态创建标签。创建标签后,动态的给他添加属性。例如代码: // 动
老马
2018/01/05
2.2K0
六、jQuery节点操作
replaceWith()与replaceAll()都会替换所有匹配的元素为指定元素。
Dreamy.TZK
2020/06/19
1.7K0
六、jQuery节点操作
04-老马jQuery教程-DOM节点操作及位置和大小
根据给定的文章内容,撰写摘要总结。
老马
2017/12/27
6.1K0
04-老马jQuery教程-DOM节点操作及位置和大小
看Zepto如何实现增删改查DOM
本文对Zepto模块进行了分析,分别从整体架构、核心模块、使用方法和高级特性等方面进行了介绍。主要包括Zepto概述、核心模块、使用方法和高级特性等。
IMWeb前端团队
2018/01/08
2.5K0
看Zepto如何实现增删改查DOM
jQuery中的DOM操作
该文介绍了DOM操作的分类,包括查找节点、创建节点、插入节点、删除节点、替换节点、包裹节点、复制节点、替换节点和节点互换。使用DOM操作可以更加方便地操作HTML和CSS,实现各种动态效果和交互功能。
IMWeb前端团队
2017/12/29
1.4K0
Jquery基础之DOM操作
Dom是Document Object Model的缩写,意思是文档对象模型。DOM是一种与浏览器、平台、语言无关的接口,使用该接口可以轻松访问页面中所有的标准组件。DOM操作可以分为三个方面即DOM Core(核心)、HTM-DOM和CSS-DOM。
用户9184480
2024/12/19
1010
Jquery基础之DOM操作
jQery基础操作
remove():删除整个节点 empty():清空节点内容 detach():删除整个节点,保留元素的绑定事件、附加的数据
xiaozhangStu
2023/05/04
3220
jQuery源码解析之after()/insertAfter()/before()/prepend()的实现
前言:跟 当我调用了$().append()后,jQuery内部发生了什么? 一样,after() / insertAfteer() / before() / prepend(),都会经过 domManip() 和 buildFragment() 的洗礼,最后调用原生JS的方法来实现。
进击的小进进
2022/03/28
1.1K0
jQuery源码解析之after()/insertAfter()/before()/prepend()的实现
JavaWeb——JQuery之DOM操作应用及实践案例总结(DOM内容操作、DOM属性操作、CRUD操作)
【注意】:prop和attr的区别,如果操作的是元素的固有属性(非自定义的),建议使用prop;若是自定义属性,建议用attr。
Winter_world
2020/09/25
3.1K0
JavaWeb——JQuery之DOM操作应用及实践案例总结(DOM内容操作、DOM属性操作、CRUD操作)
JQuery-学习笔记03【基础——DOM操作】「建议收藏」
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/01
1.9K0
JQuery-学习笔记03【基础——DOM操作】「建议收藏」
jQuery DOM操作
在目标对象前插入同级兄弟元素(不是头部,而是外面,和对象并列同级),参数和append类似
bamboo
2019/01/29
9920
jQuery DOM操作
jQuery 中在元素中添加插入内容方法 after, append, appendTo, before, prepend, prependTo 的区别
jQuery 在元素中添加插入内容的方法和区别,整理成表格,省的每次都要翻: jQuery方法 解释 after() 在被选元素之后插入指定内容 insertAfter() 在被选元素之后插入 HTML 标记或已有的元素。如果用于已有元素,这些元素会被从当前位置移走,然后被添加到被选元素之后。 append() 在被选元素的结尾(仍然在内部)插入指定内容 appendTo() 在被选元素的结尾(仍然在内部)插入 HTML 标记或已有的元素。 before() 在被选元素之前插入指定内容 insertBefo
Denis
2023/04/13
1.8K0
jQuery 中在元素中添加插入内容方法 after, append, appendTo, before, prepend, prependTo 的区别
Jquery基本用法总结
选择器 $("#mydiv") 通过ID $("p#myp") 选择id=myp 的所有p元素(组合型) $(".mydiv") 通过 class="mydiv" $("p.myp") 选择class=myp 的所有p元素 $("p").eq(1) 获取匹配的集合中的第二个元素 这个元素的位置是从0算起(与[i]的区别是eq获得的还是jquery元素,而[i]获得的是dom元素) $("div:first") 选择第一个div $("div:odd") 选择奇数行div $('div:visible')
欢醉
2018/01/22
7020
jQuery DOM操作
对节点的操作 查找节点 查找节点可以直接利用jQuery选择器来完成,非常便利。 插入节点 jQuery提供了8种插入节点的方法。 序号 方法 描述 实例 1 append() 向每个匹配的元素内部
静默虚空
2018/01/05
2K0
jQuery基本操作
jQuery的基本设计思想和主要用法,就是"选择某个网页元素,然后对其进行某种操作"。这是它区别于其他Javascript库的根本特点。
FGGIT
2024/10/15
850
相关推荐
jQuery(操作Dom-节点操作①)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文