react中类组件传值,函数组件传值:父子组件传值、非父子组件传值[通俗易懂]

react中类组件传值,函数组件传值:父子组件传值、非父子组件传值[通俗易懂]react中父子组件传值

大家好,又见面了,我是你们的朋友全栈君。

父子组件传值、非父子组件传值;

类组件传值

父子 组件传值

子 传 父:

            子组件:事件的触发
            sendMsg=()=>{
                this.props.person();
            }

            父组件:
                <Child person={this.getMsg}></Child>
                getMsg=(data)=>{
                    console.log(data);
                }

父 传 子:

            父组件
            state = {
                num : 100
            }
            <Child num={this.state.num}></Child>
            
            子组件
                this.props.num

父子组件传值案例(导航下拉框效果)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>父子组件传值导航效果</title>
    <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <script src='https://unpkg.com/babel-standalone@6.15.0/babel.min.js'></script>
    <style> #box{ 
      width: 80%; padding: 10px; margin: auto; outline: 1px solid red; overflow: hidden; } .nav{ 
      display: flex; justify-content: space-around; } .nav span{ 
      height: 30px; } </style>
</head>
<body>
    <div id="box"></div>
</body>

<script type="text/babel"> class Nav extends React.Component{ 
      constructor(props){ 
      super(props); this.state = { 
      title:['区域','价格','房型','朝向'], num : 0 } } render(){ 
      return( <React.Fragment> <div className="nav"> { 
      this.state.title.map((item,i)=>{ 
      return <span key = { 
     i} onClick={ 
     ()=>{ 
     this.getindex(i)}}>{ 
     item}</span> }) } </div> <NavSecond index={ 
     this.state.num} tab={ 
     this.getData}></NavSecond> </React.Fragment> ) } getindex = (index)=>{ 
      console.log(index); this.setState({ 
      num:index }) } getData = (text)=>{ 
      this.state.title.splice(this.state.num,1,text) this.setState({ 
      title:this.state.title }) console.log(text); } } class NavSecond extends React.Component{ 
      constructor(props){ 
      super(props); this.state = { 
      con:[ ['高新区','中原区','二七区','经开区','荥阳'], ['20W','40W','60W','80W','100W'], ['一室','两室','三室','四世','复式'], ['朝南','朝东','朝西','朝北'] ] } } render(){ 
      return ( <React.Fragment> { 
      this.state.con[this.props.index].map((item,i)=>{ 
      return <p key = { 
     i} onClick={ 
     ()=>{ 
     this.sendData(item)}}>{ 
     item}</p> }) } </React.Fragment> ) } sendData=(text)=>{ 
      this.props.tab(text); } } ReactDOM.render(<Nav/>,document.querySelector('#box')); </script>
</html>

非父子 组件传值

    **方法:
    1)redux 公共池(只能使用在脚手架中)
    2)按照原来父子组件之间的关系,进行一层层传递
    3)context上下文(官方提供的数据传输的方式)     推荐使用这种方式**

步骤:

  1. 声明context组件
    let context = React.createContext();
  2. 在你需要发送数据的组件上写上 context.Provider发送数据
    <context.Provider value={要发送的数据}>
    <组件标签 ></组件标签>
    </context.Provider>
  3. 在需要接受数据的组件上 写上 context.Consumer 消费者组件,来接受数据
    <context.Consumer>
    {value=>{value}怎么渲染数据}
    </context.Consumer>

案例:

<script type='text/babel'>
    
    class A extends React.Component{ 
   
        constructor(props){ 
   
            super(props)
            this.state = { 
   
                data:''
            }
        }
        render(){ 
   
            return (
                <div>
                    a组件 -- { 
   this.state.data}
                    { 
   /* 接收B组件传递过来的值 */}
                    <B num={ 
   this.getData}></B>
                    { 
   /* 将A组件中的数据传递给C组件 */}
                    <C msg={ 
   this.state.data}></C>
                </div>
            )
        }
        getData=(data)=>{ 
   
            this.setState({ 
   
                data
            })
        }
    }
    class B extends React.Component{ 
   
        constructor(props){ 
   
            super(props)
            this.state = { 
   
                num:'张三丰'
            }
        }
        render(){ 
   
            return (
                <div>
                    B组件
                    <button onClick={ 
   ()=>{ 
   this.sendData(this.state.num)}}>发送数据给A组件</button> 
                </div>
            )
        }
        sendData=(data)=>{ 
   
            this.props.num(data);
        }
    }
    class C extends React.Component{ 
   
        render(){ 
   
            return (
                <div>
                    C组件 -- { 
   this.props.msg}
                </div>
            )
        }
    }
    ReactDOM.render(<A></A>,document.getElementById('app'));
</script>

函数式组件传值:

父子组件传值

父传子:

        1)在父组件中找对子标签,在子组件的标签上添加自定义属性,自定义属性名 = {要发送的数据}
            <Child 自定义属性名={要发送的数据}></Child>
        2)在子组件模板中使用props.自定义属性名可以获取父组件传递过来的数据,同时在子组件的函数中接受一个参数 props
            function 子组件名(props){
                return(
                    <div>{props.自定义属性名}</di>
                )
            }

子传父:

		前提必须要有props,在函数组件的行參的位置,需要的是子组件的函数的props
        1)在子组件中自定义一个数显进行数据发送,在需要出发的dom元素上面绑定自定义事件
        子组件模板
            <p onClick={自定义事件}></p>
            function 自定义事件(){
                props.**自定义属性名a**(要发送的数据)
            }

        2)在父组件中找到子组件标签,在子组件标签上面写 自定义属性={新的自定义方法}
            <子组件标签 **自定义属性名a**={新的方法}></子组件标签>
		(这个两个  **自定义属性名** 要一致)
        3)父组件中接收自定义参数,这个自定义参数就是子组件传递给父组件的数据
            function 新的方法(参数){
                console.log(参数) // 参数就是子组件传递给父组件的数据
            }

函数式父子组件传值案例

父组件 A.js

import React, { 
    useState } from 'react'
import Aa from './Aa'

export default function A() { 
   
    
    const [msg,setMsg] = useState('这是父组件需要传递的信息');
    const [arr,setArr] = useState([1,2,3,4,5,6])
  return (
    <div>
        A
        <Aa name={ 
   msg} arr={ 
   arr} msg={ 
   get}></Aa>
    </div>
  )
  function get(a,b){ 
   
      console.log(a,b);
  }
}

子组件 Aa.js

import React, { 
    useState } from 'react'

export default function Aa(props) { 
   

    const [msg,setMsg]=useState('Aa子组件的值')
  return (
      <React.Fragment>
        <div>{ 
   props.name}</div>
        <div>
            { 
   
                props.arr.map((item,i)=>
                    <li key={ 
   i}>父组件传递过来的arr里面遍历过来的第{ 
   i+1}:{ 
   item}</li>
                )
            }
        </div>
        <br/>
        <button onClick={ 
   ()=>send(1)}>传值给父组件</button>
      </React.Fragment>
  )
  function send(i){ 
   
      console.log(i);
      props.msg(msg,i)
  }
}

非父子组件传值

函数组件中我们一般情况下使用useEffect实现数据的请求
// useEffect Hook 看做 componentDidMount,componentDidUpdate 和 componentWillUnmount (加载,更新,卸载)这三个函数的组合。
语法格式:
useEffect(()=>{

},[])

父传子 class
父组件中子组件标签中,传递属性 msg=‘11111’
子组件件接收 this.props.msg

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145339.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • wireshark分析无线wifi包

    wireshark分析无线wifi包1、找到station或者ap的mac地址,使用过滤命令找到两者的网络包交互mac地址过滤:wlancontains00:11:22:33:44:55报文类型过滤:wlan.fc.type_subtype==0x0输入wlan.会列出很多可用无线过滤命令参考:https://blog.csdn.net/neal_hddnwpu/article/details/82586235…

    2022年7月21日
    30
  • 带case操作的update语句_多个case when嵌套

    带case操作的update语句_多个case when嵌套1、场景:由于多次循环执行数据库操作是非常耗费性能的。因此,我们需要尽可能一条UPDATE语句更新多条数据。2、方式:casewhen拼凑UPDATE表名SET(目标字段)BRANCH_NO=CASEWHEN(筛选条件)BANK_BRANCH_ID=’-10212’THEN ‘TU32958123’WHENBANK_BRANCH_ID=’-10213’THEN ‘TU32958112’ELSE’测试’END,COMMENTS=CASEWH

    2025年9月21日
    8
  • opencv求逆矩阵函数_c++矩阵

    opencv求逆矩阵函数_c++矩阵voidprintMatrix(CvMat*mat){intk=0;for(inti=0;irows;i++){for(intj=0;jcols;j++){printf(“%10.3f”,cvmGet(mat,i,j));

    2022年8月21日
    7
  • iphone android换机助手下载,安卓苹果换机助手[通俗易懂]

    iphone android换机助手下载,安卓苹果换机助手[通俗易懂]安卓苹果换机助手软件由腾讯团队专业打造的一款单品,它可以帮助你的手机自由换机,把各种信息文件都一次转换到新手机中去,安卓苹果换机助手无需联网,不耗费手机流量,传输速度快。功能介绍支持各主流品牌和厂商设备极速秒传。一键轻松换机,支持通讯录、软件、短信、文件、通话记录、书签、图片、音乐、视频、日程等多种数据传输。功能特色【数据全面】支持数据全面,基本覆盖常见的手机各种数据类型,包括图片、视频、联系人、…

    2022年5月9日
    113
  • EasyDSS流媒体服务器软件-正式环境安装部署攻略

    EasyDSS流媒体服务器软件-正式环境安装部署攻略EasyDSS流媒体服务器软件,提供一站式的转码、点播、直播、时移回放服务,极大地简化了开发和集成的工作。其中,点播功能主要包含:上传、转码、分发。直播功能主要包含:直播、录像,直播支持RTMP输入,RTMP/HLS/HTTP-FLV的分发输出;录像支持自定义保存时长、检索及下载。提供丰富的二次开发接口,基于JSON的封装及HTTP调用。提供播放鉴权、推流鉴权等安全保证。提供用户及相关权限管理…

    2022年6月9日
    32
  • python可以自动回收垃圾吗_python 数据清洗

    python可以自动回收垃圾吗_python 数据清洗前言现在的高级语言如java,c#等,都采用了垃圾回收机制,而不再像c,c++里,需要用户自己管理内存。自己管理内存及其自由,可以任意申请内存,但这如同一把双刃剑,可能会造成内存泄漏,空指针等bug

    2022年7月28日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号