RN实现组件跳转、传值、回传、navigation内访问当前组件的成员数据

在学习RN过程中接触到StackNavigation导航组件,遇到的记录一下,以备后续查阅。

1、使用navigate函数实现页面跳转(A->B 可携带参数)           

//A页面跳转B页面:
this.props.navigation.navigagte(routeName,params,actions);   
     //routeName:跳转路由页面名称(需要在RouteConfig中定义)。
     //params:跳转携带的参数。
//B页面获取A页面传递过来参数:
this.props.navigation.state.params.xxx; //xxx为参数名(需与A页面中params内对应)

 

2、页面跳转并接收回传数据(A->B->A)

//A页面跳转B,params中指定callback回调参数,用于接受B页面返回数据。
this.props.navigation.navigate('B', {
            title:'跳转B页面',
            callback: (data) => {
                console.log('B回传的数据:' + data);
            }
        });
//B页面调用A页面params中指定的callback函数回传数据(自定义标题栏样式选项)
static navigationOptions = ({navigation}) => ({
    header: (
        <ImageBackground style={{height: 48}} source={require('../images/navigation_bg.png')}>
            <View style={{
                height: 48,
                flexDirection: 'row',
                justifyContent: 'space-between',
                alignItems: 'center'}}>
                <TouchableOpacity
                     style={{padding: 5}}
                     onPress={() => {
                        navigation.state.params.callback('回传A数据');
                        navigation.goBack();}}>
                     <Image style={{width: 30, height: 30}} source={require('../images/back.png')}/>
                </TouchableOpacity>
                <Text style={{fontSize: 24, color: '#ffffff'}}>{navigation.state.params.title}</Text>
                <Text style={{marginRight: 20, color: '#fff'}} onPress={() => Alert.alert('更多')}>更多</Text>
            </View>
        </ImageBackground>
     )
 })

 

3、导航拦内如何访问当前组件内成员数据

     【2】中B可以回传数据到A页面,但是数据是直接写死在导航栏内部的(“回传A数据”),当前组件导航栏内是无法使用this关键字来访问组件内任何数据(成员变量、状态机变量等),那如何在当前组件的导航栏内访问当前组件的数据呢? 

     方式一:B组件定义一个成员变量that并在构造函数中将this赋值为that,后续涉及到组件内部数据访问用that来代替this。

//B组件中定义一个成员变量that
let
that;
constructor(props) {
    super(props);
    //将this赋值到that
    that = this,
    this.state = {
        returnData:'',//将要返回给A组件(页面的状态机变量)
    };
}

//定义一个成员函数用来处理返回到A组件并回传状态机中数据
returnDataToBComponent() {
        //更改状态机变量(可在其他地方,这里放在返回函数一起)
        this.setState({returnData:'回传状态机变量到A页面'});
        this.props.navigation.state.params.callback(this.state.returnData);
        this.props.navigation.goBack();
    }

//B组件中导航栏内使用that来实现当前组件内成员函数的访问
static navigationOptions = ({navigation}) => ({
    header: (
                ...
                ...
                <TouchableOpacity
                     style={{padding: 5}}
                     onPress={() => {
                        that.returnDataToBComponent();}
                     }>
                     <Image style={{width: 30, height: 30}} source={require('../images/bacak.png')}/>
                </TouchableOpacity>
                ...
                ...
     )
 })

方式二:使用navigation对象的setParmas函数将当前组件成员函数设置到navigation的params中,其后在当前组件的导航栏内可以通过navigation.state.params.xxxx 来实现对当前组件内成员函数的访问。

componentDidMount() {
     //当前组件成员函数设置到导航栏参数中,以便状态栏内可以访问当前组件成员函数
     this.props.navigation.setParams({goBackPage: this.returnDataToBComponent});
 }

returnDataToBComponent() {
    this.setState({returnData: '返回到组件A的状态机数据'}, () => {
         this.props.navigation.state.params.callback(this.state.returnData);
         this.props.navigation.goBack();
    });
}

//B组件中导航栏内直接使用navigation的params来访问当前组件内成员函数。
static navigationOptions = ({navigation}) => ({
    header: (
                ...
                ...
                <TouchableOpacity
                     style={{padding: 5}}
                     onPress={() => {
                        navigation.state.params.goBackPage();}
                     }>
                     <Image style={{width: 30, height: 30}} source={require('../images/bacak.png')}/>
                </TouchableOpacity>
                ...
                ...
     )
 })

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值