React 是什么
理解 React 的设计思想和工作原理
问题
谈谈你对 React 的理解。
解答
React 是一个用于构建用户界面的 JavaScript 库,由 Facebook 开发并开源。
设计思想
1. 声明式编程
告诉 React 你想要什么样的 UI,而不是如何操作 DOM:
// 声明式:描述 UI 应该是什么样子
function Counter({ count }) {
return <div>当前计数:{count}</div>;
}
// 命令式:手动操作 DOM
document.getElementById('counter').innerHTML = `当前计数:${count}`;
2. 组件化
将 UI 拆分成独立、可复用的组件:
// 按钮组件
function Button({ onClick, children }) {
return (
<button className="btn" onClick={onClick}>
{children}
</button>
);
}
// 卡片组件
function Card({ title, content }) {
return (
<div className="card">
<h3>{title}</h3>
<p>{content}</p>
</div>
);
}
// 组合使用
function App() {
return (
<Card title="欢迎">
<Button onClick={() => alert('点击了')}>点击我</Button>
</Card>
);
}
3. 单向数据流
数据从父组件流向子组件,子组件通过回调函数通知父组件:
function Parent() {
const [count, setCount] = useState(0);
// 数据向下传递,事件向上传递
return <Child count={count} onIncrement={() => setCount(count + 1)} />;
}
function Child({ count, onIncrement }) {
return (
<div>
<span>{count}</span>
<button onClick={onIncrement}>+1</button>
</div>
);
}
工作原理
Virtual DOM
React 使用虚拟 DOM 来提高性能:
// 1. 状态变化时,React 创建新的虚拟 DOM 树
const vdom = {
type: 'div',
props: {
className: 'container',
children: [
{ type: 'h1', props: { children: 'Hello' } },
{ type: 'p', props: { children: 'World' } }
]
}
};
// 2. 对比新旧虚拟 DOM(Diff 算法)
// 3. 只更新变化的部分到真实 DOM
Diff 算法策略
// 1. 同层比较,不跨层级
<div>
<A /> {/* 只和同层的元素比较 */}
<B />
</div>
// 2. 不同类型的元素产生不同的树
<div><Counter /></div> // 变成
<span><Counter /></span> // 整个子树重建
// 3. 通过 key 标识列表中的元素
{items.map(item => (
<li key={item.id}>{item.name}</li> // key 帮助 React 识别哪些元素变化了
))}
完整示例
import { useState, useEffect } from 'react';
// 自定义 Hook:封装数据获取逻辑
function useFetch(url) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch(url)
.then(res => res.json())
.then(data => {
setData(data);
setLoading(false);
});
}, [url]);
return { data, loading };
}
// 展示组件:只负责渲染
function UserCard({ user }) {
return (
<div className="user-card">
<img src={user.avatar} alt={user.name} />
<h3>{user.name}</h3>
<p>{user.email}</p>
</div>
);
}
// 容器组件:处理数据和逻辑
function UserList() {
const { data: users, loading } = useFetch('/api/users');
if (loading) return <div>加载中...</div>;
return (
<div className="user-list">
{users.map(user => (
<UserCard key={user.id} user={user} />
))}
</div>
);
}
关键点
- 声明式:描述 UI 状态,React 负责更新 DOM
- 组件化:UI 拆分成独立可复用的组件,便于维护和测试
- 单向数据流:数据自上而下流动,状态变化可预测
- Virtual DOM:通过 Diff 算法最小化 DOM 操作,提升性能
- JSX:JavaScript 的语法扩展,让 UI 代码更直观
目录