ReactNative之父子组件传值(五)

前言

眼看很多公司都开始尝试使用ReactNative,达到跨平台开发,最近也写了很多文章,希望让更多想了解的同学快速上手ReactNative.

如果喜欢我的文章,可以关注我微博:袁峥Seemygo

ReactNative之父子组件传值

顺传(父传子)

  • 1.通过props传值
  • 案例:父控件给子控件传递名称,子控件根据父控件提供的名称显示谁的儿子

// 子组件
class  SonCompoent extends Component{

    render() {
        return (
            <View style={styles.sonViewStyle}>
                <Text style={{fontSize:20}}>{this.props.name}的baby</Text>
            </View>
        );
    };
}

// 父组件
class FatherComponet extends Component {
    
    render() {
        return (
            <View style={{flex:1,alignItems:'center'}}>
                <SonCompoent  name={this.props.name}/>
            </View>
        );
    }
}

// 主组件
export default class ReactDemo extends Component {
    render() {
        return (
            <FatherComponet name="xmg" />
        );
    }
}

const styles = StyleSheet.create({
    sonViewStyle:{
        flex:1,
        justifyContent:'center',
        alignItems:'center',

    }

});
  • 2.有时候需要拿到组件传值,通过ref拿到控件给控件传值。
  • 案例:爸爸每个月,给儿子生活费.
  • 使用箭头函数解决绑定this问题
import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View
} from 'react-native';

class  SonCompoent extends Component{

    constructor(props){
        super(props);

        this.state = {
            money:0
        }
    }

    receiveMoney(money){
        this.setState({
            money:money
        });
    }

    render() {
        return (
            <View style={styles.sonViewStyle}>
                <Text style={{fontSize:20}}>{this.props.name}的baby</Text>
                <Text>总共收到{this.state.money}生活费</Text>
            </View>
        );
    };
}

class FatherComponet extends Component {


    render() {
        return (
            <View style={{flex:1,alignItems:'center'}}>
                <Text style={{marginTop:100}} onPress={()=>{
                    this.refs.son.receiveMoney(1000);
                }}>发生活费</Text>
                <SonCompoent ref="son" name={this.props.name} />
            </View>
        );
    }
}

export default class ReactDemo extends Component {
  render() {
    return (
        <FatherComponet name="xmg" />
    );
  }
}

const styles = StyleSheet.create({
    sonViewStyle:{
        flex:1,
        justifyContent:'center',
        alignItems:'center',

    }

});

AppRegistry.registerComponent('React', () => ReactDemo);

逆传(子传父)

  • 使用方法回调
    • 1.在父组件中定义一个处理接收到值的方法
    • 2.把这个方法传递给子组件,并且绑定this,子组件就能通过this.props拿到这个方法调用
  • 案例:儿子赚钱了,把赚的钱传递给父亲

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View
} from 'react-native';

class  SonCompoent extends Component{

    makeMoney (money) {
        // 传递给父控件
        console.log('赚了'+ money);
        console.log(this)
        this.props.receiveMoney(money);

    }

    render() {
        return (
            <View style={styles.sonViewStyle}>
                <Text style={{fontSize:20}}>{this.props.name}的baby</Text>
                <Text onPress={this.makeMoney.bind(this,100)}>赚100块钱</Text>
            </View>
        );
    };
}

class FatherComponet extends Component {

    constructor(props){
        super(props);
        console.log(this);
        this.state = {
            money:0
        };
    }

    receiveMoney(money) {
        console.log('爸爸收到'+ money);

        console.log(this);

        var m = this.state.money;

        m += money;

        this.setState({
            money:m
        });

    }

    render() {
        return (
            <View style={{flex:1,alignItems:'center'}}>
                <SonCompoent  name={this.props.name+'A'} receiveMoney={this.receiveMoney.bind(this)}/>
                <SonCompoent  name={this.props.name+'B'} receiveMoney={this.receiveMoney.bind(this)}/>
                <Text style={{marginBottom:50}}>爸爸收到{this.state.money}</Text>
            </View>
        );
    }
}



export default class ReactDemo extends Component {
  render() {
    return (
        <FatherComponet name="xmg" />
    );
  }
}

const styles = StyleSheet.create({
    sonViewStyle:{
        flex:1,
        justifyContent:'center',
        alignItems:'center',

    }

});

AppRegistry.registerComponent('React', () => ReactDemo);

无关联组件传值(通知)

  • 当两个组件,互相之间拿不到谁的时候,可以用通知传值.
    • 哥哥赚钱了,给弟弟花
import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
    DeviceEventEmitter
} from 'react-native';

class  DiDiCompoent extends Component{

    constructor(props){
        super(props);

        this.state = {
            money:0
        }
    }


    componentDidMount() {

        this.age = 10;
        this.age = 20;

        console.log(this.age);

        // 定义属性,但是对这个属性的修改不会触发render
        this.lister = DeviceEventEmitter.addListener('makeMoney',(money)=>{
            this.setState({
                money:money
            });
        })
    }

    componentWillUnmount() {
        this.lister.remove();
    }


    render() {
        return (
            <View style={styles.didiStyle}>
                <Text> 弟弟</Text>
                <Text>收到{this.state.money}零花钱</Text>
            </View>
        );
    };
}

class GeGeComponet extends Component {

    render() {
        return (
            <View style={{flex:1,justifyContent:'center',alignItems:'center'}}>
                <Text>哥哥</Text>
                <Text onPress={()=>{
                    DeviceEventEmitter.emit('makeMoney',100);
                }}>发生活费</Text>
            </View>
        );
    }
}

export default class ReactDemo extends Component {
    render() {
        return (
            <View style={{flex:1}}>
                <GeGeComponet />
                <DiDiCompoent />
            </View>

        );
    }
}

const styles = StyleSheet.create({
        didiStyle:{
            flex:1,
            justifyContent:'center',
            alignItems:'center'
        }

});

AppRegistry.registerComponent('React', () => ReactDemo);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,699评论 25 708
  • 目前,react组件有三种写法,分别是es5的createClass写法,es6的class写法,以及statel...
    ZoomFunc阅读 1,855评论 0 1
  • (文字图片均来自作者原创公众号英子工作室,原创) 初夏的感觉是如此美好,轻柔的风,淡淡的不猛烈的热,还有池塘里没有...
    霓裳依依阅读 388评论 2 3
  • 昨天中午,一个群友+微信好友+老乡的大哥突然给我发了条微信,告知他是山西紫晨大健康的全国营销总监,让我给他打个电话...
    景景相依阅读 128评论 0 0
  • 沃尔德英语于2017年3月31日顺利进驻太平洋影城春熙店、王府井店。 太平洋影城·春熙店 执行照片 太平洋影城·...
    可乐7君阅读 435评论 0 0