React 是一个由 Facebook 维护的用于构建用户界面的 JavaScript 库,特别是单页应用中数据渲染部分。它允许开发者创建复杂的UI界面,并且高效地更新和渲染当数据变化时的视图。React 的核心理念是组件化开发,即通过组合小的、可重用的代码片段(组件)来构建整个应用程序。
以下是十个常见的 React 写法介绍以及相应的 Demo 举例,涵盖从基础到高级的概念。
1. 函数组件与类组件
函数组件是 React 中推荐的组件形式,使用起来更简洁,并且支持 Hooks。
Demo:
// 函数组件
function Greeting() {
return <h1>Hello, world!</h1>;
}
// 类组件(旧版)
class GreetingClass extends React.Component {
render() {
return <h1>Hello, world!</h1>;
}
}
2. 使用 useState
管理状态
useState
是一个 Hook,它允许函数组件拥有状态。
Demo:
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<>
<p>你点击了 {count} 次</p>
<button onClick={() => setCount(count + 1)}>点击我</button>
</>
);
}
3. 使用 useEffect
执行副作用操作
useEffect
Hook 用于处理副作用,比如数据获取、订阅或手动修改 DOM。
Demo:
import { useEffect, useState } from 'react';
function Example() {
const [data, setData] = useState(null);
useEffect(() => {
// 假设这里执行了一个 API 请求
fetch('/api/data')
.then(response => response.json())
.then(setData);
}, []); // 空数组意味着只在首次渲染时调用
return <div>{data ? data : '加载中...'}</div>;
}
4. Props 的传递
Props 是父组件向子组件传递数据的方式。
Demo:
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
// 使用
<Welcome name="Sara" />
5. 使用 useContext
共享状态
useContext
可以让你在多个组件间共享状态,而不需要通过 props 逐层传递。
Demo:
const ThemeContext = React.createContext('light');
function ThemedButton() {
return (
<ThemeContext.Consumer>
{theme => <button style={{ background: theme }}>I am styled by context!</button>}
</ThemeContext.Consumer>
);
}
// 使用
<ThemeContext.Provider value="dark">
<ThemedButton />
</ThemeContext.Provider>
6. 条件渲染
根据条件选择性地渲染组件。
Demo:
function Greeting({ isLoggedIn }) {
if (isLoggedIn) {
return <UserGreeting />;
}
return <GuestGreeting />;
}
7. 列表渲染
遍历数组并渲染列表项。
Demo:
function NumberList({ numbers }) {
const listItems = numbers.map((number) =>
<li key={number.toString()}>{number}</li>
);
return <ul>{listItems}</ul>;
}
8. 表单处理
管理受控组件,即表单元素的值由 React 状态控制。
Demo:
function NameForm() {
const [value, setValue] = useState('');
function handleChange(event) {
setValue(event.target.value);
}
function handleSubmit(event) {
alert('提交的名字: ' + value);
event.preventDefault();
}
return (
<form onSubmit={handleSubmit}>
<label>
名字:
<input type="text" value={value} onChange={handleChange} />
</label>
<input type="submit" value="提交" />
</form>
);
}
9. 高阶组件(HOC)
高阶组件是一个返回另一个组件的函数。
Demo:
function withSubscription(WrappedComponent, selectData) {
return class extends React.Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
this.state = {
data: selectData(DataSource, props)
};
}
componentDidMount() {
// ... subscribe to data source
}
componentWillUnmount() {
// ... unsubscribe from data source
}
handleChange() {
this.setState({
data: selectData(DataSource, this.props)
});
}
render() {
// 注意我们如何将所有属性传递给包装组件
return <WrappedComponent data={this.state.data} {...this.props} />;
}
}
}
10. 自定义 Hook
自定义 Hook 是一种复用逻辑的好方法。
Demo:
import { useState, useEffect } from 'react';
function useFetch(url) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch(url)
.then(response => response.json())
.then(data => {
setData(data);
setLoading(false);
});
}, [url]);
return { data, loading };
}
function DataDisplay() {
const { data, loading } = useFetch('/api/data');
if (loading) return <p>Loading...</p>;
return <pre>{JSON.stringify(data, null, 2)}</pre>;
}
这些例子涵盖了 React 应用开发中的常见模式和最佳实践。随着经验增长,会找到更多适合特定需求的写法和技巧。