元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
React基础
▶
环境搭建
使用Create React App
Webpack基础配置
Babel转换配置
▶
JSX核心
JSX语法基础
JSX表达式使用
JSX与HTML差异
▶
组件入门
函数组件编写
类组件结构
组件组合模式
▶
核心概念
▶
Props机制
Props传递与接收
PropTypes类型检查
默认Props设置
▶
State管理
useState使用
setState机制
状态提升
▶
生命周期
类组件生命周期
useEffect使用
依赖项数组作用
▶
进阶实践
▶
路由管理
React Router安装
基本路由配置
动态路由参数
▶
状态管理
Context API使用
Redux核心概念
Redux Toolkit实践
▶
性能优化
memo使用
useCallback应用
代码分割实践
发布时间:
2025-03-22 12:38
↑
☰
# 函数组件编写 本文将详细介绍React函数组件的编写方法,帮助你理解和掌握函数组件的核心概念和最佳实践。 ## 什么是函数组件? 函数组件是React中最简单的组件形式,它是一个接收props作为参数并返回React元素的JavaScript函数。函数组件具有以下特点: - 简洁直观:代码结构清晰,易于理解 - 无状态(默认):适合展示型组件 - Hooks支持:通过Hooks可以使用状态和其他React特性 - 性能优势:相比类组件,占用资源更少 ## 基础语法 ### 1. 最简单的函数组件 ```jsx function Welcome(props) { return <h1>Hello, {props.name}</h1>; } // 使用组件 <Welcome name="React" /> ``` ### 2. 箭头函数形式 ```jsx const Welcome = (props) => { return <h1>Hello, {props.name}</h1>; }; // 简写形式(单行返回值) const Welcome = props => <h1>Hello, {props.name}</h1>; ``` ### 3. 解构props ```jsx function UserProfile({ name, age, email }) { return ( <div> <h2>{name}</h2> <p>Age: {age}</p> <p>Email: {email}</p> </div> ); } // 使用组件 <UserProfile name="John Doe" age={25} email="john@example.com" /> ``` ## 使用Hooks ### 1. useState ```jsx function Counter() { const [count, setCount] = useState(0); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}> Increment </button> </div> ); } ``` ### 2. useEffect ```jsx function UserStatus({ userId }) { const [isOnline, setIsOnline] = useState(false); useEffect(() => { function handleStatusChange(status) { setIsOnline(status.isOnline); } // 订阅用户状态 UserAPI.subscribeToUserStatus(userId, handleStatusChange); // 清理函数 return () => { UserAPI.unsubscribeFromUserStatus(userId, handleStatusChange); }; }, [userId]); // 仅在userId改变时重新执行 return ( <div> {isOnline ? '🟢 Online' : '⚫️ Offline'} </div> ); } ``` ## 组件通信 ### 1. 父组件向子组件传递数据 ```jsx function Parent() { const data = "Hello from parent"; return <Child message={data} />; } function Child({ message }) { return <p>{message}</p>; } ``` ### 2. 子组件向父组件传递数据 ```jsx function Parent() { const handleChildData = (data) => { console.log('Received from child:', data); }; return <Child onDataSend={handleChildData} />; } function Child({ onDataSend }) { return ( <button onClick={() => onDataSend('Data from child')}> Send Data to Parent </button> ); } ``` ## 最佳实践 ### 1. 组件拆分 ```jsx function UserDashboard({ user }) { return ( <div className="dashboard"> <UserHeader user={user} /> <UserStats stats={user.stats} /> <UserActivity activities={user.activities} /> </div> ); } function UserHeader({ user }) { return ( <header> <img src={user.avatar} alt={user.name} /> <h1>{user.name}</h1> </header> ); } function UserStats({ stats }) { return ( <div className="stats"> <StatItem label="Posts" value={stats.posts} /> <StatItem label="Followers" value={stats.followers} /> <StatItem label="Following" value={stats.following} /> </div> ); } ``` ### 2. 默认Props ```jsx function Button({ type = 'primary', children }) { return ( <button className={`btn-${type}`}> {children} </button> ); } // 使用组件 <Button>Click me</Button> <Button type="secondary">Cancel</Button> ``` ### 3. 条件渲染 ```jsx function ConditionalComponent({ isLoggedIn, isLoading }) { if (isLoading) { return <LoadingSpinner />; } return ( <div> {isLoggedIn ? ( <UserDashboard /> ) : ( <LoginPrompt /> )} </div> ); } ``` ### 4. 列表渲染 ```jsx function ItemList({ items }) { return ( <ul> {items.map(item => ( <ListItem key={item.id} {...item} /> ))} </ul> ); } function ListItem({ title, description }) { return ( <li> <h3>{title}</h3> <p>{description}</p> </li> ); } ``` ## 性能优化 ### 1. 使用memo ```jsx import { memo } from 'react'; const ExpensiveComponent = memo(function ExpensiveComponent({ data }) { // 复杂的渲染逻辑 return ( <div> {/* 渲染data */} </div> ); }); ``` ### 2. 使用useCallback ```jsx function ParentComponent() { const [count, setCount] = useState(0); const handleClick = useCallback(() => { setCount(c => c + 1); }, []); // 空依赖数组,函数永远不会改变 return <ChildComponent onClick={handleClick} />; } ``` ### 3. 使用useMemo ```jsx function DataProcessor({ data }) { const processedData = useMemo(() => { return data.map(item => ({ ...item, processed: expensiveOperation(item) })); }, [data]); // 只在data改变时重新计算 return ( <div> {processedData.map(item => ( <DataItem key={item.id} {...item} /> ))} </div> ); } ``` ## 常见问题解决 ### 1. 事件处理 ```jsx function Form() { const handleSubmit = (e) => { e.preventDefault(); // 阻止默认表单提交 // 处理表单提交 }; return ( <form onSubmit={handleSubmit}> {/* 表单内容 */} </form> ); } ``` ### 2. 副作用清理 ```jsx function Timer() { const [time, setTime] = useState(0); useEffect(() => { const timer = setInterval(() => { setTime(t => t + 1); }, 1000); // 清理定时器 return () => clearInterval(timer); }, []); return <div>Time: {time}</div>; } ``` ### 3. 异步数据加载 ```jsx function DataFetcher({ url }) { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { try { setLoading(true); const response = await fetch(url); const result = await response.json(); setData(result); } catch (err) { setError(err.message); } finally { setLoading(false); } }; fetchData(); }, [url]); if (loading) return <LoadingSpinner />; if (error) return <ErrorMessage message={error} />; return <DataDisplay data={data} />; } ``` ## 总结 本文详细介绍了React函数组件的编写方法: 1. 基础语法和组件创建 2. Hooks的使用方法 3. 组件间通信 4. 最佳实践和性能优化 5. 常见问题的解决方案 函数组件是React开发中最常用的组件形式,掌握其编写方法对于开发React应用至关重要。建议在实践中多尝试不同的组件模式,逐步提升组件的可复用性和可维护性。