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

学习React官方文档(描述UI)

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🎨100个小功能 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒Three.js
🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

文章目录

    • 创建 React 项目
    • 我的第一个组件
    • 使用 JSX 书写标签语言
    • 在 JSX 中通过大括号使用 JavaScript
    • 将 Props 传递给组件
    • 条件渲染
    • 渲染列表
    • 保持组件纯粹
    • 将 UI 视为树
    • 总结

创建 React 项目

GitHub提交记录

我们可以使用 vite 构建工具创建 react 项目。

npm create vite@latest my-app -- --template reactcd my-appnpm installnpm run dev

访问:http://localhost:5173/ 网址,即可得到如下页面。

在这里插入图片描述

我的第一个组件

GitHub提交记录

几个注意事项:

  • React 组件是常规的 JavaScript 函数,但组件的名称必须以大写字母开头,否则它们将无法运行!
  • 没有括号包裹的话,任何在 return 下一行的代码都将被忽略!
  • 组件可以渲染其他组件,但是不要嵌套他们的定义,不然代码会非常慢,并且会导致 bug 产生。应该在顶层定义每个组件,当子组件需要使用父组件的数据时,需要通过 props 的形式进行传递,而不是嵌套定义。

添加 src/Profile.jsx 文件。

export default function Profile() {return (<><p>伟大的科学家</p><imgsrc="https://i.imgur.com/MK3eW3Am.jpg"alt="Katherine Johnson"/></>)
}

把 Profile.jsx 放入 App.jsx。

import './App.css'
import Profile from './Profile'function App() {return (<><Profile /></>)
}export default App

在这里插入图片描述


使用 JSX 书写标签语言

GitHub提交记录

JSX 是 JavaScript 语法扩展,可以让你在 JavaScript 文件中书写类似 HTML 的标签。

规则:

  • 只能返回一个根对象
  • 标签必须闭合
  • 使用驼峰式命名法给 所有 大部分属性命名

创建 src/TodoList.jsx 文件,若不想在标签中增加一个额外的 <div>,可以用 <></> 元素来代替。这个空标签被称作 Fragment。React Fragment 允许你将子元素分组,而不会在 HTML 结构中添加额外节点。

为什么多个 JSX 标签需要被一个父元素包裹?

答:JSX 虽然看起来很像 HTML,但在底层其实被转化为了 JavaScript 对象,你不能在一个函数中返回多个对象,除非用一个数组把他们包装起来。这就是为什么多个 JSX 标签必须要用一个父元素或者 Fragment 来包裹。

为什么要使用驼峰命名?

答:JSX 最终会被转化为 JavaScript,而 JSX 中的属性也会变成 JavaScript 对象中的键值对。在你自己的组件中,经常会遇到需要用变量的方式读取这些属性的时候。但 JavaScript 对变量的命名有限制。例如,变量名称不能包含 - 符号或者像 class 这样的保留字。

export default function TodoList() {return (<><h1>海蒂·拉玛的待办事项</h1><img src="https://i.imgur.com/yXOvdOSs.jpg" alt="Hedy Lamarr" className="photo"style={{ width: '200px', borderRadius: '10px' }}/><ul><li>发明一种新式交通信号灯</li><li>排练一个电影场景</li><li>改进频谱技术</li></ul></>);
}

在这里插入图片描述


在 JSX 中通过大括号使用 JavaScript

GitHub提交记录

JSX 允许你在 JavaScript 中编写类似 HTML 的标签,从而使渲染的逻辑和内容可以写在一起。

在 JSX 中使用 JavaScript 很简单,只需要使用 {} 包裹着即可。有时我们会在 JSX 中看到 {{}},其实它只不过是 包在大括号里的一个对象 罢了。

下面我们尝试在 TodoList.jsx 中通过 {} 使用 JavaScript。

export default function TodoList() {const person = {name: "海蒂·拉玛",avatar: "https://i.imgur.com/yXOvdOSs.jpg",theme: {backgroundColor: "orange",color: "white",borderRadius: "10px",padding: "10px",},todolist: ["发明一种新式交通信号灯", "排练一个电影场景", "改进频谱技术"],};return (<div style={person.theme}><h1>{person.name}的待办事项</h1><imgsrc={person.avatar}alt="Hedy Lamarr"className="photo"style={{ width: "200px", borderRadius: "10px" }}/><ul><li>{person.todolist[0]}</li><li>{person.todolist[1]}</li><li>{person.todolist[2]}</li></ul></div>);
}

在这里插入图片描述


将 Props 传递给组件

GitHub提交记录

React 组件使用 props 来互相通信。每个父组件都可以提供 props 给它的子组件,从而将一些信息传递给它。

将父组件的信息传递给子组件非常的简单,只需要在父组件中定义需要传递的内容,然后在子组件中 通过参数接受 即可。

我们修改 src/Profile.jsx 文件。

import { getImageUrl } from "./utils";function Avatar({ person, size }) {const defaultStyle = {borderRadius: "50%",padding: "5px",};return (<><imgstyle={defaultStyle}className="avatar"src={getImageUrl(person)}alt={person.name}width={size}height={size}/></>);
}export default function Profile() {return (<div><Avatarsize={100}person={{name: "Katsuko Saruhashi",imageId: "YfeOqp2",}}/><Avatarsize={80}person={{name: "Aklilu Lemma",imageId: "OKS67lh",}}/><Avatarsize={50}person={{name: "Lin Lanying",imageId: "1bX5QH6",}}/></div>);
}

创建 src/utils.js 文件,里面编写工具类函数。

export function getImageUrl(person) {return "https://i.imgur.com/" + person.imageId + ".jpg";
}

在这里插入图片描述

GitHub提交记录

将内容嵌套在 JSX 标签中时,父组件将在名为 children 的 prop 中接收到该内容。例如,下面的 Card 组件将接收一个被设为 <Avatar /> 的 children prop 并将其包裹在 div 中渲染。

创建 src/Avatar.jsx 文件,放置头像。

import { getImageUrl } from "./utils";export default function Avatar({ person, size }) {const defaultStyle = {borderRadius: "50%",padding: "5px",};return (<imgstyle={defaultStyle}className="avatar"src={getImageUrl(person)}alt={person.name}width={size}height={size}/>);
}

修改 src/Profile.jsx 文件,添加 Card 方法,注意参数传递了 children,且在返回值中的 {children}

import Avatar from "./Avatar";function Card({ children }) {const cardStyle = {padding: "20px",borderRadius: "10px",boxShadow: "0 4px 8px rgba(0, 0, 0, 0.1)",backgroundColor: "#fff",};return <div style={cardStyle}>{children}</div>;
}export default function Profile() {return (<Card><Avatarsize={100}person={{name: "Katsuko Saruhashi",imageId: "YfeOqp2",}}/><Avatarsize={80}person={{name: "Aklilu Lemma",imageId: "OKS67lh",}}/><Avatarsize={50}person={{name: "Lin Lanying",imageId: "1bX5QH6",}}/></Card>);
}

在这里插入图片描述


条件渲染

GitHub提交记录

在 React 中,你可以通过使用 JavaScript 的 if 语句、&& 和 ? : 运算符来选择性地渲染 JSX。

创建 PackingList.jsx 文件,通过判断控制哪些事情已经完成。

function Item({ name, isPacked }) {let itemContent = name;if (isPacked) {itemContent = <del>{name + " ✅"}</del>;}return <li className="item">{itemContent}</li>;
}export default function PackingList() {return (<section><h1>Sally Ride 的行李清单</h1><ul><Item isPacked={true} name="宇航服" /><Item isPacked={true} name="带金箔的头盔" /><Item isPacked={false} name="Tam 的照片" /></ul></section>);
}

在这里插入图片描述


渲染列表

GitHub提交记录

从数组中过滤并渲染数据。

创建 src/data.js 文件,存放数组信息。

export const people = [{id: 0,name: "凯瑟琳·约翰逊",profession: "数学家",accomplishment: "太空飞行相关数值的核算",imageId: "MK3eW3A",},{id: 1,name: "马里奥·莫利纳",profession: "化学家",accomplishment: "北极臭氧空洞的发现",imageId: "mynHUSa",},{id: 2,name: "穆罕默德·阿卜杜勒·萨拉姆",profession: "物理学家",accomplishment: "关于基本粒子间弱相互作用和电磁相互作用的统一理论",imageId: "bE7W1ji",},{id: 3,name: "珀西·莱温·朱利亚",profession: "化学家",accomplishment: "开创性的可的松药物、类固醇和避孕药的研究",imageId: "IOjWm71",},{id: 4,name: "苏布拉马尼扬·钱德拉塞卡",profession: "天体物理学家",accomplishment: "白矮星质量计算",imageId: "lrWQx8l",},
];

创建 RenderList.jsx 文件,使用 filtermap,过滤并展示出化学家的相关信息。注意给数组里面的每一项都指定一个 key,进行唯一标识。

import { getImageUrl } from "./utils";
import { people } from "./data.js";export default function List() {const avatarStyle = {borderRadius: "50%",height: "100px",width: "100px",};const chemists = people.filter((person) => person.profession === "化学家");const listItems = chemists.map((person) => (<li key={person.id}><img style={avatarStyle} src={getImageUrl(person)} alt={person.name} /><p><b>{person.name}:</b>{" " + person.profession + " "}{person.accomplishment} 而闻名全世界!</p></li>));return <ul>{listItems}</ul>;
}

在这里插入图片描述


保持组件纯粹

  1. 一个组件必须是纯粹的,就意味着:
  • 只负责自己的任务。 它不会更改在该函数调用前就已存在的对象或变量。
  • 输入相同,则输出相同。给定相同的输入,组件应该总是返回相同的 JSX。
  1. 渲染随时可能发生,因此组件不应依赖于彼此的渲染顺序。
  2. 你不应该改变任何用于组件渲染的输入。这包括 props、state 和 context。通过 “设置” state 来更新界面,而不要改变预先存在的对象。
  3. 努力在你返回的 JSX 中表达你的组件逻辑。当你需要“改变事物”时,你通常希望在事件处理程序中进行。作为最后的手段,你可以使用 useEffect。

将 UI 视为树

GitHub提交记录

组件的一个主要特性是能够由其他组件组合而成。在 嵌套组件 中有父组件和子组件的概念,其中每个父组件本身可能是另一个组件的子组件。

下面我们使用 React 应用程序渲染一些鼓舞人心的引语。

在这里插入图片描述

修改 src/App.jsx 文件。

import "./App.css";
import FancyText from "./FancyText";
import InspirationGenerator from "./InspirationGenerator";
import Copyright from "./Copyright";function App() {return (<><FancyText title text="励志语录" /><InspirationGenerator><Copyright year={2025} /></InspirationGenerator></>);
}export default App;

创建 src/FancyText.jsx 文件,显示展示 “励志语录”。

export default function FancyText({ title, text }) {return title ? (<h1 className="fancy title">{text}</h1>) : (<h3 className="fancy cursive">{text}</h3>);
}

创建 src/InspirationGeneration.jsx 文件,显示主体部分。

import * as React from "react";
import quotes from "./quotes";
import FancyText from "./FancyText";export default function InspirationGenerator({ children }) {const [index, setIndex] = React.useState(0);const quote = quotes[index];const next = () => setIndex((index + 1) % quotes.length);return (<><p>你的励志名言是:</p><FancyText text={quote} /><button onClick={next}>再次激励我</button>{children}</>);
}

创建 Copyright.jsx 文件,显示版权。

export default function Copyright({ year }) {return <p className="small">©️ {year}</p>;
}

创建 quotes.js 文件,存放语录。

export default ["生活就像骑自行车,要保持平衡就得不断前进","每个人都是自己命运的建筑师","不要让别人的意见左右你的决定","人生的意义在于追求和实现自己的梦想",
];

在这里插入图片描述


总结

本篇文章,我们学习了 React 官方文档中讲述的 描述UI 的内容,总体上不算难,一些写法需要多加练习和记忆,下面文章我们学习 添加交互 部分。

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!

参考资料:

  1. React 官方文档:React 官方文档
  2. DeepSeek:DeepSeek
  3. VS Code · Copilot

在这里插入图片描述


http://www.lryc.cn/news/576980.html

相关文章:

  • 【机器学习实战笔记 13】集成学习:GBDT算法
  • (七)集成学习
  • stm32hal模块驱动(1)hpdl1414驱动
  • 机器学习7——神经网络上
  • 家谱族谱生成制作小工具PC/H5小程序开源
  • 【系统分析师】高分论文:论软件过程改进
  • UR Studio仿真工具上线助力协作机器人快速部署与精准配置模拟
  • Python 数据分析与可视化 Day 11 - 特征工程基础
  • 【GESP 四级】一个程序掌握大部分知识点
  • 【算法设计与分析】(三)二分搜索技术与大整数乘法
  • 信创背景下应用软件迁移解析:从政策解读到落地实践方案
  • vllm部署私有智谱大模型
  • AI算力综述和资料整理
  • Hive SQL 快速入门指南
  • 从理论到实战:解密大型语言模型的核心技术与应用指南
  • 理解 Confluent Schema Registry:Kafka 生态中的结构化数据守护者
  • 算法-基础算法-递归算法(Python)
  • 【C++11】异常
  • 【python】~实现工具软件:QQ邮件即时、定时发送
  • 预期功能安全SOTIF基本介绍
  • Kafka中的消费者偏移量是如何管理的?
  • 华为云Flexus+DeepSeek征文|基于华为云Flexus云服务快速搭建Dify-LLM应用开发平台详细教程
  • Springboot 集成 SpringState 状态机
  • Linux下的调试器-gdb(16)
  • Tcpdump 网络抓包工具使用
  • ali PaddleNLP docker
  • Vivado关联Vscode
  • BUCK电感电流检测电路current sense-20250603
  • 逆向工程恢复信息的方法
  • JVM中的垃圾收集(GC)