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

React 播客专栏 Vol.18|React 第二阶段复习 · 样式与 Hooks 全面整合

视频版

🎙 欢迎回到《前端达人 · React播客书单》第 18 期。

今天,我们将对第二阶段的内容进行系统复盘,重点是两个关键词:样式 与 Hooks

  • 样式,决定组件“长什么样”

  • Hooks,决定组件“怎么动起来”

我们不但会回顾 CSS Modules、Emotion、Tailwind 的使用场景,还会穿插 useStateuseEffectuseRef 等核心 Hooks 的使用技巧,并在最后带来一个实战组件:可折叠面板 Accordion,来一次彻底的知识整合。

📦 第一部分:样式方案复习

✅ Plain CSS & CSS Modules

// 传统方式
import './App.css'// 模块化方案
import styles from './Button.module.css'
<button className={styles.primary}>Submit</button>

CSS Modules 优势:

  • 避免样式全局污染

  • 类名自动哈希化,适合组件封装

  • Create React App 默认支持

适用场景:中等规模组件项目,团队需要一定风格约束。

✅ Emotion:主流 CSS-in-JS 方案

/** @jsxImportSource @emotion/react */
import { css } from '@emotion/react'const style = css`background: #f0f0f0;padding: 16px;
`

优势:

  • 样式与逻辑写在一起,更具组件一致性

  • 允许使用 props 动态控制样式

  • 天然适配 TypeScript 类型系统

适用场景:组件库、设计系统 或 需要逻辑控制样式的复杂交互组件

✅ Tailwind CSS:原子化的实用流派

<button className="bg-indigo-600 text-white px-4 py-2 rounded">Click me
</button>

优势:

  • 无需命名 class,写一个类就是一个功能

  • class 命名语义明确、设计一致

  • 配合设计 token、组件库使用,提升协作效率

适用场景:页面开发、追求一致性的中大型前端项目

⚙️ 第二部分:Hooks 系统复盘

✅ useState vs useReducer

const [count, setCount] = useState(0)

适用于简单状态(数字、布尔值、字符串)

const [state, dispatch] = useReducer(reducer, initialState)

适用于复杂状态逻辑,如:

  • 多个字段一起更新

  • 状态变更依赖 action 类型

  • 希望将状态逻辑集中统一管理

📌 记住一句话:状态逻辑复杂,就用 useReducer

✅ useEffect:副作用处理专家

useEffect(() => {fetchData()return () => cleanup()
}, [dependency])

掌握 3 种依赖数组写法:

依赖数组

执行时机

[]

组件首次挂载

[var]

var 变化时执行

空(不填)

每次渲染后执行

✅ 性能与引用类 Hooks:useRef / useMemo / useCallback

Hook

场景

useRef

缓存 DOM 或值,不触发重渲染

useMemo

缓存计算结果,避免重复运算

useCallback

缓存函数引用,优化子组件渲染

const total = useMemo(() => calculate(items), [items])
const handler = useCallback(() => doSomething(), [items])

🧪 第三部分:实战组件构建

🎯 目标:可折叠面板(Accordion)

功能说明:

  • 点击按钮,内容展开或收起

  • 内容高度自动适配,支持过渡动画

  • 无需引入三方库,完全自定义实现

💡 技术实现拆解

功能点

技术方案

状态控制

useState

 管理 isExpanded

DOM 尺寸测量

useRef

 获取 scrollHeight

触发动画

useEffect

 控制 style.height

函数优化

useCallback

 记忆点击事件

样式实现

Tailwind + transition 类名

🧱 精简实现代码(参考)

const [isExpanded, setIsExpanded] = useState(false)
const contentRef = useRef<HTMLDivElement>(null)useEffect(() => {const el = contentRef.currentif (!el) returnel.style.height = isExpanded ? `${el.scrollHeight}px` : '0px'
}, [isExpanded])

配合样式:

<div className="overflow-hidden transition-all duration-300" ref={contentRef}><p className="p-4">这里是内容区域</p>
</div>

📌 学习建议 & 调试技巧

  • 💻 React DevTools:观察状态、props 变化最强工具

  • 🧠 错误提示别忽略,TS 的类型报错=最佳调试助手

  • 📘 文档永远是第一资源:React Hooks 官方文档

✅ 总结与展望

已掌握

意义

样式模块化思路

让组件更美观、可维护

Hooks 使用模式

让组件更具行为逻辑和性能优化能力

实战练习能力

把知识点真正用于构建功能型组件

🔮 下一步内容:进入第三阶段

📌 主题:React 路由与远程数据处理

我们将学习:

  • react-router-dom 的现代写法

  • 动态路由参数与页面懒加载

  • API 数据请求与缓存逻辑

#React     #React播客     #前端播客     #前端达人     #TypeScript    

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

相关文章:

  • 从认识AI开始-----解密LSTM:RNN的进化之路
  • leetcode0513. 找树左下角的值-meidum
  • 命令行式本地与服务器互传文件
  • MPTCP 聚合吞吐
  • JavaScript性能优化实战技术文章大纲
  • LabelImg: 开源图像标注工具指南
  • 计算机网络 TCP篇常见面试题总结
  • 树欲静而风不止,子欲养而亲不待
  • Kotlin中的::操作符详解
  • 【Linux】(1)—进程概念-③Linux进程概念与PCB
  • 神经网络中的梯度消失与梯度爆炸
  • 深入详解编译与链接:翻译环境和运行环境,翻译环境:预编译+编译+汇编+链接,运行环境
  • 系统架构设计师案例分析----经典架构风格特点
  • 基于大模型的急性乳腺炎全病程风险预测与综合治疗方案研究
  • HTML实战:爱心图的实现
  • 定时任务:springboot集成xxl-job-core(二)
  • DeviceNET转EtherCAT网关:医院药房自动化的智能升级神经中枢
  • 一:UML类图
  • 数据库三范式的理解
  • Java 中 MySQL 索引深度解析:面试核心知识点与实战
  • DeepSeek 部署中的常见问题及解决方案
  • Nvidia Intern 笔试回忆
  • 鸿蒙OS基于UniApp的WebRTC视频会议系统实践:从0到1的HarmonyOS适配之路#三方框架 #Uniapp
  • 设计模式之结构型:装饰器模式
  • mysql分布式教程
  • MySQL安装及启用详细教程(Windows版)
  • Vue3.5 企业级管理系统实战(二十一):菜单权限
  • kafka幂等生产者和事务生产者区别
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(二十九) -> 开发云数据库
  • 批量导出CAD属性块信息生成到excel——CAD C#二次开发(插件实现)