美文网首页
我的React-Native不得不说的一些事情-3

我的React-Native不得不说的一些事情-3

作者: 三月懒驴 | 来源:发表于2016-03-22 14:18 被阅读1151次

Navigator讲解

创建文档时间:2016.3.22-09:00
作者:三月懒驴
使用平台:Mac

作用

Navigator是一个APP必备的东西,用户在APP里面跳来跳去,开发者当然要全都掌握!因此,用上Navigator必须的。
继续在我们的项目作用的lesson新建一个文件:navigator.js

//in index.ios.js
import Nav from './component/ios/navigator'

class MyProject extends Component{
    render(){
        return(
            <Nav />
        )
    }
}
//in navigator.js
'use strick'
import React from 'react-native'
//昨天写的那个登陆界面
import Home from './login'
let {Component,StyleSheet,View,Text,Navigator} = React

class NavigatorComponent extends Component{
    render(){
        //这三个参数需要重点说的
        let initialRoute = {name:"home",component:Home}
        let configureScene = (route) => { return  Navigator.SceneConfigs.HorizontalSwipeJump}
        let renderScene = (route,navigator)=>{
            let Item = route.component
            return <Item {...route.params} navigator={navigator} />
        }
        return(
            <Navigator
                initialRoute = {initialRoute}
                configureScene = {configureScene}
                renderScene = {renderScene}
            />
        )
    }
}
export default NavigatorComponent

initialRoute

定义启动时加载的路由。路由是导航栏用来识别渲染场景的一个对象!这个其实就是一个对象,有name和component两个属性。可以这么理解。每一个页面都是一个route对象,这个对象有两个参数,一个就是name,用来给他一个名字来辨认,另一个就是component,这个是他的样貌,待会用到的render出来就是我们看到的页面。

configureScene

转场动画和手势,在/node_modules/react-native/Libraries/CustomComponents/Navigator/NavigatorSceneConfigs.js可以找到其他动画的定义。直接调用就好

renderScene

重点:渲染指定的路由。重点,但是不难理解。rederScene传来两个参数:route/ navigator。route就是我们上面说的route对象,有name/component两个参数。而navigator作用很多,这个就待会再说,我们把定义在route的component取出来之后,把nagavitor和route的一些参数做为props写入组件去。这样我们就可以在具体的component里面取出这些props来用了。
关于:{...route.params}。这是JSX的展开属性,这里就是:这个语法是把 routes.params 里的每个key作为props的一个属性。具体可以看这里:看我

//回到昨天写好的login.js去
//另外我们在昨天做布局的时候还写了一个lesson_1的js
//于是就用它来做页面2。
import Lesson from './lesson_1'

class LoginBlock extends Component{
    //构造函数,一进来就调用
    constructor(props){
        //获取props和定义state
        super(props) 
        this.state = {}
    }
    _onPressButton(){
        const {navigator} =  this.props
        if(navigator){
            let route = {name:'测试',component:Lesson}
            navigator.push(route)
        }
    }
    render(){...}
}
//如果没记错的话,昨天在TouchableHighlight里面写onPress没有绑定this。所以应该在哪里改成,如果不改就没办法获取到this.props
<TouchableHighlight onPress={this._onPressButton.bind(this)} ...>

push

这个navigator的几大方法之一,就像栈一样,当你跳去第二个页面的时候,会给你把页面压入栈去,待会在第二个页面调用了pop的话,又可以出栈回到原来的页面

pop

课间作业:试试在昨天的Lesson加一个touchableHighlight来pop回到login页面去。

IOS上的便捷

有社区主导的NavigatorIOS,也包含在RN里面,而去还包含了UIKit的导航功能。所以用这个的话,比起上面那个更加便捷。起码在创建的时候很方便。涉及到ES6的新语法也不多。

//新建的navigatorIOS
'use strict'

import React from 'react-native'
import Home from './login'
let {Component,StyleSheet,View,Text,NavigatorIOS} = React

class Nav extends Component{
    render(){
        return(
            <NavigatorIOS
              style = {styles.body}
              initialRoute={{
                title: '主页',
                component: Home
              }} 
            >
            </NavigatorIOS>
        )
    }
}
const styles = {
    body:{
        flex:1,
    }
}

export default Nav

在这里面我们看到,更加简单的一个route对象,只需要title / component两个,title就会先是在顶部导航栏上,component就是需要渲染出来的页面。而login里面我们基本可以不改任何东西就可以让它继续用了,如果你向页面2也有title的话,就去改一下login的跳转时候生成的route的参数。如果你还有更多哦props要传递过去的话,navigatorIOS的passProps会是一个不错的选择。应该这个很简单,所以就不多说了。

小结:

Navigator在使用的概念上,让前端工程师比较容易接纳。每个页面封装成一个组件,然后通过生成route来跳转。RN上比较难接受的就是大量使用了ES6语法和JSX特有的一些东西。第一次使用还是觉得有点困难的。不过慢慢就好了。

额外的课程

本来应该在上面的小结结束这篇文章,不过很多人问起,写惯JS的,喜欢用console.log去输入一些变量和对象看看里面有什么东西。那么在RN上,能否这样呢?
这个当然是可以的啦!做为一个前端,不用console.log还得了?其实操作很简单。

  • 首先在你的模拟器里面的Hardware - Shake Gesture这时候出在模拟器里面弹出一个选项:Debug in Chrome
  • 打开chrome,进入:http://localhost:8081/debugger-ui
  • 打开chrome的开发者工具,看着控制器,回到代码里面找个位置写个console.log('dsad')。写到JSX里面要记得加{}。
  • 这时候chrome是不是输出了刚才你写的东西

相关文章

网友评论

      本文标题:我的React-Native不得不说的一些事情-3

      本文链接:https://www.haomeiwen.com/subject/tgcllttx.html