当前位置: 首页 > news >正文

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 React 应用编码实现。

1. 优势

1.1. 简化状态管理和副作用处理

Hooks 如 useState 和 useEffect 使得在函数组件中处理状态和副作用变得更加直观和简洁。

import React, { useState, useEffect } from 'react';function Counter() {const [count, setCount] = useState(0);useEffect(() => {document.title = `You clicked ${count} times`;}, [count]);return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}

1.2. 代码复用和组织

Hooks 提供了一种无需修改组件结构即可复用状态逻辑的方法。例如,可以创建自定义 Hook,将特定的状态逻辑封装起来,然后在多个组件中重用。

import { useState, useEffect } from 'react';function useWindowWidth() {const [width, setWidth] = useState(window.innerWidth);useEffect(() => {const handleResize = () => setWidth(window.innerWidth);window.addEventListener('resize', handleResize);return () => {window.removeEventListener('resize', handleResize);};}, []);return width;
}function DisplayWidth() {const width = useWindowWidth();return <div>Window width: {width}</div>;
}

2. 常用的 React Hooks

2.1. useState

用于在函数组件中添加 state 变量。

const [count, setCount] = useState(0);

2.2. useEffect

用于在函数组件中执行副作用操作,如数据获取、订阅等。

useEffect(() => {// 组件挂载时执行return () => {// 组件卸载时清理};
}, [dependencies]); // 依赖数组

2.3. useContext

用于在函数组件中访问上下文。

const value = useContext(MyContext);

2.4. useReducer

用于管理复杂的 state 逻辑,类似于 Redux 的 reducer 概念。

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

2.5. useRef

用于访问 DOM 元素或保存不需要触发重新渲染的变量。

const inputRef = useRef(null);

2.6. useMemo和useCallback

用于性能优化,分别用于记忆化计算结果和记忆化函数。

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
const memoizedCallback = useCallback(() => doSomething(a, b), [a, b]);

3. 自定义 Hook

自定义 Hook 是一种复用状态逻辑的方式,可以提取组件中重复的逻辑,封装成一个自定义 Hook,从而在多个组件中重用。

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 App() {const { data, loading } = useFetch('https://api.example.com/data');if (loading) {return <div>Loading...</div>;}return (<div><pre>{JSON.stringify(data, null, 2)}</pre></div>);
}
http://www.lqws.cn/news/197839.html

相关文章:

  • ​React Hooks 的闭包陷阱问题
  • python学习打卡day47
  • 从0开始学习R语言--Day19--连续变量的相关性检验
  • 数 据 结 构 进 阶:哨 兵 位 的 头 结 点 如 何 简 化 链 表 操 作
  • 管道与进程间通信
  • 如何处理双面沉金线路板上的定位孔?
  • 实现简易动效
  • 【CSS-5】掌握CSS文本样式:从基础到高级技巧
  • MS358A 低功耗运算放大器 车规
  • Linux与Windows切换使用Obsidian,出现 unexplained changes 问题的解决
  • 阿里云ACP云计算备考笔记 (4)——企业应用服务
  • NLP学习路线图(三十):微调策略
  • 【小红书拥抱开源】小红书开源大规模混合专家模型——dots.llm1
  • 如何从浏览器中导出网站证书
  • 第5章:Cypher查询语言进阶
  • 浅谈 React Suspense
  • Svelte 核心语法详解:Vue/React 开发者如何快速上手?
  • BERT, GPT, Transformer之间的关系
  • 从温湿度控制切入:楼宇自控系统打造舒适建筑环境的路径
  • AcWing--数据结构1
  • github中main与master,master无法合并到main
  • Go深入学习延迟语句
  • MCP 技术完全指南:微软开源项目助力 AI 开发标准化学习
  • WPF学习PropertyChanged
  • 前沿论文汇总(机器学习/深度学习/大模型/搜广推/自然语言处理)
  • 【单源最短路经】Dijkstra 算法(朴素版和堆优化版)、Bellman-Ford 算法、spfa 算法 及 负环判断
  • OpenLayers 导航之运动轨迹
  • 队列的概念及实现
  • npm安装electron下载太慢,导致报错
  • 前端 Electron 桌面应用学习笔记