当前位置: 首页 > news >正文

React18组件通信与插槽

1、为DOM组件设置Props

在react中jsx中的标签属性被称为Props

DOM组件的类属性,为了防止与js中的class属性冲突改成了className

DOM组件的style属性

import image from "./logo.svg";
function App() {const imgStyleObj = {width: 200,height: 200,};return (<div><img src={image} alt="" className="" style={imgStyleObj} /></div>);
}export default App;

JSX的展开语法

import image from "./logo.svg";
function App() {const imgData = {className: "small",style: {width: 200,height: 200,},};return (<div><img src={image} alt="" {...imgData} /></div>);
}export default App;

效果是一样的

2、为React组件设置Props

操作步骤:

1、请求功能所需的数据(例如文章信息)

2、创建Article组件

3、将文章的数据分别传递给Article

在react组件中展开Props的使用场景

function Detail() {return (<><p>{content}</p><p>状态:{active ? "显示中" : "已隐藏"}</p></>);
}
function Article({ title, content, active }) {return (<><h3>{title}</h3><Detail /></>);
}
function App() {const articleData = {title: "标题1",detailData: {content: "内容1",active: true,},};return (<><Article {...articleData} /></>);
}export default App;

3、将JSX作为Props传递(组件插槽)

function List({ children, title, footer = <div>默认底部内容</div> }) {return (<><h2>{title}</h2><ul>{children}</ul>{footer}</>);
}function App() {return (<><List title="列表1" footer={<p>这是底部内容1</p>}><li>列表项1</li><li>列表项2</li><li>列表项3</li></List><List title="列表2" footer={<p>这是底部内容2</p>}><li>列表项A</li><li>列表项B</li><li>列表项C</li></List><List title="列表3"><li>列表项X</li><li>列表项Y</li><li>列表项Z</li></List></>);
}export default App;

4、子组件向父组件传值

import { useState } from "react";
function Detail({ onActive }) {const [status, setStatus] = useState(false);function handleClick() {setStatus(!status);onActive(status);}return (<div><button onClick={handleClick}>按钮</button><p style={{ display: status ? "block" : "none" }}>Detail的内容</p></div>);
}function App() {function handleActive(status) {console.log(status);}return (<><Detail onActive={handleActive} /></>);
}export default App;

5、使用Context进行多级组件传值

import { createContext, useContext } from "react";
function Section({ children }) {const level = useContext(LevelContext);return (<><section className="section"><LevelContext.Provider value={level + 1}>{children}</LevelContext.Provider></section></>);
}
function Heading({ level, children }) {switch (level) {case 1:return <h1>{children}</h1>;case 2:return <h2>{children}</h2>;case 3:return <h3>{children}</h3>;case 4:return <h4>{children}</h4>;case 5:return <h5>{children}</h5>;case 6:return <h6>{children}</h6>;default:throw new Error("未知的level" + level);}
}
const LevelContext = createContext(0);
function App() {return (<div><Section><Heading level={1}>主标题</Heading><Section><Heading level={2}>副标题</Heading><Heading level={2}>副标题</Heading><Heading level={2}>副标题</Heading><Section><Heading level={3}>子标题</Heading><Heading level={3}>子标题</Heading><Heading level={3}>子标题</Heading><Section><Heading level={4}>子标题</Heading><Heading level={4}>子标题</Heading><Heading level={4}>子标题</Heading></Section></Section></Section></Section></div>);
}export default App;

相关文章:

  • 图论之幻想迷宫
  • dstack 是 Kubernetes 和 Slurm 的开源替代方案,旨在简化 ML 团队跨顶级云、本地集群和加速器的 GPU 分配和 AI 工作负载编排
  • Linux常用命令29——delgroup删除组
  • AI Agent开发第48课-DIFY中利用AI动态判断下一步流程-DIFY调用API、REDIS、LLM
  • 卷积神经网络进化史:从LeNet-5到现代架构的完整发展脉络
  • langfuse本地安装
  • SCAU18124--N皇后问题
  • 使用xlwings将excel表中将无规律的文本型数字批量转化成真正的数字
  • C++ 循环语句`while`、`for` 与 `do…while`(六十七)
  • C# 操作符
  • 多协议 Tracker 系统架构与传感融合实战 第五章 卡尔曼滤波定位算法实战
  • 计算机网络八股文--day4 --传输层TCP与UDP
  • k8s 探针
  • TFT(薄膜晶体管)和LCD(液晶显示器)区别
  • Socket 编程 UDP
  • 基于LangChain 实现 Advanced RAG-后检索优化(下)-上下文压缩与过滤
  • 基于Springboot高校网上缴费综合务系统【附源码】
  • SpringSecurity配置(权限认证)
  • redis延时队列详细介绍
  • 计算机基础:二进制基础17,八进制减法
  • 欧洲观察室|欧盟对华战略或在中欧建交50年时“低开高走”
  • 去年上海全市博物馆接待观众约4087万人次,同比增31.9%
  • 国际金价下跌,中概股多数上涨,穆迪下调美国主权信用评级
  • 马上评|训斥打骂女儿致死,无暴力应是“管教”底线
  • 侵害孩子者,必严惩不贷!3名性侵害未成年人罪犯今日执行死刑
  • 年在沪纳税350亿人民币,这些全球头部企业表示“对上海承诺不会变”