ReactNative从零开始笔记6-导航页面传值(正传和逆传)

字数 580阅读 94

一、使用环境

  • Mac 电脑 系统10.14.2
  • Xcode9.4
  • react-native-cli版本 2.0.1
  • react-native: 0.57.3
  • webstorm

二、导航使用

虽然系统有Navigator可以用,但是0.44版本后就不在推荐使用,而是让我们使用第三方导航组件react-native-deprecated-custom-components

注意:从0.44版本开始,Navigator被从react native的核心组件库中剥离到了一个名为react-native-deprecated-custom-components的单独模块中,而且官方推荐使用React Navigation导航组件,这个已经默认为官方推荐了

所有本文介绍的也是react-native-deprecated-custom-components

1、既然是使用第三方组件,所以第一步就是安装组件

 npm install react-native-deprecated-custom-components  --save

2、在使用导航组件的地方导入组件

import {Navigator} from 'react-native-deprecated-custom-components'

3、配置导航组件主要使用三个属性

  • initialRoute
  • configureScene
  • renderScene

3.1 initialRoute:我也不用贴出官方的英文,我直接说中文理解为用于初始化路由

  initialRoute:其参数对象中的各个属性如下:
  {
    component: function, //加载的视图组件
    title: string, //加载视图的标题
    passPros: object, //传递的数据
    backButtonIcon: Image.propTypes.source, // 后退按钮图标
    backButtonTitle: string, //后退按钮标题
    leftButtonIcon: Image.propTypes.soruce, // 左侧按钮图标
    leftButtonTitle: string, //左侧按钮标题
    onLeftButtonPress: function, //左侧按钮点击事件
    rightButtonIcon: Image.propTypes.soruce, // 右侧按钮图标
    rightButtonTitle: string, //右侧按钮标题
    onRightButtonPress: function, //右侧按钮点击事件
}
  1. configureScene: configureScene(route, routeStack)这个函数是optional可选属性,用来处理场景的动画和手势。它会要求两个参数route和routestack,route如同renderScene中的route一样是将要处理的界面的路由,routestack则是界面跳转关系的集合, 配置场景跳转方向

(route, routeStack) => Navigator.SceneConfigs.FloatFromRight

设置跳转方向
 *  - Navigator.SceneConfigs.PushFromRight (default) 默认
 *  - Navigator.SceneConfigs.FloatFromRight
 *  - Navigator.SceneConfigs.FloatFromLeft
 *  - Navigator.SceneConfigs.FloatFromBottom
 *  - Navigator.SceneConfigs.FloatFromBottomAndroid
 *  - Navigator.SceneConfigs.FadeAndroid
 *  - Navigator.SceneConfigs.SwipeFromLeft
 *  - Navigator.SceneConfigs.HorizontalSwipeJump
 *  - Navigator.SceneConfigs.HorizontalSwipeJumpFromRight
 *  - Navigator.SceneConfigs.HorizontalSwipeJumpFromLeft
 *  - Navigator.SceneConfigs.VerticalUpSwipeJump
 *  - Navigator.SceneConfigs.VerticalDownSwipeJump

3.renderScene:渲染参数renderScene(route, navigator),设置导航条跳转参数

本文使用代码

render() {
return (
  <View style={styles.container}>
      <Navigator
          initialRoute={{
          name: '首页',
          component:Home
          }}
          configureScene={
              (route) => {
                  return ({
                      ...Navigator.SceneConfigs.PushFromRight,
                      gestures: null,
                  });
              }
          }
           //导航条跳转传递参数
          renderScene={
          (route, navigator) => {
              let Component = route.component;
              // 没有参数
              // return <Component navigator={navigator} />
              // 有参数
              return <Component {...route.params} navigator={navigator} />
          }
         }>
      </Navigator>
  </View>
);

}

4、使用导航实现功能
主页点击--->详情(主页送一只玫瑰花给详情)玫瑰花是正向传值的参数==========正向传值
详情点击--->主页(详情送一盒巧克力给主页),巧克力是逆向传值的参数=========逆向传值

A、主页代码

export  default class Home extends Component{
 // 初始化方法
 constructor(props){
     super(props);
     this.state = {
       currentMessage: '原始值' //定义属性
     }
 }
 gotoHomeDetail(){
     // 这里保存一下是为了防止后续事件操作的时候this的执行改变
     let _this = this;
   //  使用push 方法跳转,里面是参数
     this.props.navigator.push({
         component: HomeDetail,
         params: {
             name: '主页送的一支玫瑰花',  //正向传值参数
             onCallBack: function (message) { //逆传值接受函数
                 _this.setState({currentMessage: message});
             }
         }
     })
 }
 render(){
     return (
         <View style={styles.container}>
             <Text style={styles.text}>我是主页</Text>
             <Text style={styles.detailText}
                   onPress={()=>{
                       // 点击调用导航跳转
                       this.gotoHomeDetail();
                   }}
             >点击送详情一枝花</Text>
             <Text style={styles.callBackText}>回调:{this.state.currentMessage}</Text>
         </View>
     )
    }
}

B 、详情代码

export default class HomeDetail extends Component{
// 初始化方法
constructor(props){
    super(props);
}
//跳转返回页面
gotoPopHomePage= () =>{
    // 获取导航
    const {navigator} = this.props;
    // 逆传参数
    this.props.onCallBack('详情送的巧克力');
    // 调用pop 返回
    if(navigator){
        navigator.pop();
    }
}
render(){
    return (
        <View style={styles.container}>
            <Text style={styles.text}>我是详情</Text>
            <Text style={styles.text}>我收到主页传值:{this.props.name}</Text>
            <Text style={styles.callBackText}
                  {/*点击调用返回导航方法*/}
                  onPress={this.gotoPopHomePage}>
                回调主页巧克力</Text>
        </View>
    )
   }
}

效果图


122133.gif

其他资料
ReactNative从零开始笔记1-初始化项目
ReactNative从零开始笔记2-组件的生命周期
ReactNative从零开始笔记3-state(状态)与props(属性)
ReactNative从零开始笔记4-PropTypes使用
ReactNative从零开始笔记5-组件传值(父子组件/兄弟组件)
ReactNative从零开始笔记6-导航页面传值(正传和逆传)

推荐阅读更多精彩内容