5.6 react组件化开发基础

react 组件开发基础

  • 组件分类与组件使用

  • 组件传参

    • 父传子 【函数数据传值 实参 形参对应关系】

    • 子传父

    • 插槽

    • 透传 useContext 上下文(作用域)

    • 跨层级调用方法 通过子组件的实例对象useRef 直接调用子组件的方法 和数据

  • 状态管理(非常多) useReducer

    • redux

    • redux-toolkit 最佳实践

    • mobx

    • dva

  • 路由 react-router-dom

    • 配置式 路由 router.jsx

    • 将路由的代码 直接写入到 父组件里面

  • UI 库 :antd 管理系统 antd mobile 移动端 app nutUi+taro 小程序

1.组件分类与组件使用

组件分类:

​ 页面级组件

​ 业务组件

​ 公共组件

组件使用步骤: 1创 2导 3使用 4传值、

组件名: 必须使用大驼峰

  • 父组件

  ​import React from 'react'// 导入import AppHeader from '@/components/appHeader/AppHeader'export default function App() {return (<><AppHeader/><AppHeader> </AppHeader></>)}​
  • 子组件

  import React from 'react'import './index.less'export default function AppHeader() {return (<div>AppHeader</div>)}​

2.组件通信【单向数据流】

1.父传子 子传父

react 的组件就是一个普通函数

父传子

组件使用: 父函数 调用 子函数

父组件 写入实参

子组件 通过形参接受数据

  • 父组件

父组件 写入实参: 通过 静态属性 或动态属性 传递

  import Child from '@/components/child/Child'​export default ()=>{return (<Child title="我是爸爸传递的数据" num={1000}   obj={name="张麻子"}> </Child>)}​​
  • 子组件

子组件通过形参 props 全部一次性接收父组件传递的数据

  export default (props)=>{let {num,title,obj} = props;if(typeof num !='Number'){return 'num的数据格式错误'}if(Object.prototype.toString.call(obj) !='[object Object]'){return 'obj数据格式错误!'}return (<><div>我是儿子组件</div>{props.num}{obj.name}</>)}

2.子传父

将父组件的方法 传递给子组件

子组件调用这个方法 直接修改父组件的数据

  • 父组件

  import Child from '@/components/child/Child'​export default ()=>{const [num,setNum] = useState(1000)const changeNum=(newNum)=>{setNum(newNum)}return (<Child title="我是爸爸传递的数据" num={num} changeNum={changeNum}   obj={name="张麻子"}> </Child>)}
  • 子组件

  ​export default (props)=>{const {num,title,obj,changeNum} = props;return (<><div>我是儿子组件</div>{props.num}{obj.name}  ​<button οnclick={()=>changeNum(num+1) > +++</button></>)

3.插槽

父组件 将 html 代码 传递给子组件

父组件 传递给子组件的html代码 全部会自动的 放到 props.children

props.children 值

如果父组件没有传递html代码 ,children 的值 是 undefined

如果父组件只传递了 一行html代码 ,children 的值 就是一个对象(描述传递过来的html jsx )

如果父组件传递了 多行html代码,children的值 就是 一个数组(包含多个对象)

  • 父组件

  <h1>我是爸爸组件的html代码</h1><hr /><Son ><div>我是爸爸组件传递给儿子组件的 html代码</div><table><thead><tr><th>姓名</th><th>年龄</th><th>成绩</th></tr></thead><tbody><tr><td>嘻嘻嘻</td><td>22</td><td>88</td></tr></tbody></table></Son>
  • 子组件

  import React from 'react'​export default function Son(props) {const {children} = propsreturn (<>      {children[1]}<h1>我是儿子组件自己的html代码</h1>{children[0]}</>)}​

4.透传 useContext createContext 上下文(作用域)

爷爷组件 可以直接传递数据 给孙子组件

跨层级 不限制

vue2 $bus eventBus 中央事件总线

  • 爷爷组件

商品信息 传递 --商品列表 Goods.jsx

  import {createContext,useState} from 'react'import Info from '@/components/info/Info'//在顶级组件 暴露之前必须定义好 上下文export const GoodsContext = createContext(null);​export default  ()=>{const [goodsInfo,setGoodsInfo] = useState({id:1122,title:'华为收集 mate6',price:5000})const changeGoodsInfo = ()=>{let goods = {...goodsInfo}goods.price++setGoodsInfo(goods)}return (<><GoodsContext.Provider value={goodsInfo}><Info /></GoodsContext.Provider>​<button onClick={changeGoodsInfo}>+</button></>)}​
  • 爸爸组件 Info.jsx

商品详情组件

  import Order from '@/components/order/Order'export default ()=>{return (<><div>爸爸组件自己的内容</div><Order /></>)}
  • 孙子组件 Order.jsx

下单组件

  import {useContext} from 'react'import {GoodsContext} from '@/App2'export default ()=>{const goodsInfo =  useContext(GoodsContext)return (<><div> 价格:{goodsInfo.price} </div></>)}

5.子组件的实例对象useRef useImperativeHandle

父组件 需要拿子组件的数据

  • 父组件

  import Son1 from '@/components/son1/Son1'import {useRef,useEffect} from 'react'export default ()=>{const sonRef = useRef(null);useEffect(()=>{let res =  sonRef.current.getData()console.log(res);},[])return (<><div >爸爸组件自己的内容</div><Son1 ref={sonRef} /></>)}
  • 子组件

useImperativeHandle : 通过hoos 将子组件 想要暴露给 父组件的 方法和数据 暴露出去

  import {useState,useImperativeHandle} from 'react'​export default ({ref})=>{const [num,setNum] = useState(100)const getData = ()=>{return '我是子组件的方法,获取数据的方法'}const changeNum = ()=>{setNum(num+1)}//  需要子组件通脱useImperativeHandle(ref,()=>{return {num,getData,} })​return (<><div> 价格:{num} </div><button onClick={changeNum}>+ </button></>)}
  • localStorage sessionStorage

6.路由 react-router v7

react 19 ===router v7

react16.8--react 18 ====router v6

react13-react16.8 ===reouterv5

1.创 2配 router.jsx 3.占位 4.测试

  • 安装

  pnpm install react-router 
  • 创建页面

  • router/index.jsx

  import {createBrowserRouter} from "react-router";import Home from '@/pages/home/Home'import Coding from '@/pages/coding/Coding'import Pins from '@/pages/pins/Pins'import Course from '@/pages/course/Course'import App from '@/App.jsx'import Following from '@/pages/following/Following'import Frontend from "@/pages/frontend/Frontend";const router = createBrowserRouter([{path:'/',Component:App,children:[{Component:Home,children:[{index:true,Component:Following},{path:'frontend',Component:Frontend},]},{path: "coding",Component:Coding},{path: "pins",Component:Pins},{path: "course",Component:Course}]}]);​export default router
  • main.jsx

  ​import { createRoot } from 'react-dom/client'import './index.css'​import { RouterProvider} from "react-router";import router from './router'​createRoot(document.getElementById('root')).render(<RouterProvider router={router}> </RouterProvider>)​
  • 占位

App.jsx 给所有一级路由占位

  import React from 'react'import { Outlet } from 'react-router'export default function App() {return (<><div>我是顶部</div><Outlet/></>​)}​

Home.jsx 给 home子页面占位

  import React from 'react'import { Outlet } from 'react-router'export default function Home() {return (<><div className="left">左侧菜单</div><div className="content"><Outlet></Outlet></div><div className="toplist">排行榜</div></>)}​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SF顺丰】顺丰开放平台API对接(Java对接篇)

对接前置篇&#xff1a; 【SF顺丰】顺丰开放平台API对接&#xff08;注册、API测试篇&#xff09;_顺丰api接口对接指南-CSDN博客 1.实现效果展示 2.SF顺丰开放平台&#xff0c;JDK资源下载。 下载地址&#xff1a;顺丰开放平台 3.将下载的JDK放入项目中。 4.将JDK资源引入p…

我用cursor 搭建了临时邮箱服务-Temp Mail 365

用业余时间搭建了一个临时邮箱&#xff0c;对于后端程序员出身的我&#xff0c;对前端了解的不太多&#xff0c;有了cursor的帮助&#xff0c;补齐了自己的短板&#xff0c;搭建了这个服务&#xff0c;下面对临时邮箱架构设计与安全性做一个分析。 https://temp-mail-365.com 临…

破解工业3D可视化困局,HOOPS Visualize助力高效跨平台协作与交互!

一、当前3D可视化面临的痛点 &#xff08;1&#xff09;性能瓶颈 现有的许多3D可视化工具在处理大型复杂模型时往往力不从心。例如在航空航天、汽车制造等高端制造业&#xff0c;动辄涉及数以亿计的三角面片和海量的纹理细节。这些超大规模的模型在渲染时常常出现卡顿、延迟&…

1、Kafka与消息队列核心原理详解

消息队列&#xff08;Message Queue, MQ&#xff09;作为现代分布式系统的基础组件&#xff0c;极大提升了系统的解耦、异步处理和削峰能力。本文以Kafka为例&#xff0c;系统梳理消息队列的核心原理、架构细节及实际应用。 Kafka 基础架构及术语关系图 术语简要说明 Produce…

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛初赛-wp

- -考试当场没做出来 后面做的 misc ❯ cd misc ❯ ls num.docx num.zip ❯ unzip num.docx Archive: num.docxinflating: [Content_Types].xmlinflating: _rels/.relsinflating: word/document.xmlinflating: word/_rels/document.xml.relsextracting: word/media/image1.jp…

JavaScript 到命令和控制 (C2) 服务器恶意软件分析及防御

攻击始于一个经过混淆的JavaScript文件,该文件从开源服务中获取编码字符串以执行PowerShell脚本。然后,该脚本从一个IP地址和一个URL缩短器下载一个JPG图像和一个文本文件,这两个文件都包含使用隐写术嵌入的恶意MZ DOS可执行文件。这些有效载荷一旦执行,就会部署Stealer恶意…

【计网】ipconfig、ping、arp、tracert

目录 ipconfig ping arp tracert cmd ipconfig ipcofig -all IPv4 物理地址 ping 检测网络连通情况&#xff0c;分析网络速度 根据域名得到服务器IP 根据TTL判断对方所使用的操作系统以及数据包经过路由器数量 byte数据包大小 time响应时间 TTLDNS记录在DNS服务器上存在…

WiFi那些事儿(八)——802.11n

目录 802.11n 技术简介与测试项 一、802.11n 技术简介 &#xff08;一&#xff09;标准概述 &#xff08;二&#xff09;关键技术特性 1. MIMO&#xff08;多输入多输出&#xff09;技术 2. 信道绑定&#xff08;Channel Bonding&#xff09; 3. 帧聚合&#xff08;Fram…

码蹄集——直角坐标到极坐标的转换、射线、线段

目录 MT1052 直角坐标到极坐标的转换 MT1066 射线 MT1067 线段 MT1052 直角坐标到极坐标的转换 思路&#xff1a; arctan()在c中是atan()&#xff0c;结果是弧度要转换为度&#xff0c;即乘与180/PI 拓展&#xff1a;cos()、sin()在c代码中表示方式不变 #include<bits/…

深入解析 Linux/Unix 通信机制:从原理到观测实践

深入解析 Linux/Unix 通信机制&#xff1a;从原理到观测实践 配图建议&#xff1a;Linux系统架构与通信机制全景示意图 一、开篇&#xff1a;理解“一切皆文件”的哲学 Unix/Linux 操作系统的核心灵魂在于其独特的设计哲学。当 Dennis Ritchie 和 Ken Thompson 在贝尔实验室开…

spring上传文件添加水印

1、实现 MultipartFile package com.pojo.common.core.domain;import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream;import org.springframework.lang.Nullable; import org.springframework.util.Assert; im…

嵌入式MCU语音识别算法及实现方案

在嵌入式MCU&#xff08;微控制器单元&#xff09;中实现语音识别&#xff0c;由于资源限制&#xff08;如处理能力、内存、功耗等&#xff09;&#xff0c;通常需要轻量级算法和优化技术。以下是常见的语音识别算法及实现方案&#xff1a; 一、传统语音识别算法 动态时间规整&…

【论文阅读】DETR+Deformable DETR

可变形注意力是目前transformer结构中经常使用的一种注意力机制&#xff0c;最近补了一下这类注意力的论文&#xff0c;提出可变形注意力的论文叫Deformable DETR&#xff0c;是在DETR的基础上进行的改进&#xff0c;所以顺带着把原本的DETR也看了一下。 一、DETR DETR本身是…

大模型在宫颈癌诊疗全流程预测与应用研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型预测宫颈癌术前风险 2.1 术前数据收集与预处理 2.2 预测模型构建与算法选择 2.3 术前风险预测指标与案例分析 三、大模型辅助制定术中方案 3.1 术中风险动态监测与预测 3.2 基于预测的手术方案优化…

【Python 文件I/O】

Python 的文件 I/O 操作是数据处理的基础技能&#xff0c;涉及文件的读写、路径管理、异常处理等核心功能。以下是文件 I/O 的核心知识点&#xff1a; 一、基础文件操作 1. 打开文件 # 通用模式&#xff1a;r(读)/w(写)/a(追加) b(二进制)/t(文本&#xff0c;默认) f open(…

Twin Builder 中的电池等效电路模型仿真

电池单元热设计挑战 电池热管理的主要挑战之一是确保温度低于最大工作限值。较高的温度会导致效率降低、加速老化和潜在的安全隐患。工程师必须了解电池产生的热量&#xff0c;才能充分设计冷却系统。 了解和预测电池模块的热行为需要将电池的热损耗与电池单元的电气机械特性…

一种基于条件生成对抗网络(cGAN)的CT重建算法

简介 简介:该文提出了一种基于条件生成对抗网络(cGAN)的CT重建算法,通过引入CBAM注意力机制增强网络对关键特征的提取能力,有效解决了CT成像中因噪声干扰导致的重建精度下降问题。实验采用固体火箭发动机模拟件数据集,将正弦图分为五组并添加不同程度的噪声进行训练。结…

【Redis篇】linux 7.6安装单机Redis7.0(参数优化详解)

&#x1f4ab;《博主主页》&#xff1a; &#x1f50e; CSDN主页 &#x1f50e; IF Club社区主页 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(MongoDB)有了…

【BUG】‘DetDataSample‘ object has no attribute ‘_gt_sem_seg‘

问题&#xff1a; 使用mmdetection框架使用COCO格式训练自定义数据集时&#xff0c;其中模型使用HTC模型时出现如下问题&#xff1a; AttributeError: ‘DetDataSample’ object has no attribute ‘_gt_sem_seg’. Did you mean: ‘gt_sem_seg’? results self(**data, mode…

Java日期格式化方法总结

在Java中&#xff0c;日期格式化主要涉及将 Date、LocalDate、LocalDateTime 等日期时间对象转换为指定格式的字符串&#xff0c;或将字符串解析为日期对象。以下是两种常用的日期格式化方式&#xff1a; 一、使用 SimpleDateFormat&#xff08;旧版API&#xff0c;Java 8之前&…