美文网首页
ReactNative从零开始笔记5-组件传值(父子组件/兄弟组

ReactNative从零开始笔记5-组件传值(父子组件/兄弟组

作者: 摸着石头过河_崖边树 | 来源:发表于2019-01-18 18:36 被阅读42次

    一、使用环境

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

    二、父子组件传值

    2.1 父组件传值到子组件(顺传)
    • props 属性传值
    • 通过定义子组件的ref, 通过ref 获取子组件,调用子组件方法传值

    2.1.1 通过props 属性传值

    • 通过 <SonComponent gif={'公瑾水战法'}></SonComponent> 其中git 属性传值

      // 子组件
    class SonComponent extends Component{
       /**
        * 1.父组件通过属性给子组件传值
        * @type {{gif: *}} 属性申明, 具有提示
        */
       static propTypes ={
                gif: PropTypes.string,
         }
         // 属性默认值
         static defaultProps={
                 gif: '没有礼物',
         }
         render(){
              return (
                 <View style={styles.sonComponentStyle}>
                       <Text>我是子组件</Text>
                       <Text>父组件传过值是:
                              <Text style={{fontSize: 14, color: 'red'}}>{this.props.gif}      </Text>
                         </Text>
                   </View>
                   )
               }
          }
       // 父组件
      export default  class FatherComponnent extends Component{
          constructor(props){
             super(props);
           }
         render(){
               return (
                       <View style={styles.fatherStyle}>
                           <Text>我是父组件</Text>
                            <SonComponent gif={'公瑾水战法'}></SonComponent>
                      </View>
                    )
                }
        }
    

    2.1.2 通过定义子组件的ref, 通过ref 获取子组件,调用子组件方法传值

    • ref标记子组件<SonComponent ref='son'>
    • 调用子组件方法this.refs.son.changeMessageEvent('给儿子100元');

      // 子组件
    class SonComponent extends Component{
     // 初始化状态 
    constructor(props){
          super(props);
          this.state={
            msg:''
         }
       }
    /**
     * 2.父组件调用该方法 - 改变state值 - 给该组件传值
     * @param inputMsg 父组件传值参数
     */
    changeMessageEvent(inputMsg){
        this.setState({
            msg: inputMsg
        })
    }
    
    render(){
        return (
            <View style={styles.sonComponentStyle}>
                <Text>我是子组件</Text>
                <Text>{this.state.msg}</Text>
            </View>
        )
      }
    }
    // 父组件
    export default  class FatherComponnent extends Component{
        constructor(props){
            super(props);
         }
        render(){
            return (
            <View style={styles.fatherStyle}>
                <Text>我是父组件</Text>
                <Button title= '方法传值给子组件' color={'red'} onPress={()=>{
                    this.refs.son.changeMessageEvent('给儿子100元');
                }}></Button>
                <SonComponent ref='son'></SonComponent>
            </View>
        )
      }
    }
    
    2.2 子组件传值到父组件(逆传)
    • 通过在父组件定义方法,子组件props调用进行事件传递值
    • 子组件中callBack是在父组件中定义的回调方法名
    • 父组件引用子组件的时候定义callBack属性方法回调
     <SonComponent callBack={(m)=>{this.changeMoney(m);}}</SonComponent>
    

    // 子组件
    class SonComponent extends Component{
      render(){
          return (
              <View style={styles.sonComponentStyle}>
                  <Text>我是子组件</Text>
                   <Button title={'给父组件100元'} onPress={()=>{
                    this.props.callBack(100);
                   }}>
                  </Button>
            </View>
          )
       }
    }
    // 父组件
    export default  class FatherComponnent extends Component{
       constructor(props){
           super(props);
           this.state= {
            money: 0
          }
        }
      changeMoney(m){
          this.setState({
              money: m
          })
      }
      render(){
           return (
            <View style={styles.fatherStyle}>
                <Text>我是父组件</Text>
                <SonComponent callBack={(m)=>{
                   this.changeMoney(m);
                }}></SonComponent>
                <Text>获取到子组件的{this.state.money}元</Text>
            </View>
        )
       }
    }
    

    三、无关联组件传值

    • 使用方法: 通知(如果你有其他语言基础,可以理解为KVO)
    • 注意销毁观察者
    • 使用步骤:
      3.1 增加通知观察者, 接收到通知改变值

     // 增加观察者
     componentDidMount(): void {
        this.listener = DeviceEventEmitter.addListener('ggMakeMoney', (m)=>{
            this.setState({
                reciveMoney:m
            })
        })
    }
     // 组件销毁的时候移除观察者
    componentWillUnmount(): void {
         this.listener.remove();
    }
    

    3.2 发送通知传值

    DeviceEventEmitter.emit('ggMakeMoney',100);
    

    完成代码实现: 哥哥挣100元,给弟弟花

       //哥哥组件
    class GegeComponet extends Component{
      constructor(props){
        super(props);
     }
    // 哥哥挣钱,发送通知
      ggMakeMoney(){
        DeviceEventEmitter.emit('ggMakeMoney',100);
      }
      render(){
         return(
            <View>
                <Button title='哥哥挣钱' onPress={()=>{
                    this.ggMakeMoney();
                }}></Button>
            </View>
        );
      }
    }
    //弟弟组件
    class DidiComponet extends Component{
       constructor(props){
           super(props);
           this.state={
              reciveMoney: 0
          }
     }
    // 增加观察者
    componentDidMount(): void {
        this.listener = DeviceEventEmitter.addListener('ggMakeMoney', (m)=>{
            this.setState({
                reciveMoney:m
            })
        })
    }
    // 组件销毁的时候移除观察者
    componentWillUnmount(): void {
        this.listener.remove();
    }
    
    render(){
        return(
            <View>
                <Text>弟弟收到哥哥的钱{this.state.reciveMoney}</Text>
            </View>
        );
       }
     }
    // 父组件
    export default  class FatherComponnent extends Component{
       render(){
           return (
            <View style={styles.fatherStyle}>
                <Text>我是父组件</Text>
                <GegeComponet></GegeComponet>
                <DidiComponet></DidiComponet>
            </View>
        )
       }
     }  
    

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

    相关文章

      网友评论

          本文标题:ReactNative从零开始笔记5-组件传值(父子组件/兄弟组

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