第一章:React核心思想与设计哲学
1.1 组件化思维革命
React的核心创新在于将UI分解为独立、可复用的组件。每个组件都是状态机,包含:
输入属性(Props):从父组件接收的不可变数据
内部状态(State):组件自身管理的可变数据
渲染逻辑:根据props和state生成UI的描述
与传统DOM操作不同,React采用声明式编程模式。开发者只需声明"UI应该是什么样子",而不需要逐步指示"如何更新UI"。当状态变化时,React自动计算最小更新集并高效执行DOM操作。
1.2 虚拟DOM工作原理
虚拟DOM是React性能的基石,其工作流程分为三步:
构建虚拟树:组件render方法返回轻量级JS对象(React元素)
差异比对(Diffing):状态变化时创建新虚拟树,与旧树递归比较
协调(Reconciliation):计算最小变更集,批量更新真实DOM
1.3 JSX的本质
JSX不是模板引擎,而是语法糖:
// JSX代码
const element = <h1 className="title">Hello</h1>;
// 编译后
const element = React.createElement(
'h1',
{ className: 'title' },
'Hello'
);
JSX让组件结构更直观,同时保留JavaScript的全部能力。Babel编译器在构建阶段将其转换为React.createElement调用。
第二章:组件体系深度解析
2.1 函数组件与类组件
React支持两种组件定义方式:
函数组件:纯函数接收props,返回JSX
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
类组件:继承React.Component,拥有生命周期和state
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
现代React推荐使用函数组件+Hooks模式,但理解类组件对阅读遗留代码至关重要。
2.2 Props数据流
Props遵循单向数据流原则:
父组件通过属性传递数据:
<Child color="blue" />
子组件通过props接收:
props.color
Props只读:直接修改会触发错误
复杂数据传递可使用Context API,避免多层透传(Prop Drilling):
const ThemeContext = React.createContext('light');
function App() {
return (
<ThemeContext.Provider value="dark">
<Toolbar />
</ThemeContext.Provider>
);
}
function Button() {
const theme = useContext(ThemeContext);
// 获取theme值
}
第三章:状态管理与生命周期
3.1 useState原理剖析
useState是React Hooks的核心API:
const [count, setCount] = useState(0);
useState
在组件首次渲染时初始化状态setCount
触发重新渲染,但不会立即更新值状态更新是异步批处理的,多次set调用可能合并
关键原理:React通过调用顺序追踪Hooks。必须在顶层调用Hooks,不能在条件或循环中使用。
3.2 组件生命周期
函数组件生命周期通过useEffect管理:
useEffect(() => {
// 相当于componentDidMount + componentDidUpdate
console.log('组件已挂载或更新');
return () => {
// 相当于componentWillUnmount
console.log('组件即将卸载');
};
}, [dependencies]); // 依赖项变化时触发
生命周期各阶段:
挂载阶段:组件首次插入DOM
更新阶段:props/state变化导致重新渲染
卸载阶段:组件从DOM移除
第四章:事件处理机制
4.1 合成事件系统
React事件是跨浏览器包装的合成事件:
统一事件接口:标准化事件对象属性
事件委托:大部分事件委托到document处理
自动清理:组件卸载时移除事件监听器
事件绑定:
<button onClick={(e) => handleClick(e)}>
Click
</button>
4.2 事件处理最佳实践
避免内联箭头函数:每次渲染创建新函数,破坏性能优化
// 不推荐
<button onClick={() => handleClick(id)} />
// 推荐
const handleClick = useCallback(() => {
/* 逻辑 */
}, [dependencies]);
2. 阻止默认行为:e.preventDefault()
3. 停止冒泡:e.stopPropagation()
第五章:数据渲染模式
5.1 条件渲染策略
&&运算符:简单条件显示
{isLoggedIn && <AdminPanel />}
三元表达式:二选一渲染
{isLoading ? <Spinner /> : <Content />}
组件内部判断:复杂逻辑封装
5.2 列表渲染优化
列表渲染必须提供稳定唯一key:
<ul>
{items.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
key的作用:
帮助React识别元素变化
维持状态和DOM节点的对应关系
避免不必要的重新渲染
第六章:表单处理哲学
6.1 受控组件模式
React推荐使用受控组件管理表单:
function Form() {
const [value, setValue] = useState('');
const handleChange = (e) => {
setValue(e.target.value);
};
return (
<input
type="text"
value={value}
onChange={handleChange}
/>
);
}
输入值由React状态完全控制,形成单向数据流。
6.2 表单验证策略
即时验证:onChange时检查
提交验证:onSubmit时统一检查
第三方库:Formik + Yup组合
// Yup验证模式
const schema = Yup.object({
email: Yup.string().email('无效邮箱').required('必填'),
password: Yup.string().min(8, '密码过短')
});
// Formik集成
<Formik
validationSchema={schema}
onSubmit={values => {/* 提交处理 */}}
>
{({ errors }) => (
<Form>
{errors.email && <div>{errors.email}</div>}
</Form>
)}
</Formik>
第七章:现代Hooks体系
7.1 核心Hooks深度解析
Hook | 作用 | 等效类组件生命周期 |
---|---|---|
useState | 状态管理 | this.state + setState |
useEffect | 副作用管理 | componentDidMount/Update/Unmount |
useContext | 跨组件数据传递 | static contextType |
useReducer | 复杂状态逻辑 | Redux式状态管理 |
useRef | DOM引用/持久变量 | createRef |
7.2 自定义Hooks设计
自定义Hook是重用状态逻辑的终极方案:
function useWindowSize() {
const [size, setSize] = useState({
width: window.innerWidth,
height: window.innerHeight
});
useEffect(() => {
const handleResize = () => {
setSize({
width: window.innerWidth,
height: window.innerHeight
});
};
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
return size;
}
// 使用
const { width } = useWindowSize();
结语:React开发心法
单向数据流:保持数据流向清晰可预测
组合优于继承:通过组件组合实现复用
状态最小化:只存储必要状态
纯函数思维:减少副作用,提高可测试性
拥抱函数组件:Hooks是React的未来
最后忠告:避免过早抽象!新手常见错误是过度设计组件结构。建议:
先构建可工作的原型
识别重复模式
逐步提取通用组件
React的学习曲线在掌握核心概念后会陡然平缓。坚持实践,你将体会到"Learn Once, Write Anywhere"的真正力量。