【React的组件&组件间的通信(父向子,子向父,同级组件通信)】

2023-10-30

一、React项目的入口文件(create-react-app)

React项目的入口文件(create-react-app):index.js

在这里插入图片描述

1、React.StrictMode:检测工具,检查React项目是否存在潜在风险。不会渲染任何真是的DOM。可以用在任何地方:

(1)识别不具备生命周期的组件

(2)检查旧式字符串的用法

(3)检查弃用的方法

在这里插入图片描述

二、React的组件

1、什么是组件?

什么是组件:是视图的抽象

2、组件的分类:

(1)函数组件:推荐使用

(2)类组件:必须继承自React.Component类,并且必须有render方法,在render方法中用return语句来定义要渲染的视图。

a、组件文件的扩展名可以是.js,也可以是.jsx

b、<Fragment></Fragment>等价于<></>

c、在return中必须要有一个根标签

3、组件间的通信

组件间的通信:是单向数据流设计,即数据只能从父级向子级一层一层向下传递

(1)父级向子级通信:在父组件中调用子组件时,只需要将想要传递的数据加在子组件的属性上,然后子组件内部通过props属性来接收。

☀️举个例子:

创建data目录,再创建一个子文件index.js文件

let data = {
    famliy:{
        title:'家人',
        list:[
            {name:'爸爸'},
            {name:'妈妈'}
        ]
    },
    friend:{
        title:'朋友',
        list:[
            {name:'郭靖'},
            {name:'黄蓉'},
            {name:'老顽童'}
        ]
    },
    customer:{
        title:'客户',
        list:[
            {name:'阿里'},
            {name:'腾讯'},
            {name:'小米'}
]
    }
}
export default data

App.js父组件:

import logo from './logo.svg';
import './App.css';
import First from "./components/First"
import data from './data/index'

function App() {
  return (
     <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
      </header>
        {
            Object.keys(data).map((itemName)=>{
                return <First key ={itemName} dlData={ data[itemName] } />
            })
        }
    </div>
  );

}

export default App;

First.jsx子组件:

import React,{ Component } from "react";
class First extends Component {
    render() {
        let {dlData} = this.props
        return (
            <>
                <dl className="first-group">
                    <dt>{dlData.title}</dt>
                    {
                        dlData.list.map((item, index) => {
                            return <dd key={index}> {item.name} </dd>
                        })
                    }
                </dl>
            </>
        )
    }
}
export default First;

效果展示:
在这里插入图片描述

(2)子组件向父组件传递数据:React是单向数据流,无法从子组件直接将数据传递给父组件。可以在父组件中定义好回调函数,把回调函数传递给子组件,利用回调函数向父组件传递数据。

☀️举个例子:

Father.jsx父组件:

import React,{Component} from "react";
import Son from "./Son"
class Father extends Component{
    constructor(props) {
        super(props);

    }
    showInfo(name){//回调函数
        console.log('子组件的Name:'+name)
    }
    render(){
        return(
            <Son openShow = {this.showInfo}/>//将回调函数传递给子组件
        )
    }
}
export  default  Father

Son.jsx子组件:

import React,{Component } from "react";
class Son extends Component{
    constructor(props) {
        super(props);
    }
    render(){
        let { openShow } = this.props
        return (
            <button onClick={()=>{
                openShow('刘备')
            }}>我是子组件</button>
        )
    }
}
export default  Son;

效果显示:
点击按钮:
在这里插入图片描述在这里插入图片描述

(3)同级组件之间的传递:React是单向数据流,同级组件之间无法直接传递数据。可以通过父组件来完成同级组件之间的数据传递。

注意:组件的状态state的使用

a、在React中,组件就是一种状态机,组件会根据状态的不同输出不同的UI。需要交互时,只需要把交互和状态关联起来。

b、定义state:state是组件实例的一个属性,它的值是一个对象在类组件的构造方法中定义
this.state = {}
c、更新state:调用setState方法。因为视图和state是绑定的,所以当state更新后,视图也会重新渲染。

过程:调用setState方法后,会根据setState传入的值,对state进行修改,根据修改后的state生成新的虚拟的DOM,将新的虚拟DOM和老的虚拟的DOM进行对比,找到修改点对象视图进行更新

注意组件的函数绑定this的方法:组件中的普通函数是没有绑定this的(如下例子中的changeName函数要用箭头函数)

a、使用bind()函数绑定this:在构造函数中定义以下语句

this.函数名 = this.函数名.bind(this)

b、使用箭头函数

☀️举个例子:

Counter.jsx代码段:

import React,{ Component } from "react";
import Counter1 from "./Counter1";
import Counter2 from "./Counter2";
class Counter extends Component{
    constructor(props) {
        super(props);
        this.state = { //组件的状态属性
            name: '西游',
            age : 50,
            counter1Name:''
        }
        this.changeName = this.changeName.bind(this);//绑定this
    }
    changeName(sonName){ //没有使用箭头函数:找到this

        this.setState({
            counter1Name: sonName
        })
    }
    render() {
        let { name,age } = this.state
        return (
            <>
                <p>姓名:{ name }</p>
                <p>年龄:{ age }</p>

                <button onClick={()=>{
                    this.setState({
                        age: ++age
                    })
                }}>过了一年</button>
                <br/><br/>
                <Counter1  modifyName={ this.changeName }/>
                <Counter2  counter1Name={this.state.counter1Name }/>
            </>
        )
    }
}
export default Counter;

Counter1.jsx代码段:

import React,{Component} from "react";

export default  class Counter1 extends Component{
    constructor(props) {
        super(props);
        this.state = {
            name: '张良'
        }
    }
    render() {
        let { modifyName } = this.props
        return (
            <div className="div1">
                <button onClick={()=>{
                      modifyName(this.state.name)
                   }
                }>我是Counter1</button>
                <br/><br/>
                <p>姓名:{ this.state.name }</p>
            </div>
        )
    }
}

Counter2.jsx代码段:

import React,{ Component } from "react";

export default  class Counter2 extends Component{
    render() {
        let { counter1Name } = this.props
        return (
            <div className="div2">
                <button>我是Counter2</button>
                <br/><br/>
                <p>
                    来自Counter1的Name: { counter1Name }
                </p>
            </div>
        )
    }
}

App.js代码段:

import './App.css';
 import  Counter from './components/Counter'
import CounterTwo from "./components/CounterTwo";
 import CounterOne from "./components/CounterOne";
function App() {
    return (
          <div className="App">
              <Counter/>
              <CounterOne/>
              <CounterTwo/>
          </div>
    )
}

export default App;

index.css代码段:

.div1{
  width:100px;
  height:100px;
  background-color: red;
  margin-left: 100px;
}
.div2{
  width:300px;
  height:100px;
  background-color: blue;
  margin-left: 200px;
  color:white;
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【React的组件&组件间的通信(父向子,子向父,同级组件通信)】 的相关文章

随机推荐

  • rosbag与csv等格式转换

    1 rosbag 转换成csv 参看 https blog csdn net cliukai article details 94554350 具体就是 rostopic echo b
  • Cocos Creator 用JS脚本实现游戏背景的无限滚动

    首先是实现的一个原理 使用2张相同的图片 让它们在脚本中不停的移动 用y值的减少来实现 当有图片离开场景时 给此图片的y重新赋值 相当于位置的重置 在update中无限调用背景移动的函数 我的canvas 位于上方的图片结点名称为BG 下方
  • 迷宫游戏源码

    mainwindow h ifndef MAINWINDOW H define MAINWINDOW H include MAZE h include
  • 【leetcode每日一题】479. 最大回文数乘积

    最大回文数乘积 题目来源 题意 思路 代码 注意 题目来源 点这里 题意 给定一个整数 n 返回可表示为两个 n 位整数乘积的最大回文整数 因为答案可能非常大 所以返回它对 1337 取余 思路 开始刷leetcode每日一题的Day3 我
  • openGL之API学习(四十五)正向渲染和延迟渲染

    如果你是一个游戏开发者 在你使用的图形引擎中或多或少都听说过forward rendering和deferred rendering 通常你必须在你的游戏中选择一种 但它们是什么 彼此之间有什么不同 我们又该如何选择呢 Modern Gra
  • DGA - 研究内容整理

    20200809 引言 DGA算法是一种生成域名的算法 以时间或者一些特定字符串作为种子 然后利用一定的算法 例如加密算法 来生成随机域名的方式 恶意软件的制作者通过这种方式来迷惑安全工作者 传统的恶意软件利用硬编码的方式将CC域名保存在程
  • qt正则表达式类QRegExp

    QRegExp是Qt的正则表达式类Qt中有两个不同类的正则表达式 第一类为元字符 它表示一个或多个常量表达式 令一类为 转义字符 它代表一个特殊字符 一 元字符 匹配任意单个字符 例如 1 3 可能是1 后面跟任意字符 再跟3 匹配字符串首
  • 12对胸椎对应体表标志_「康复基础」脊柱各结构的体表定位方法

    棘突的触抹定位法 1 颈椎 常利用枕外粗隆 C2 C7棘突 来确定颈椎各棘突的位置 枕外粗隆 粗大 任何人均可准确触抹清 沿此向下 有一凹陷 再向下推摸 可触及一骨突 即为C2棘突 C2棘突 较大 末端分叉 瘦弱者低头时可见其隆起于项部的上
  • 只用2GB的内存找出20亿个整数中找到出现次数最多的数

    要求有一个包含20亿个32位整数的文件 从中找到出现次数最多的数 首先先分析一下 32位int类型的数占4B 20亿个4B 约为 8GB 只用2GB肯定不够 所以我们肯定需要将这20亿个数哈希到不同的文件中 由于哈希函数的特性 对于相同的输
  • (已解决)关键词爬取百度搜索结果,返回百度安全验证,网络不给力,请稍后重试,无法请求到正确数据的问题(2023最新)

    已解决 使用关键词进行百度搜索 然后爬取搜索结果 请求数据后 返回的是百度安全验证 网络不给力 请稍后重试 无法请求到正确数据 且尝试在header中增加Accept参数还是不行 一 问题产生的现象 在学习过程中 写了一小段练习用的爬取程序
  • PyQt5 使用 pyinstaller打包文件(speed)

    编写界面 import sys math from PyQt5 QtWidgets import from PyQt5 QtCore import Qt from PyQt5 QtGui import class RightBottomBu
  • Android中引入开源库(Eclipse与Android Studio)

    以GitHub上的SlidingMenu为例 下载地址 jfeinstein10 SlidingMenu 一 Eclipse中引入 1 Import gt Existing Android Code Into Workspace 选择导入文
  • 线程池newCachedThreadPool使用

    1 查看newCachedThreadPool线程池创建方法 创建线程池 Executor cachedThread Executors newFixedThreadPool 1 查看底层实现 public static ExecutorS
  • unity3d 虚拟博物馆_基于Unity3D的虚拟家具展厅设计.docx

    内容摘要 在如今的信息时代 随着虚拟现实技术的不断发展和研究 各式各样的三维情景体验除了应用到文化宣传 如博物馆虚拟展厅等的建立 和教学科技体验 还在商业运营中的宣传部分具有了很大的发展空间 建立虚拟的商业产品展厅作为当今宣传手段的重要部分
  • EXCEL合并所有表格到一个表格中【VB代码】亲测可用!!!

    1 新建sheet表格 2 右击 查看代码 3 复制如下代码 Sub 合并当前工作簿下的所有工作表 Application ScreenUpdating False For j 1 To Sheets Count If Sheets j N
  • 【Arma3脚本教程】一、基本介绍

    目录 基本介绍 1 前言 2 编辑环境 3 第一行代码 4 地图文件夹 5 基本语法解释 6 记笔记 基本介绍 1 前言 想必看到此文章的人想要学习Arma3的地图编辑 不过国内很少有人研究这个 即使会的也不是专业程序员 即使是专业程序员
  • Sql一对多关联

    1 查询名人表中性别是男的作者 2 查看静夜思的作者 3 查询李白和杜甫的年纪 4 查询名人表中的男女人数 5 查询白居易写的作品名称和名句 6 查看年纪在25到30之间的个数 7 查询名人表中最后的两条数据 8 查询李白的作品名称 名言
  • 神经网络 02(激活函数)

    一 激活函数 在神经元中引入了激活函数 它的本质是向神经网络中引入非线性因素的 通过激活函数 神经网络就可以拟合各种曲线 如果不用激活函数 每一层输出都是上层输入的线性函数 无论神经网络有多少层 输出都是输入的线性组合 引入非线性函数作为激
  • 若依分离版4-docker安装redis

    docker安装redis 拉取镜像 docker pull redis 新建配置文件目录 mkdir p data redis data data redis redis conf 在配置文件写入基础配置和密码 cd data redis
  • 【React的组件&组件间的通信(父向子,子向父,同级组件通信)】

    目录 一 React项目的入口文件 create react app 二 React的组件 1 什么是组件 2 组件的分类 3 组件间的通信 一 React项目的入口文件 create react app React项目的入口文件 crea