React组件通信

import React, { Component } from 'react'
import ReactDOM from 'react-dom/client'
import { nanoid } from 'nanoid'
import Husband from './components/Husband'
import Wife from './components/Wife'
// 【组件通信】
const root = ReactDOM.createRoot(document.getElementById('root'))
// props的基本使用
// 本质: 组件标签身上的所有属性,组成一个对象
// 1. 类组件中获取props
// 2. 函数式组件中获取props
// function Header (props) {}
// 🔥 函数式组件,通过形参获取props对象
// 🍀 推荐写法 - 对props进行对象结构,需要什么就使用什么
function Header({ name, intro }) {
return (
<>
<h1>
Header Component - {name} - {intro}
</h1>
</>
)
}
// 🍅 类组件中:通过this.props获取props对象
class Child extends React.Component {
render() {
const { name, intro } = this.props
return (
<>
<div>
Child Component - {name} - {intro}
</div>
</>
)
}
}
// 类组件: this.props
// 函数:形式参数
// 结构
// props: 对象,组件标签身上的所有属性组成的对象
class MyApp01 extends React.Component {
render() {
return (
<>
<div>
<Header name="大庆★俱乐部" intro="青笺画卿颜^" />
<Child name=" HeRo丨噬魂丶" intro="倾城沈蜜^" />
</div>
</>
)
}
}
// props的两大特点 - 任意数据类型
// 1. props可以传递任意数据类型
// 2. props是只读的,单项数据流
function FooterCom({ fn, element }) {
console.log('element => ', element)
return (
<div>
<h1>Footer 《===》 Footer</h1>
<button onClick={fn}>Click me !</button>
{element}
</div>
)
}
function HeaderCom({ name, age, isShow, list, child }) {
console.log('child => ', child)
return (
<>
<div>
<h1>
Header - {name} - {age}
{String(isShow)}
</h1>
<h2>
{list.map((item) => {
return <i key={nanoid()}>{item}</i>
})}
</h2>
<h3>
{child.name} ---- {child.age}
</h3>
</div>
</>
)
}
class MyApp02 extends React.Component {
render() {
return (
<>
<div>
<HeaderCom
// 基本数据类型
isShow={true}
un={undefined}
nu={null}
name="ChinaUs_破冰"
age={19}
// 对象和数组
list={[1, 2, 3]}
child={{ name: 'wangzz', age: 24 }}
/>
<FooterCom
// 传递函数
fn={() => {
console.log('Footer: ◎City,?')
}}
// 传递插槽
element={<i>I miss yt but she doesn't want me, so I back!!!</i>}
/>
</div>
</>
)
}
}
// 组件通信 - props的两大特点 - 单项数据流
// 1. props可以传递任意数据类型:💥函数 💥JSX
// 2. props是只读的,单项数据流
class MyApp03 extends React.Component {
render() {
return (
<>
<div>
<FooterComponent
fn={() => {
console.log('we are the world')
}}
element={<i>单项数据流</i>}
name="wangzz - HelloWorld"
list={[1, 2, 3]}
></FooterComponent>
</div>
</>
)
}
}
function FooterComponent(props) {
return (
<>
<div>
<h1>Footer - {props.name}</h1>
{props.list.map((item) => (
<i key={nanoid()}>{item}</i>
))}
<button
onClick={() => {
// 🔥 props是只读的,单项数据流,比vue的单项数据流更加严格
// 这里无法修改list 因为 list是从父组件传递过来的数据
props.list.push(4)
}}
>
push + 4
</button>
<button onClick={props.fn}>触发父组件传递的函数</button>
</div>
</>
)
}
// 组件通信 ===》 【父传子】
class Parent extends React.Component {
state = {
money: 1000,
}
handleMakeMoney = () => {
this.setState({
money: 1000 + this.state.money,
})
}
render() {
return (
<>
<div>
<h1>{this.state.money}</h1>
<button onClick={this.handleMakeMoney}>你爹开始赚钱了👳🏻‍♂️</button>
<ChildCom
// props传数据
money={this.state.money}
></ChildCom>
</div>
</>
)
}
}
class ChildCom extends React.Component {
render() {
return (
<>
<div>
<h1>💴 money: {this.props.money}</h1>
</div>
</>
)
}
}
// 【组件通信 - 子传父】 - 子组件花掉父组件的钱
// 1. 父组件内 定义一个花钱的函数
// 2. 🔥通过props, 父传子回调函数
// 3. 🔥子组件内容,通过props调用回调函数
// 4. 🔥父组件完成花钱的计算
class ChildMoneyCom extends React.Component {
render() {
return (
<>
<div>
<h1>爸爸给我钱了:{this.props.money}</h1>
<button
onClick={() => {
// 💥子组件内,通过props,调用回调函数
this.props.handleCost(8000)
}}
>
点击我,儿子要花爹的钱了
</button>
</div>
</>
)
}
}
class ParentMoneyCom extends React.Component {
state = {
money: 1000,
}
handleMakeMoney = () => {
this.setState({
money: 1000 + this.state.money,
})
}
// 父组件内部定义一个花钱的函数
handleCost = (num) => {
// 父组件完成花钱的计算
this.setState({
money: this.state.money - num,
})
}
render() {
return (
<>
<div>
<h1>{this.state.money}</h1>
<button onClick={this.handleMakeMoney}>你爹开始赚钱了!👳🏻‍♂️</button>
<ChildMoneyCom
// 通过props,父传递子回调函数
handleCost={this.handleCost}
money={this.state.money}
></ChildMoneyCom>
</div>
</>
)
}
}
class StateCouncil extends React.Component {
constructor(props) {
super(props)
this.state = {
exchequer: 123101, // 国库里的钱(单位:万亿美元💵)
}
}
// 收税了
collectTaxes = () => {
this.setState({
exchequer: this.state.exchequer + parseInt(Math.random() * 100000),
})
}
// 分配财富 地方请求转移支付
transferTreasure = (amount) => {
console.log('amount: ', amount)
this.setState({
exchequer: this.state.exchequer - amount,
})
console.log(this.state.exchequer)
}
render() {
return (
<>
<div>
<ProvincialGovernment
exchequer={this.state.exchequer}
transferTreasure={this.transferTreasure}
collectTaxes={this.collectTaxes}
/>
</div>
</>
)
}
}
class ProvincialGovernment extends React.Component {
constructor(props) {
super(props)
}
render() {
return (
<>
<div>
<span>余额:{this.props.exchequer}</span>
<button
onClick={() => {
this.props.transferTreasure(300)
}}
>
请求支付
</button>
<button onClick={this.props.collectTaxes}>交税</button>
</div>
</>
)
}
}
// 【兄弟组件 - 状态提升】
// 1. 将需要共享的数据,提升到共同的父组件中
// 2. 通过父传子,子传父间接的共享数据
class Family extends React.Component {
constructor(props) {
super(props)
this.state = {
money: 0,
}
}
// 赚钱方法,提升到父组件中
handleMakeMoney = () => {
this.setState({
money: this.state.money + 1000,
})
}
// 父组件定义花钱的函数
handleCostMoney = () => {
this.setState({
money: this.state.money - 5000,
})
}
render() {
return (
<>
<div>
<h1 style={{ textAlign: 'center' }}>家庭存款:</h1>
<Husband
// 父传子money
money={this.state.money}
// 传递回调函数
handleMakeMoney={this.handleMakeMoney}
/>
<Wife handleCostMoeny={this.handleCostMoney} />
</div>
</>
)
}
}
const divNode = (
<div>
<Family />
</div>
)
root.render(divNode)
posted @   Felix_Openmind  阅读(15)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
历史上的今天:
2021-03-21 SpringBoot集成Thymeleaf时遇到的坑&#128371;
*{cursor: url(https://files-cdn.cnblogs.com/files/morango/fish-cursor.ico),auto;}
点击右上角即可分享
微信分享提示