React 中的父子组件 兄弟组件传值

举报
达拉崩巴斑得贝迪卜多 发表于 2021/12/21 00:13:13 2021/12/21
【摘要】 1.父组件向子组件传值 1.1 我们要明白父组件 --> 子组件 是通过props这个属性来传值的 父组件 import React from 'react'; import './App.c...

1.父组件向子组件传值

1.1 我们要明白父组件 --> 子组件 是通过props这个属性来传值的

父组件

import React from 'react';
import './App.css';
//引入子组件
import Nav from "./components/Nav";
class App extends React.Component{
    render () {
        return (
            <div className="App">
                <Nav title={'父亲传递的值'}/>  {/*父传子*/}
            </div>
        );
    }

}
export default App;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

子组件

import React from "react";

class Nav extends React.Component {
    constructor(props) {
        super(props);  ///接收和传递数据  传递的数据会在props里
        this.state = {  //保持组件的状态
            title: ''
        }
    }
    render() {
        return (
            <div>
                <div>{this.state.title}</div>
            </div>
        )
    }
    //完成挂载
    componentDidMount() {
        this.setState({
            title: this.props.title
        })
    }
}

export default Nav;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

在页面中显示
此时render执行了两次, 一次是默认执行,一次是在完成挂载之后, 调用this.setState 又重新执行render 方法
在这里插入图片描述

2.子组件向父组件传值(通过回调函数)

在这里我们分为4个步骤
2.1、在父组件中声明一个函数,用于接收子组件的传值
2.2、通过组件属性的方法,把函数传递给子组件

App.js

import React from 'react';
import './App.css';

//引入组件
import Nav from "./components/Nav";
class App extends React.Component{
    constructor(props){
        super(props);
    }
    //1.在父组件中声明一个函数,用于接收子组件的传值
   message(msg){
       // 通过形参接受到子组件的值并打印到控制台
       console.log(msg)
   }
   
    render () {
        return (
            <div className="App">
                {/* 在这里声明一个sendMsg属性,通过组件属性的方法,把函数传递给子组件 */}
                <Nav title={'父亲'}  sendMsg = {this.message}/>
                {/*子传父  通过回调函数*/}
            </div>
        );
    }
}
export default App;


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

2.3、在子组件中通过props属性调用父组件的函数,并通过参数传值

import React from "react";

class Nav extends React.Component {
    render() {
        return (
            <div>
                <button onClick={() => {
                    {/* 在子组件中通过props属性调用父组件的函数,并通过参数传值*/}
                    this.props.sendMsg('子组件传递的值')
                }}>点击
                </button>
            </div>
        )
    }
}

export default Nav;


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2.4、在父组件中的函数通过形参接收子组件的传值
点击按钮,在控制台打印出效果
在这里插入图片描述

3.兄弟组件传值

兄弟组件传值 实际上是间接的通过第三方来实现传值,举例,第一个儿子把值传给父亲,父亲在把这个值传给第二个儿子,这样就实现了兄弟组件传值

父组件代码

import React from 'react';
import './App.css';

//子组件1
import Input from "./components/Input";
//子组件2
import Nav from "./components/Nav";

class App extends React.Component {
    constructor(props) {
        super(props);
        // 先给 msg 一个空值
        this.state = {
            msg: ''
        }
    }
    // 声明一个方法用来接收Son1传来的值
    inputVal=(msg)=> {
        // 把Son1传来的值给放在父组件中
        this.setState({
            msg:msg
        });
    };

    render() {
        return (
            <div className="App">
                {/*one:子组件1 向父组件传值 引入子组件 拿到上边声明的方法*/}
                <Input sendVal={this.inputVal}/>
                {/*two: 父组件向子组件传值 引入第二个子组件 并声明一个属性iptVal  把Son1传来的值传过去*/}
                <Nav iptVal = {this.state.msg}/>
                <div>{this.state.msg}</div>
            </div>
        );
    }

}

export default App;


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

子组件1代码

import React from "react";

class Input extends React.Component {
    constructor(props) {
        super(props);
    }

    render() {
        return (
            <div>
                 {/*给input 事件 把输入框的值 传给父组件   sendVal*/}
                <input type="text"
                       ref="input"
                       onInput={()=>{
                           this.props.sendVal(this.refs.input.value)}}
                />
            </div>
        )
    }
}

export default Input;


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

子组件2代码

import React from "react";

class Nav extends React.Component {
    constructor(props) {
        super(props);
        this.state={
            iptVal:''
        }
    }

    render() {
        return (
            <div>
                <div>{this.state.iptVal}</div>
            </div>
        )
    }

    componentDidMount() {
        this.setState({
            //把从子组件传递过来的值 赋给 input
            iptVal:this.props.iptVal
        })
    }
}

export default Nav;


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

这样就实现了简单的兄弟组件传值
在这里插入图片描述

文章来源: lvsige.blog.csdn.net,作者:祥子的小迷妹,版权归原作者所有,如需转载,请联系作者。

原文链接:lvsige.blog.csdn.net/article/details/107318978

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。