React的核心创新在于将UI分解为独立、可复用的组件。每个组件都是状态机,包含:
与传统DOM操作不同,React采用声明式编程模式。开发者只需声明"UI应该是什么样子",而不需要逐步指示"如何更新UI"。当状态变化时,React自动计算最小更新集并高效执行DOM操作。
虚拟DOM是React性能的基石,其工作流程分为三步:
JSX不是模板引擎,而是语法糖:
// JSX代码
const element = <h1 className="title">Hello</h1>;
// 编译后
const element = React.createElement(
'h1',
{ className: 'title' },
'Hello'
);
JSX让组件结构更直观,同时保留JavaScript的全部能力。Babel编译器在构建阶段将其转换为React.createElement调用。
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模式,但理解类组件对阅读遗留代码至关重要。
Props遵循单向数据流原则:
<Child color="blue" />
props.color
复杂数据传递可使用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值
}
useState是React Hooks的核心API:
const [count, setCount] = useState(0);
useState
在组件首次渲染时初始化状态
setCount
触发重新渲染,但不会立即更新值
关键原理:React通过调用顺序追踪Hooks。必须在顶层调用Hooks,不能在条件或循环中使用。
函数组件生命周期通过useEffect管理:
useEffect(() => {
// 相当于componentDidMount + componentDidUpdate
console.log('组件已挂载或更新');
return () => {
// 相当于componentWillUnmount
console.log('组件即将卸载');
};
}, [dependencies]); // 依赖项变化时触发
生命周期各阶段:
React事件是跨浏览器包装的合成事件:
事件绑定:
<button onClick={(e) => handleClick(e)}>
Click
</button>
// 不推荐
<button onClick={() => handleClick(id)} />
// 推荐
const handleClick = useCallback(() => {
/* 逻辑 */
}, [dependencies]);
2. 阻止默认行为:e.preventDefault()
3. 停止冒泡:e.stopPropagation()
&&运算符:简单条件显示
{isLoggedIn && <AdminPanel />}
三元表达式:二选一渲染
{isLoading ? <Spinner /> : <Content />}
组件内部判断:复杂逻辑封装
列表渲染必须提供稳定唯一key:
<ul>
{items.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
key的作用:
React推荐使用受控组件管理表单:
function Form() {
const [value, setValue] = useState('');
const handleChange = (e) => {
setValue(e.target.value);
};
return (
<input
type="text"
value={value}
onChange={handleChange}
/>
);
}
输入值由React状态完全控制,形成单向数据流。
// 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>
Hook | 作用 | 等效类组件生命周期 |
---|---|---|
useState | 状态管理 | this.state + setState |
useEffect | 副作用管理 | componentDidMount/Update/Unmount |
useContext | 跨组件数据传递 | static contextType |
useReducer | 复杂状态逻辑 | Redux式状态管理 |
useRef | DOM引用/持久变量 | createRef |
自定义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的学习曲线在掌握核心概念后会陡然平缓。坚持实践,你将体会到"Learn Once, Write Anywhere"的真正力量。