# learn-react0327
**Repository Path**: wupeng0725/learn-react0327
## Basic Information
- **Project Name**: learn-react0327
- **Description**: React19+Vite+Antdesign
- **Primary Language**: JavaScript
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-03-29
- **Last Updated**: 2025-03-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# React + Vite
## 函数组件
React 组件是常规的 JavaScript 函数,但 组件的名称必须以**大写字母**开头,否则它们将无法运行!
如果你的标签和 return 关键字不在同一行,则必须把它包裹在一对括号中,如下所示:
```jsx
return (
);
```
> 没有括号包裹的话,任何在 return 下一行的代码都 将被忽略!
> 为什么React推荐使用函数组件?
> 1. 代码简洁性
> 类组件需要继承 React.Component、定义构造函数、 render() 方法、处理 this 绑定等冗余代码;而函数组件通过 Hooks 简化逻辑,省去 this 和生命周期方法。
> 2. 逻辑复用
> 函数组件的Hooks(如 useState, useEffect) 替代类组件的高阶组件(HOC)和 Render Props,解决嵌套地狱问题。
> 3. 性能优化
> 函数组件更利于 React 编译时优化(如自动缓存、死代码删除),且 React.memo 优化更直观。
> 4. 心智模型
> 函数组件基于闭包,直接访问最新状态和 props,无需处理 this 绑定,降低理解成本。
> 5. 未来趋势
> React 官方更倾向函数组件,新特性多优先适配,类组件维护进入冻结状态。
## JSX 规则
1. 只能返回一个根元素
如果想要在一个组件中包含多个元素,需要用一个父标签把它们包裹起来。
如果你不想在标签中增加一个额外的 ``,可以用 `<>` 和 `>` 元素来代替:
这个空标签被称作 Fragment。React Fragment 允许你将子元素分组,而不会在 HTML 结构中添加额外节点。
> 为什么多个 JSX 标签需要被一个父元素包裹?
> JSX 虽然看起来很像 HTML,但在底层其实被转化为了 JavaScript 对象,你不能在一个函数中返回多个对象,除非用一个数组把他们包装起来。这就是为什么多个 JSX 标签必须要用一个父元素或者 Fragment 来包裹。
> 渲染列表时:Fragment 语法的简写形式 <> > 无法接受 key 值,所以你只能要么把生成的节点用一个 `
` 标签包裹起来,要么使用长一点但更明确的 `
` 写法:
2. 标签必须闭合
JSX 要求标签必须正确闭合。像 `
` 这样的自闭合标签必须书写成 `
`,而像 `oranges` 这样只有开始标签的元素必须带有闭合标签,需要改为 `oranges`。
3. 使用驼峰式命名法给 所有 大部分属性命名!
### 将 JSX 作为子组件传递
当你将内容嵌套在 JSX 标签中时,父组件将在名为 children 的 prop 中接收到该内容。
## Hooks
### State Hook
* 使用 useState 声明可以直接更新的状态变量。
* 使用 useReducer 在 reducer 函数 中声明带有更新逻辑的 state 变量。
### Context Hook
* 使用 useContext 读取订阅上下文。
### Ref Hook
* 使用 useRef 声明 ref。你可以在其中保存任何值,但最常用于保存 DOM 节点。
* 使用 useImperativeHandle 自定义从组件中暴露的 ref,**获取子组件的ref**。
### Effect Hook
* 使用 useEffect 将组件连接到外部系统,在页面渲染完毕后会执行内部回调。
* useLayoutEffect 在浏览器重新绘制屏幕前执行,可以在此处测量布局。
* useInsertionEffect 在 React 对 DOM 进行更改之前触发,库可以在此处插入动态 CSS。
> useLayoutEffect 可能会影响性能。尽可能使用 useEffect。
> useInsertionEffect 是为 CSS-in-JS 库的作者特意打造的。除非你正在使用 CSS-in-JS 库并且需要注入样式,否则你应该使用 useEffect 或者 useLayoutEffect。
### 性能 Hook
* 使用 useMemo 缓存计算代价昂贵的计算结果。
* 使用 useCallback 将函数传递给优化组件之前缓存函数定义。
> 可以结合React.memo使用
* useTransition 允许将状态转换标记为非阻塞,并允许其他更新中断它。
* useDeferredValue 允许延迟更新 UI 的非关键部分,以让其他部分先更新。
### 其他 Hook
* 使用 useDebugValue 自定义 React 开发者工具为自定义 Hook 添加的标签。
* 使用 useId 将唯一的 ID 与组件相关联,其通常与可访问性 API 一起使用。
* 使用 useSyncExternalStore 订阅外部 store。
* 使用 useActionState 允许你管理动作的状态.
* 使用 useOptimistic,它可以帮助你更乐观地更新用户界面。