python web——react
前言
为了后续自己搭建全栈项目做准备,对react做一定的了解
学习目标:大致看懂react的基本语法,可以在ai的协助下完成前端的搭建
介绍
React 是 Facebook(现 Meta)于 2013 年开源的一套用于构建用户界面的 JavaScript 库,现由 React 核心团队与社区共同维护。
项目搭建
项目创建
1 | npx create-react-app my-app |
npx 是什么?
npm 5.2+ 自带的“包运行器”(Node Package eXecute)。类似uv
脚手架(Scaffold / Boilerplate)是什么?
- 定义:官方或社区提供的“项目模板生成器”,一条命令就能创建带目录结构、配置、脚本、依赖的完整项目骨架。
- 目的: • 省掉繁琐的初始化、Webpack/Rollup/Vite 配置、ESLint/TypeScript/测试等环境搭建。 • 统一团队规范,降低新人上手成本。
启动开发服务器
1 | cd my-app |
目录速览(核心)
1 | my-app |
JSX
JSX(JavaScript XML 的缩写)是 React 引入的一种语法糖(syntactic sugar)。它让你在 JavaScript 文件里直接写类 HTML 标记,然后由构建工具(Babel、TypeScript、esbuild、swc)把它翻译成普通的 JavaScript 函数调用。
如下
1 | // 1. 找到 public/index.html 中 id="root" 的 DOM 节点,作为 React 应用的挂载点 |
箭头函数
React(以及所有现代 JavaScript)里,“箭头”指的是 箭头函数(Arrow Function),语法是:
1 | const 函数名 = (参数) => 返回值或语句块 |
它的作用可以概括为 “更简洁的函数声明 + 词法作用域的 this”。
通俗理解:把小括号的内容变成箭头后的内容
函数组件
函数组件 + JSX 的组合作用是: 以函数的形式返回“虚拟 DOM 描述”,交由 React 渲染成真实 DOM,而不是直接返回 HTML 组件或字符串。
- 函数组件的“返回值”
1 | function Welcome(props) { |
经过 Babel 编译后等价于:
1 | function Welcome(props) { |
React.createElement 会生成一个纯 JS
对象(虚拟节点),而不是一段 HTML 字符串。
使用示例
1 | // 1. 接收父组件传来的 props |
使用:
1 | <Card title="函数组件"> |
DOM(Document Object Model,文档对象模型)是浏览器在内存里把一份 HTML/XML 文档表示成树形结构的编程接口(API)。
每个节点(元素、文本、注释…)都是一个对象,拥有属性与方法,例如:
1
2
3 const title = document.getElementById('title');
title.textContent = 'Hi React'; // 改文本
title.style.color = 'red'; // 改样式
插值写法
在 React 中,“插值”专指把一段 JavaScript 表达式的实时结果塞进
JSX 的写法。 核心符号只有一对花括号
{ },记住口诀:“JSX 里凡是 {} 包起来的,就是
JavaScript 运行后的值。”
基本文本插值
1 | const name = 'React'; |
属性插值
1 | function App() { |
数据渲染
条件渲染
1 | function App() { |
列表渲染
1 | function App() { |
.map((item) => { ... })‑Array.prototype.map:遍历数组,把每个元素依次交给回调函数处理,并返回一个新数组。 ‑(item)是每次循环拿到的当前元素。return <li>{item}</li>‑ 每一次循环里,把当前元素item用 JSX 插值语法{item}放进<li>标签里。
状态处理
1 | import { useState } from 'react'; |
useState 是 React 提供的 Hook,让函数组件也能拥有内部状态(state)。可以通过更新函数,调用后触发重新渲染。
对象的状态更新
1 | import { useState } from 'react'; |
...mycontent 是 ES6 的 对象展开运算符(object
spread)。 一句话:把 mycontent
里所有“旧属性”先抄出来,然后再覆盖/新增你后面写的属性。
react组件的使用
1 | import { useState } from 'react'; |
className代替class传统 HTML 写<img class="App-logo">;React 组件里必须用className,因为 JSX 最终会被编译成 JavaScript 对象,而class是 JS 的保留关键字。样式写成对象
HTML
写行内样式:style="width:100px;background-color:grey" React
必须写成对象:
1 | style={{ |
因为 JSX 属性最终会变成 JS 对象的键值对,键名必须合法(驼峰),值可以是任何 JS 值(数字、变量、计算结果)。
- 最终产物是虚拟 DOM 节点
<img src={logo} ... /> 在浏览器里不会直接变成
<img> 标签,而是先被编译成:
1 | React.createElement('img', { |
React 再拿这个对象去做 diff、更新真实 DOM,而不是直接 innerHTML。
1 | function App() { |
利用 JSX 展开运算符(spread attributes) 把
imgdata 里的所有键值一次性“拍平”到 <img>
标签上
组件复用
1 | function Article(props) { |
组件通信
组件通信的 4 条主线
1️⃣ 父 → 子:props 2️⃣ 子 → 父:回调函数 3️⃣ 隔代/任意:Context 4️⃣ 全局/远端:状态管理库(Zustand、Redux、React Query)
父 → 子
1 | function Parent() { |
子 → 父
1 | function Parent() { |
父组件把“修改函数”通过 props 传给子组件,子组件在合适的时机调用它,把数据作为参数传回去。
react hooks
Hook 是什么? Hook 是 React 16.8 引入的 函数级 API,让函数组件拥有
- 状态(useState)
- 生命周期(useEffect)
- 上下文(useContext)
- 自定义逻辑(自定义 Hook) 而不必写 class。