【React Native】父组件和子组件间传值的几种方式

本文总结了React Native中父子组件及兄弟组件间传值的方法,包括通过共享State、使用DeviceEventEmitter进行跨组件通信等。通过实例详细介绍了不同场景下的传值策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在React Native的开发中,父子组件和兄弟组件存在关联关系的场景很常见,对这些场景做一个总结笔记。

1,兄弟组件:所谓兄弟组件,就是说同一个页面,有两个组件,组件A,组件B,组件A的状态的变化,可以导致组件B的状态变化。

有两种方式。第一种,在页面内定义一个State,组件A,使用props属性引入,操作组件A,修改页面内的State,然后,组件B,也是通过props属性引入页面内的State;当组件A状态变化时,修改页面的State,重新Render,然后,更新组件B,组件B进行Render。第二种,使用DeviceEventEmitter跨组件通信。

        2,父子组件

        如果你的项目有依托三方的架构,那么就可以直接使用三方本身支持的机制,如从父组件向子组件传值,可以直接在跳转页面时携带参数;从子组件改变父组件的值,可以使用回调函数,或者使用DeviceEventEmitter跨组件通信。

        接下来看看DeviceEventEmitter跨组件通信的几种使用方式:

        首先新建三个组件:分别为PostCallMsgAndMsg,PostCallMsg,PostMsg;

        父组件Msg中:

    import React, { Component } from 'react';
    import {
        AppRegistry, StyleSheet, Text, View, DeviceEventEmitter
    } from 'react-native';
    import PostMsg from './PostMsg'
    import PostCallMsg from './PostCallMsg'
    import PostCallMsgAndMsg from './PostCallMsgAndMsg'
 
    export default class Msg extends Component {
        constructor(props){
            super(props);
            this.state={
                listenerMsg:'listenerMsg',
                callMsg:'callMsg',
                callMsgAndMsg:'callMsgAndMsg'
            }
        }
 
        componentDidMount() {
            //注意addListener的key和emit的key保持一致
            this.msgListener = DeviceEventEmitter.addListener('Msg',(listenerMsg) => {
                this.setState({
                    listenerMsg:listenerMsg,
                })
            });
        }
 
        componentWillUnmount() {
            //此生命周期内,去掉监听
            this.msgListener&&this.msgListener.remove();
        }
     
        render() {
            return (
                <View style="{styles.container}">
                   <Text>第一种方式  DeviceEventEmitter:</Text>
    
                   <Text>{this.state.listenerMsg}</Text>
    
                    <PostMsg>

                       <Text>第二种方式  CallBack:</Text>
    
                        <Text>{this.state.callMsg}</Text>
    
                          <Postcallmsg onchangemsg="{" this.onmsgbycall="">
    
                            <Text>第三种方式  CallBack有参数:</Text>
    
                            <Text>{this.state.callMsgAndMsg}</Text>
    
                            <Postcallmsgandmsg onchangemsg="{(msg)=">{this.onMsgByCallAndMsg(msg)} }/></Postcallmsgandmsg>
    
                            </Postcallmsg>
    
                    </PostMsg>
    
                </View>
            );
        }
 
        onMsgByCall=()=>{
            this.setState({
                callMsg:'通过CallBack修改父组件状态值'
            })
        }
 
        onMsgByCallAndMsg=(msg)=>{
            this.setState({
                callMsgAndMsg:msg
            })
        }
    }
 
    const styles = StyleSheet.create({
        container: {
            flex: 1,
            justifyContent: 'center',
            alignItems:'center',
        },
    )}

PostCallMsgAndMsg中:

    import React, { Component } from 'react';
    import {
        AppRegistry, StyleSheet, Text, View, TouchableOpacity,
    } from 'react-native';
 
    export default class PostCallMsgAndMsg extends Component {
        render() {
            return (
                <View style="{styles.container}">
                    <View style="{styles.viewLine}/">
                    <Touchableopacity onpress="{this._postMsgByCallBack}">
                        <Text>PostCallMsgAndMsg</Text>
                    </Touchableopacity>
                </View>
            );
        }
 
        _postMsgByCallBack=()=>{
            if(this.props.onChangeMsg){
                this.props.onChangeMsg('通过PostCallMsgAndMsg来传递属性');
            }
        }
    }
 
    const styles = StyleSheet.create({
        container: {
            justifyContent: 'center',
            alignItems: 'center',
            marginBottom:20,
        },
    });

PostCallMsg中:

    import React, { Component } from 'react';
    import {
        AppRegistry, StyleSheet, Text, View, TouchableOpacity,
    } from 'react-native';
 
    export default class PostCallMsg extends Component {
        render() {
            return (
                <View style="{styles.container}">
                    <View style="{styles.viewLine}/">
                    <Touchableopacity onpress="{this._postMsgByCallBack}">
                        <Text>Callback</Text>
                    </Touchableopacity>
                </View>
            );
        }
     
        _postMsgByCallBack=()=>{
            if(this.props.onChangeMsg){
                this.props.onChangeMsg();
            }
        }
    }
 
    const styles = StyleSheet.create({
        container: {
            justifyContent: 'center',
            alignItems: 'center',
            marginBottom:20,
        },
    });

PostMsg中:

    import React, { Component } from 'react';
    import {
        AppRegistry, StyleSheet, Text, View, TouchableOpacity, DeviceEventEmitter,
    } from 'react-native';
 
    export default class PostMsg extends Component {
        render() {
            return (
                <View style="{styles.container}">
                    <Touchableopacity onpress="{this._postMsgByListener}">
                        <Text>DeviceEventEmitter</Text>
                    </Touchableopacity>
                </View>
            );
        }
 
        _postMsgByListener=()=>{
            DeviceEventEmitter.emit('Msg','此消息来自于子组件,DeviceEventEmitter父组件进行修改和状态变化');
        }
    }
 
    const styles = StyleSheet.create({
        container: {
            justifyContent: 'center',
            alignItems: 'center',
            marginBottom:20,
        },
    });

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhangKui_c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值