React 核心概念:从入门到进阶的完整指南

React 是由 Facebook 开发的用于构建用户界面的 JavaScript 库。它以组件化、声明式编程和单向数据流等特点深受开发者欢迎。本文将详细介绍 React 的核心概念,帮助你深入理解 React 开发。

目录

  1. 组件基础
  2. Props 和 State
  3. 生命周期
  4. Hooks 系统
  5. 状态管理
  6. 性能优化
  7. 最佳实践

组件基础

1. 函数组件

函数组件是最简单的 React 组件形式:

1
2
3
4
5
6
7
8
function Welcome(props) {
return <h1>你好, {props.name}</h1>;
}

// 使用箭头函数
const Welcome = (props) => {
return <h1>你好, {props.name}</h1>;
};

2. 类组件

类组件提供了更多的特性:

1
2
3
4
5
class Welcome extends React.Component {
render() {
return <h1>你好, {this.props.name}</h1>;
}
}

3. 组件组合

组件可以相互嵌套形成复杂的界面:

1
2
3
4
5
6
7
8
9
10
11
12
function App() {
return (
<div>
<Header />
<MainContent>
<Sidebar />
<Content />
</MainContent>
<Footer />
</div>
);
}

Props 和 State

1. Props(属性)

Props 是组件的只读属性,用于组件间的数据传递:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 父组件
function ParentComponent() {
return <ChildComponent name="张三" age={25} />;
}

// 子组件
function ChildComponent(props) {
return (
<div>
<p>姓名:{props.name}</p>
<p>年龄:{props.age}</p>
</div>
);
}

2. State(状态)

State 是组件的内部状态,可以通过 setState 更新:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}

increment = () => {
this.setState(prevState => ({
count: prevState.count + 1
}));
};

render() {
return (
<div>
<p>计数:{this.state.count}</p>
<button onClick={this.increment}>增加</button>
</div>
);
}
}

3. 单向数据流

React 推崇单向数据流,数据总是从父组件流向子组件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function Parent() {
const [value, setValue] = useState('');

const handleChange = (newValue) => {
setValue(newValue);
};

return <Child value={value} onChange={handleChange} />;
}

function Child({ value, onChange }) {
return (
<input
value={value}
onChange={(e) => onChange(e.target.value)}
/>
);
}

生命周期

1. 挂载阶段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MyComponent extends React.Component {
constructor(props) {
super(props);
// 初始化状态
}

static getDerivedStateFromProps(props, state) {
// 根据 props 更新 state
return null;
}

componentDidMount() {
// 组件挂载后执行
// 适合进行 API 调用
}

render() {
// 渲染组件
return <div>组件内容</div>;
}
}

2. 更新阶段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyComponent extends React.Component {
shouldComponentUpdate(nextProps, nextState) {
// 决定是否需要重新渲染
return true;
}

getSnapshotBeforeUpdate(prevProps, prevState) {
// 获取更新前的快照
return null;
}

componentDidUpdate(prevProps, prevState, snapshot) {
// 组件更新后执行
}
}

3. 卸载阶段

1
2
3
4
5
6
class MyComponent extends React.Component {
componentWillUnmount() {
// 组件卸载前执行
// 清理订阅、定时器等
}
}

Hooks 系统

1. useState

管理组件状态:

1
2
3
4
5
6
7
8
9
10
11
12
function Counter() {
const [count, setCount] = useState(0);

return (
<div>
<p>计数:{count}</p>
<button onClick={() => setCount(count + 1)}>
增加
</button>
</div>
);
}

2. useEffect

处理副作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function UserProfile({ userId }) {
const [user, setUser] = useState(null);

useEffect(() => {
// 获取用户数据
async function fetchUser() {
const response = await fetch(`/api/users/${userId}`);
const data = await response.json();
setUser(data);
}

fetchUser();
}, [userId]); // 依赖项数组

if (!user) return <div>加载中...</div>;
return <div>{user.name}</div>;
}

3. useContext

跨组件共享数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const ThemeContext = React.createContext('light');

function App() {
return (
<ThemeContext.Provider value="dark">
<Toolbar />
</ThemeContext.Provider>
);
}

function Toolbar() {
const theme = useContext(ThemeContext);
return (
<button className={theme}>
按钮
</button>
);
}

4. useReducer

管理复杂状态逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const initialState = { count: 0 };

function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
return state;
}
}

function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);

return (
<div>
<p>计数:{state.count}</p>
<button onClick={() => dispatch({ type: 'increment' })}>+</button>
<button onClick={() => dispatch({ type: 'decrement' })}>-</button>
</div>
);
}

状态管理

1. Context API

适用于简单的全局状态管理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const UserContext = React.createContext();

function UserProvider({ children }) {
const [user, setUser] = useState(null);

const login = (userData) => {
setUser(userData);
};

const logout = () => {
setUser(null);
};

return (
<UserContext.Provider value={{ user, login, logout }}>
{children}
</UserContext.Provider>
);
}

2. Redux

适用于复杂的状态管理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Action Types
const INCREMENT = 'INCREMENT';
const DECREMENT = 'DECREMENT';

// Reducer
function counterReducer(state = 0, action) {
switch (action.type) {
case INCREMENT:
return state + 1;
case DECREMENT:
return state - 1;
default:
return state;
}
}

// Store
const store = createStore(counterReducer);

性能优化

1. React.memo

防止不必要的重渲染:

1
2
3
4
5
const MyComponent = React.memo(function MyComponent(props) {
return (
<div>{props.name}</div>
);
});

2. useMemo

缓存计算结果:

1
2
3
4
5
6
7
function ExpensiveComponent({ data }) {
const processedData = useMemo(() => {
return expensiveOperation(data);
}, [data]);

return <div>{processedData}</div>;
}

3. useCallback

缓存函数引用:

1
2
3
4
5
6
7
8
9
function ParentComponent() {
const [count, setCount] = useState(0);

const handleClick = useCallback(() => {
setCount(c => c + 1);
}, []); // 空依赖数组

return <ChildComponent onClick={handleClick} />;
}

最佳实践

1. 组件设计原则

  • 单一职责原则
  • 保持组件纯粹
  • 适当的组件粒度
  • 合理使用 Props 和 State

2. 代码组织

1
2
3
4
5
6
7
src/
├── components/ # 可复用组件
├── pages/ # 页面组件
├── hooks/ # 自定义 Hooks
├── context/ # Context 相关
├── utils/ # 工具函数
└── styles/ # 样式文件

3. 错误处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}

static getDerivedStateFromError(error) {
return { hasError: true };
}

componentDidCatch(error, errorInfo) {
console.error('错误信息:', error, errorInfo);
}

render() {
if (this.state.hasError) {
return <h1>出错了!</h1>;
}

return this.props.children;
}
}

总结

React 的核心概念包括组件化、Props 和 State、生命周期、Hooks 等。掌握这些概念对于开发高质量的 React 应用至关重要。随着不断实践,你会发现 React 的优雅之处在于它提供了一种声明式的方式来构建用户界面,同时保持了足够的灵活性。

学习资源


本文将持续更新,欢迎关注最新的 React 开发动态。