React Native 入门十三 - StackNavigator 快速入门

RN 版本:0.50
针对平台:Android
操作环境:Windows 10
React Navigation 版本:1.0.0-beta.20

文章同步自简书:http://www.jianshu.com/p/dece7a09c6bf

前言

Navigator(导航器)是用来进行场景(页面)切换的组件,但是由于它的各种缺陷,从 0.44 开始,就被 fb 移除了,并且推荐大家使用更方便的 React Navigation

React Navigation 改进并取代了多个导航库,目前仍然在继续完善中。它包含 StackNavigator、TabNavigator 和 DrawerNavigator,你还可以自定义导航器。由于我也是跟着官方文档刚刚学,打算边学边总结加深印象,同时给大家一个参考(英文文档我看着实在很累)。不出意外,应该会写上好几篇。

StackNavigator 实现最基本的页面跳转

首先安装 React Navigation:

yarn add react-navigation

然后导入到项目中(这里我们只用到了 StackNavigator):

import {StackNavigator} from 'react-navigation';

下面的例子来源于 官网,我在其基础上加以说明,直接上代码。

const HomeScreen = () => ( <View style={{flex: 1,justifyContent: 'center',alignItems: 'center'}}> <Text>Home Screen</Text> </View> ); const DetailScreen = () => ( <View style={{flex: 1,alignItems: 'center'}}> <Text>Detail Screen</Text> </View> ); const RootNavigator = StackNavigator({ Home: { screen: HomeScreen },Detail: { screen: DetailScreen } }); export default RootNavigator;

两个 View 分别展示了一行文本,这里主要讲一下 RootNavigator 的定义。

其中 HomeDetail 是自定义的名称,screen 属性是要显示在页面上的视图组件。StackNavigator 顾名思义,栈导航器,这里写的 Home 页面就是第一个入栈的,也是程序运行时第一个显示的。

我们将其导入并注册,

import RootNavigator from './RootNavigator';
AppRegistry.registerComponent('BlogDemo',() => RootNavigator);

运行。

可以看到第一个页面已经显示出来了,并且自带了一个类似 ToolBar 的东西,这个东西怎么去掉,我还没有研究到。

好了,这并不是我这篇文章打算说的东西。

下面说一说如何跳转到 Detail 页面。我们在 HomeScreen 中稍作修改,

const HomeScreen = ({navigation}) => ( <View style={{flex: 1,alignItems: 'center'}}> <Text>Home Screen</Text> <Button  onPress={() => navigation.navigate('Detail')} title='Go to Detail'/> </View> );

可以看到在方法的参数中添加了一个 {navigation} 的参数,暂时先不需要知道它的具体工作原理,只要知道在某个页面被 StackNavigator 加载的时候,会自动分配一个 navigation 属性就可以了。这个属性就是用来驱动页面之间的跳转的。navigate(routeName,params,action) 这个方法有三个参数,目前只说第一个。routeName 表示已经注册过的目标路由的名称,也就是我们打算跳转到的页面,这里就是 Detail,由于是自定义的名称,书写的时候不要写错了。

为了美观(大概吧),我们再给两个 ‘ToolBar’ 加上标题。

const RootNavigator = StackNavigator({
  Home: {
    screen: HomeScreen,navigationOptions: {
      headerTitle: 'Home'
    }
  },Detail: {
    screen: DetailScreen,navigationOptions: {
      headerTitle: 'Detail'
    }
  }
});

然后跑起来:

Detail 页面还自带了一个返回按钮,是不是很神奇?

最后呢,一般来说,每个页面都是单独写在一个 js 文件中的,这样的话,该如何取到 navigation 参数并进行页面跳转呢?

我们之前说过了,在某个页面被 StackNavigator 加载的时候,会自动分配一个 navigation 属性。所以如果我们把 HomeScreen 和 DetailScreen 单独拿出来,可以这么写,以 HomeScreen 为例:

export default class HomeScreen extends Component {
  constructor(props) {
    super(props);
  }

  render() {
    return <View style={{flex: 1,justifyContent: 'center',alignItems: 'center'}}>
      <Text>Home Screen</Text>
      <Button
          onPress={() => this.props.navigation.navigate('Detail')}
          title='Go to Detail'/>
    </View>;
  }
}

没有错,我们可以直接通过 this.props.navigation 获取到它,然后执行 navigate() 方法。

但是,官网却是这么写的(代码似乎和本节不一致,因为是在另一个地方粘的,请先忽略,这不是重点):

class HomeScreen extends React.Component {
  render() {
    const {navigate} = this.props.navigation;

    return (
      <View>
        <Text>This is the home screen of the app</Text>
        <Button
          onPress={() => navigate('Profile',{name: 'Brent'})}
          title="Go to Brent's profile"
        />
      </View>
     )
   }
}

第一眼看上去我懵逼了, const {navigate} = this.props.navigation; 是个什么鬼?

仔细想想,其实这就是解构赋值嘛。我在 React Native 入门(五) - Props(属性) 这篇文章中,还专门写过,自己都差点忘记了。

它们不过是不同的写法,效果是完全一致的,图就不贴了。先暂时写这么多,等我继续研究研究再更新吧。

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

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom