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)
学而不思则罔,思而不学则殆!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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时遇到的坑🕳