React中定义和使用函数式组件

在 React 中,函数式组件是一种通过普通 JavaScript 函数定义的组件。它们接收 props 作为参数,并返回 React 元素。从 React 16.8 开始,函数式组件还可以利用 Hooks 来增加状态和其他 React 特性。

1. 简单的函数式组件

|---|-----------------------------------|
| | import React from 'react'; |
| | |
| | const HelloWorld = (props) => { |
| | return ( |
| | <div> |
| | <h1>Hello, {props.name}!</h1> |
| | </div> |
| | ); |
| | }; |
| | |
| | export default HelloWorld; |

在这个例子中,HelloWorld 是一个函数式组件,它接收一个 props 对象,并返回一个包含 h1 元素的 div

2. 使用解构赋值来简化 props

为了更简洁地访问 props,你可以使用解构赋值:

|---|--------------------------------------|
| | import React from 'react'; |
| | |
| | const HelloWorld = ({ name }) => { |
| | return ( |
| | <div> |
| | <h1>Hello, {name}!</h1> |
| | </div> |
| | ); |
| | }; |
| | |
| | export default HelloWorld; |

在这个例子中,我们通过解构赋值直接获取 props.name,使得代码更加简洁。

3. 使用 Hooks 增加状态

函数式组件可以使用 React Hooks 来增加状态和其他特性。例如,使用 useState Hook:

|---|------------------------------------------------------------------|
| | import React, { useState } from 'react'; |
| | |
| | const Counter = () => { |
| | const [count, setCount] = useState(0); |
| | |
| | return ( |
| | <div> |
| | <p>Count: {count}</p> |
| | <button onClick={() => setCount(count + 1)}>Increment</button> |
| | </div> |
| | ); |
| | }; |
| | |
| | export default Counter; |

在这个例子中,Counter 组件使用 useState Hook 来维护一个 count 状态,并包含一个按钮来增加 count 的值。

4. 使用 Effects Hook

useEffect Hook 可以让你在组件渲染到 DOM 后执行副作用操作,例如数据获取或订阅:

|---|-------------------------------------------------------|
| | import React, { useEffect, useState } from 'react'; |
| | |
| | const DataFetcher = () => { |
| | const [data, setData] = useState(null); |
| | |
| | useEffect(() => { |
| | // 模拟数据获取 |
| | const fetchData = async () => { |
| | const result = await new Promise(resolve => |
| | setTimeout(() => resolve("Fetched Data"), 2000) |
| | ); |
| | setData(result); |
| | }; |
| | |
| | fetchData(); |
| | |
| | // 清理函数(可选) |
| | return () => { |
| | console.log('Cleanup'); |
| | }; |
| | }, []); // 空数组作为第二个参数表示这个 effect 只在组件挂载和卸载时运行一次 |
| | |
| | return ( |
| | <div> |
| | {data ? <p>{data}</p> : <p>Loading...</p>} |
| | </div> |
| | ); |
| | }; |
| | |
| | export default DataFetcher; |

在这个例子中,DataFetcher 组件使用 useEffect 来模拟一个异步数据获取操作,并在数据获取完成后更新状态。

5. 组合组件

你可以将多个函数式组件组合在一起,形成一个更复杂的 UI:

|---|--------------------------------------------|
| | import React from 'react'; |
| | import HelloWorld from './HelloWorld'; |
| | import Counter from './Counter'; |
| | import DataFetcher from './DataFetcher'; |
| | |
| | const App = () => { |
| | return ( |
| | <div> |
| | <HelloWorld name="React" /> |
| | <Counter /> |
| | <DataFetcher /> |
| | </div> |
| | ); |
| | }; |
| | |
| | export default App; |

在这个例子中,App 组件包含了 HelloWorldCounterDataFetcher 组件。

相关推荐
ai_xiaogui4 分钟前
PanelAI前端全面升级!私有化部署AI面板控制台+生态市场一键管理详解
前端·人工智能·comfyui一键部署·生态市场算力共享·ai面板控制台·panelai私有化部署·大模型前端管理
Jelena157795857926 分钟前
1688.item_get_app接口:包装尺寸重量信息深度解析
开发语言·前端·python
酉鬼女又兒14 分钟前
零基础快速入门前端DOM核心知识点详解与蓝桥杯Web赛道备考指南(可用于备赛蓝桥杯Web应用开发)
前端·职场和发展·蓝桥杯
daols8820 分钟前
vue甘特图vxe-gantt实现点击任务条弹出编辑表单
前端·vue.js·甘特图·vxe-gantt
zfyljx23 分钟前
Taro+react input框在文字中间插入光标会跳到末尾问题
javascript·react.js·taro
Fairy要carry23 分钟前
项目05-手搓Agent之任务通信+任务编排的实现
服务器·前端·网络
忘忧记24 分钟前
pytest进阶参数化用法
前端·python·pytest
github_czy38 分钟前
FastAPI 流式响应核心原理解析(含前端断开感知)
前端·fastapi
Lana学习中39 分钟前
[AI编程]纯前端JS实现评论区自动截图&生成 PDF
前端·javascript·pdf·vibe coding
鹏程十八少42 分钟前
7. Android Shadow插件化原理深挖(下):Transform字节码插桩与“零Hook”的底层实现与宿主通信全流程
android·前端·面试