10.React中的组件、父子组件、React props父组件给子组件传值、子组件给父组件传值、父组件中通过refs获取子组件属性和方法

原创
2019/01/13 23:28
阅读数 1.6K

新闻组件,首页组件是父组件

头部组件,底部组件是子组件

 

构造函数中固定写法    super(props); //固定写法  

总结

React中的组件: 解决html 标签构建应用的不足。         
使用组件的好处:把公共的功能单独抽离成一个文件作为一个组件,哪里里使用哪里引入。
父子组件:组件的相互调用中,我们把调用者称为父组件,被调用者称为子组件
父子组件传值(react 父子组件通信):

父组件给子组件传值 
            1.在调用子组件的时候定义一个属性  <Header msg='首页'></Header>
            2.子组件里面 this.props.msg          
        说明:父组件不仅可以给子组件传值,还可以给子组件传方法,以及把整个父组件传给子组件,可以让子组件给父组件传值。

父组件主动获取子组件的数据
        1、调用子组件的时候指定ref的值 <Header ref='header'></Header>      
        2、通过this.refs.header  获取整个子组件实例  (dom(组件)加载完成以后获取 )

一.父组件给子组件传值。子组件获取父组件的数据

父组件引用子组件的时候,声明属性(通过构造函数)

<Header title={this.state.title} />

子组件直接调用

<h2>{this.props.title}</h2>

二.父组件给子组件传方法。子组件获取父组件的方法

父组件中有一个run方法,引用子组件的时候,将run方法传递给子组件(通过构造函数传递参数为props)

<Header title={this.state.title}  run={this.run}  />

子组件调用父组件中run方法

 <button onClick={this.props.run}>调用news父组件的run方法</button>

三.获取整个父组件

父组件中引用子组件时,传递自己到子组件(通过构造函数传递)

<Header title={this.state.title} news={this} />

子组件中方法直接调用父组件对象news(this.props.news

    getNews=()=>{

            // alert(this.props.news.state.msg);

            this.props.news.getData();

    }

子组件调用

<button onClick={this.getNews}>获取整个news组件实例</button>

四.子组件给父组件传值

父组件获取子组件的数据

    //获取子组件里面穿过来的数据

    getChildData=(result)=>{

      alert(result);

      this.setState({

        msg:result
      })
    }

子组件调用方法

<button onClick={this.props.news.getChildData.bind(this,'我是子组件的数据')}>子组件给父组件传值</button>

五.父组件获取子组件对象

父组件中

 <button onClick={this.getFooter}>获取整个底部组件</button>

父组件的方法


    //父组件主动调用子组件的数据和方法
    getFooter=()=>{
      /*
        父组件主动获取子组件的数据
          1、调用子组件的时候指定ref的值 <Header ref='header'></Header>      
          2、通过this.refs.header  获取整个子组件实例  (dom(组件)加载完成以后获取 )
      */
      //alert(this.refs.footer.state.msg); //获取子组件的数据
      this.refs.footer.run();
    }

父组件引用子组件的时候

<Footer  ref='footer'/>

父组件中获取子组件的对象

    //父组件主动调用子组件的数据和方法
    getFooter=()=>{
      /*
        父组件主动获取子组件的数据
          1、调用子组件的时候指定ref的值 <Header ref='header'></Header>      
          2、通过this.refs.header  获取整个子组件实例  (dom(组件)加载完成以后获取 )
      */
      //alert(this.refs.footer.state.msg); //获取子组件的数据
      this.refs.footer.run();//调用子组件中的run方法
    }

 

 

完整代码

首页组件

import React, { Component } from 'react';

/*

React中的组件: 解决html 标签构建应用的不足。         


使用组件的好处:把公共的功能单独抽离成一个文件作为一个组件,哪里里使用哪里引入。


父子组件:组件的相互调用中,我们把调用者称为父组件,被调用者称为子组件


父子组件传值(react 父子组件通信):

    父组件给子组件传值 

		    1.在调用子组件的时候定义一个属性  <Header msg='首页'></Header>

		    2.子组件里面 this.props.msg          


        说明:父组件不仅可以给子组件传值,还可以给子组件传方法,以及把整个父组件传给子组件,可以让子组件给父组件传值。


    父组件主动获取子组件的数据

        1、调用子组件的时候指定ref的值 <Header ref='header'></Header>      
        
        2、通过this.refs.header  获取整个子组件实例  (dom(组件)加载完成以后获取 )



*/

import Header from './Header';

class Home extends Component {

    constructor(props){
        super(props); //固定写法       
        this.state={
          msg:'我是一个首页组件',
          title:'首页组件'
        }
    }
    render() {
      return (
        <div>        
          

            <Header title={this.state.title} />
          <br />

          <hr />

            <br />

            这是首页组件的内容
            
       
        </div>
      );
    }
  }
  
  export default Home;
  

 

头部组件

import React, { Component } from 'react';

class Header extends Component{

    constructor(props){
            super(props);   //国定写法

            this.state={

                msg:'这是一个头部组件'
            }
    }

    getNews=()=>{

            // alert(this.props.news.state.msg);

            this.props.news.getData();

    }

    render(){


        return(

            <div>

                <h2>{this.props.title}</h2>

                <button onClick={this.props.run}>调用news父组件的run方法</button>

                <br />  <br />
                <button onClick={this.props.news.getData}>获取news组件的getData方法</button>

                    <br />  <br />
                 <button onClick={this.getNews}>获取整个news组件实例</button>


<br />  <br />
                  <button onClick={this.props.news.getChildData.bind(this,'我是子组件的数据')}>子组件给父组件传值</button>
            </div>
        )
    }
}

export default Header;

 

新闻页面


/*

React中的组件: 解决html 标签构建应用的不足。         


使用组件的好处:把公共的功能单独抽离成一个文件作为一个组件,哪里里使用哪里引入。


父子组件:组件的相互调用中,我们把调用者称为父组件,被调用者称为子组件


父子组件传值(react 父子组件通信):

    父组件给子组件传值 

		    1.在调用子组件的时候定义一个属性  <Header msg='首页'></Header>

			  2.子组件里面 this.props.msg          


        说明:父组件不仅可以给子组件传值,还可以给子组件传方法,以及把整个父组件传给子组件,可以让子组件给父组件传值。


    父组件主动获取子组件的数据

        1、父组件调用子组件的时候指定ref的值 <Header ref='header'></Header>      
        
        2、父组件通过this.refs.header  获取整个子组件实例  (dom(组件)加载完成以后获取 )



*/

import React, { Component } from 'react';

import Header from './Header';

import Footer from './Footer';


class News extends Component {

    constructor(props){
        super(props);        
        this.state={          
          title:'新闻组件',
          msg:'我是新闻组件的msg'
        }
    }

    run=()=>{

      alert('我是父组件的run方法')
    }


    //获取子组件里面穿过来的数据

    getChildData=(result)=>{

      alert(result);

      this.setState({

        msg:result
      })
    }


    getData=()=>{

      alert(this.state.title+'getData');
      
    }


    //父组件主动调用子组件的数据和方法
    getFooter=()=>{


      /*
        父组件主动获取子组件的数据

          1、调用子组件的时候指定ref的值 <Header ref='header'></Header>      
          
          2、通过this.refs.header  获取整个子组件实例  (dom(组件)加载完成以后获取 )
      */

      //alert(this.refs.footer.state.msg); //获取子组件的数据


      this.refs.footer.run();

    }
    render() {
      return (
        <div>        
          

            <Header title={this.state.title}  run={this.run}  news={this} />
          <br />

          <hr />

            <br />

            这是新闻组件的内容---{this.state.msg}


             <br />

             <button onClick={this.getFooter}>获取整个底部组件</button>



             <br />

            <hr />

            <br />

          <Footer  ref='footer'/>
        </div>
      );
    }
  }
  
  export default News;
  

 

底部组件

import React, { Component } from 'react';

class Footer extends Component{

    constructor(props){
            super(props);   //国定写法

            this.state={

                msg:'我是一个底部组件'
            }
    }

    run=()=>{

        alert('我是底部组件的run方法')
    }

    render(){


        return(

            <div>

                <h2>我是一个底部组件</h2>

             
            </div>
        )
    }
}

export default Footer;
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部