React 个人笔记 Hooks编程

作用

配合函数式编程,保证在不产生类的时候完成一个整体的组件

常用组件

  1. useState
  2. useContext
  3. useReducer
  4. useEffect
  5. useMemo
  6. useCallback

前三个值为自变量
后三者为因变量

前三者相当于其他编程函数的变量声明,而后三者相当于对变量进行了(if now != previous)的包装,执行函数

useState

适用于:简单逻辑状态管理

//创建
const [state, setState] = useState(defaultState)//直接修改
setState(nextState);
// 函数修改,会接收到一个参数是原先 state 的值,该函数的返回值将作为更新后 state 的值
setState(preState => nextState);

useReducer

用于处理更复杂的状态逻辑。相比于 useState,它更适合用于处理涉及多个子值的状态,或者下一个状态依赖于之前的状态的情况

// 定义初始状态
const initialState = { count: -1 };
//初始化函数
function init(initial) {// 确保初始计数值为正数return { count: Math.abs(initial.count) };
}
// 定义 reducer 函数
function counterReducer(state, action) {switch (action.type) {case 'increment':return { count: state.count + 1 };case 'decrement':return { count: state.count - 1 };case 'reset':return initialState;default:throw new Error();}
}
}// 在组件中使用
function Counter() {const [state, dispatch] = useReducer(counterReducer, initialState, init);//第三个参数可以传入函数,这个函数允许你自定义初始化逻辑,而不是直接使用第二个参数 initialState作为初始状态(对第二个参数进行预处理,如取abs)。当你需要对初始状态进行一些计算或处理时return (<div><p>Count: {state.count}</p><button onClick={() => dispatch({ type: 'increment' })}>+1</button><button onClick={() => dispatch({ type: 'decrement' })}>-1</button><button onClick={() => dispatch({ type: 'reset' })}>Reset</button></div>);
}

·

useContext

和props的区别

  1. Props 是父组件向子组件传递数据的一种方式,从上往下传递,
  2. useContext 是一个 React Hook,允许你订阅 React 的 Context 对象。Context 提供了一种在组件之间共享数据的方式

作用
Props 主要用于父子组件之间的通信,而 useContext 解决了跨层级组件间的数据共享问题。如果组件层次较深,为了将某个 prop 从根组件传递到深层嵌套的组件,可能需要在每一层中间组件中“透传”这个 prop(即使这些中间组件并不使用该 prop),这被称为“prop drilling“ 使用useContext可以避免prop drilling
过度依赖 Context 可能导致不必要的重新渲染,因为它本质上是全局的。而 Props 则更细粒度,仅影响接收它们的组件

使用样例, 文件名为 ThemeContext.js,创造好了context,引用该文件后可以 useContext

import React, { createContext, useState, useContext } from 'react';// 创建 ThemeContext
export const ThemeContext = createContext();// 创建一个提供者组件来包裹需要访问 context 的组件树
export const ThemeProvider = ({ children }) => {const [theme, setTheme] = useState('light'); // 默认主题为 lightconst toggleTheme = () => {setTheme(prevTheme => prevTheme === 'light' ? 'dark' : 'light');};return (<ThemeContext.Provider value={{ theme, toggleTheme }}>{children}</ThemeContext.Provider>);
};
import React, { useContext } from 'react';
import { ThemeProvider, ThemeContext } from './ThemeContext'; // 假设文件名为 ThemeContext.js
import MiddleComponent from './MiddleComponent';function App() {const { theme, toggleTheme } = useContext(ThemeContext);return (<ThemeProvider><div className={`app ${theme}`}><button onClick={toggleTheme}>Toggle Theme</button><MiddleComponent /></div></ThemeProvider>);
}export default App;
import React from 'react';
import DeeplyNestedComponent from './DeeplyNestedComponent';function MiddleComponent() {return (<div><h2>Middle Component</h2><DeeplyNestedComponent /></div>);
}export default MiddleComponent;
import React, { useContext } from 'react';
import { ThemeContext } from './ThemeContext'; // 假设文件名为 ThemeContext.jsfunction DeeplyNestedComponent() {const { theme } = useContext(ThemeContext);return (<div className={`deeply-nested-component ${theme}`}><h3>Deeply Nested Component with {theme} theme</h3></div>);
}export default DeeplyNestedComponent;

useEffect

useEffect Hook 让你可以执行副作用操作(如数据获取、订阅或手动 DOM 操作),并根据指定的依赖项数组来决定何时重新执行副作用

  1. 无依赖项: 在组件每次渲染后执行。
  2. 空数组([]): 仅在组件挂载和卸载时执行
  3. 依赖项数组: 当数组中的任何值发生变化时,effect将会重新运行。
import React, { useState, useEffect } from 'react';function Example() {const [count, setCount] = useState(0);useEffect(() => {console.log(`You clicked ${count} times`);return () => {// 清理函数console.log('清理工作');};}, [count]); // 只有 count 改变时触发(注意 初始化的时候也会加载一次return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}

useMemo

useMemo Hook 用于记忆计算结果,避免重复计算。它接收一个创建函数和依赖项数组,只有当依赖项改变时才会重新计算返回值。

import React, { useState, useMemo } from 'react';function computeExpensiveValue(a, b) {console.log("Performing expensive computation...");return a + b;
}function Example({ a, b }) {const [count, setCount] = useState(0);const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);return (<><p>Memoized Value: {memoizedValue}</p><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increase Count</button></>);
}

useCallBack

seCallback Hook 与 useMemo 类似,用于记忆函数定义。优化性能,特别是当将回调函数作为 props 传递给子组件时,可以防止子组件重新渲染。

import React, { useState, useCallback } from 'react';function ChildComponent({ onButtonClick }) {console.log("ChildComponent render");return <button onClick={onButtonClick}>Click Me!</button>;//即使父组件渲染,ChildComponent 接收到的 onButtonClick 回调不会改变, Click me Button不会重新渲染
}function ParentComponent() {const [count, setCount] = useState(0);const handleClick = useCallback(() => {console.log("Button clicked");}, []); // 空数组意味着这个回调永远不会更新return (<><ChildComponent onButtonClick={handleClick} /><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increase Count</button></>);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/81894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

logits是啥、傅里叶变换

什么是logtis&#xff1f; 在深度学习的上下文中&#xff0c;logits 就是一个向量&#xff0c;下一步通常被投给 softmax/sigmoid 的向量。。 softmax的输出是分类任务的概率&#xff0c;其输入是logits层。 logits层通常产生-infinity到 infinity的值&#xff0c;而softmax层…

Adobe Illustrator学习备忘

1.移动画板&#xff1a;需按住空格键加鼠标一块才能拖动 2.放大缩小画板&#xff1a;按住Alt键加鼠标滚轮 3.撤回&#xff1a;CtrlZ 4.钢笔练习网站&#xff1a;The Bzier Game

【初识】内网渗透——基础概念,基本工具使用

目录 一、域&#xff0c;工作组&#xff0c;域控制器&#xff0c;活动目录相关概念&#xff1a; 域环境&#xff1a; 工作组&#xff1a; 域控制器DC&#xff1a; 活动目录AD&#xff1a; 二、内网的基本场景&#xff1a; 三、内网渗透基本测试方案&#xff1a; #案例1一基本信…

remove_const的工作原理及c++的类型推导

author: hjjdebug date: 2025年 05月 21日 星期三 12:51:57 CST descrip: remove_const的工作原理及c的类型推导 文章目录 1. 简单的程序代码.2.std::remove_const_t 到底是怎样工作的&#xff1f;2.1 测试代码2.2 类型推导的调试手段.2.2.1 给类模板添加成员函数,让它打印信息…

人脸识别,使用 deepface + api + flask, 改写 + 调试

1. 起因&#xff0c; 目的&#xff0c; 感受: github deepface 这个项目写的很好&#xff0c; 继续研究使用这个项目&#xff0c;改写 api。增加一个前端 flask app 2. 先看效果 3. 过程: 大力改写原始项目中 api 这部分的代码&#xff0c; 原始项目的文件结构太繁杂了: 我把…

三维表面轮廓仪的维护保养是确保其长期稳定运行的关键

三维表面轮廓仪是一种高精度测量设备&#xff0c;用于非接触式或接触式测量物体表面的三维形貌、粗糙度、台阶高度、纹理特征等参数。其主要基于光学原理进行测量。它利用激光或其他光源投射到被测物体表面&#xff0c;通过接收反射光或散射光&#xff0c;结合计算机图像处理技…

Lambda表达式的高级用法

今天来分享下Java的Lambda表达式&#xff0c;以及它的高级用法。 使用它可以提高代码的简洁度&#xff0c;使代码更优雅。 一、什么是lambda表达式 Lambda 表达式是 Java 8 引入的特性&#xff0c;用于简化匿名内部类的语法&#xff0c;使代码更简洁&#xff0c;尤其在处理函…

31-35【动手学深度学习】深度学习硬件

1. CPU和GPU 1.1 CPU CPU每秒钟计算的浮点运算数为0.15&#xff0c;GPU为12。GPU的显存很低&#xff0c;16GB&#xff08;可能32G封顶&#xff09;&#xff0c;CPU可以一直插内存。 左边是GPU&#xff08;只能做些很简单的游戏&#xff0c;视频处理&#xff09;&#xff0c;中…

【MySQL成神之路】MySQL常见命令汇总

目录 MySQL常用命令总结 1. 数据库操作 2. 表操作 3. 数据操作&#xff08;DML&#xff09; 4. 索引与优化 5. 用户与权限管理 6. 备份与恢复 7. 事务控制 8. 常用函数 9. 系统状态与日志 总结 MySQL常用命令总结 MySQL作为最流行的关系型数据库之一&#xff0c;提供…

Dify的大语言模型(LLM) AI 应用开发平台-本地部署

前言 今天闲着&#xff0c;捣鼓一下 Dify 这个开源平台&#xff0c;在 mac 系统上&#xff0c;本地部署并运行 Dify 平台&#xff0c;下面记录个人在本地部署Dify 的过程。 Dify是什么&#xff1f; Dify是一个开源的大语言模型&#xff08;LLM&#xff09;应用开发平台&#…

【论文阅读】针对BEV感知的攻击

Understanding the Robustness of 3D Object Detection with Bird’s-Eye-View Representations in Autonomous Driving 这篇文章是发表在CVPR上的一篇文章&#xff0c;针对基于BEV的目标检测算法进行了两类可靠性分析&#xff0c;即恶劣自然条件以及敌对攻击。同时也提出了一…

SonarQube的核心作用与用途

SonarQube作为一个开源的代码质量管理平台&#xff0c;致力于持续分析代码的健康状态&#xff0c;帮助开发团队提升代码质量。以下是其核心作用与用途的详细说明&#xff1a; 1、静态代码分析 SonarQube通过静态代码分析技术&#xff0c;自动识别代码中的潜在问题。它能够检测…

AI工程师系列——面向copilot编程

前言 ​ 笔者已经使用copilot协助开发有一段时间了,但一直没有总结一个协助代码开发的案例,特别是怎么问copilot,按照什么顺序问,哪些方面可以高效的生成需要的代码,这一次,笔者以IP解析需求为例,沉淀一个实践案例,供大家参考 当然,其实也不局限于copilot本身,类似…

【软件设计师】知识点简单整理

文章目录 数据结构与算法排序算法图关键路径 软件工程决策表耦合类型 编程思想设计模式 计算机网络域名请求过程 数据结构与算法 排序算法 哪些排序算法是稳定的算法?哪些不是稳定的算法,请举出例子。 稳定排序算法&#xff1a;冒泡排序、插入排序、归并排序、基数排序、计数…

FastAPI 支持文件下载和上传

文章目录 1. 文件下载处理1.1. 服务端处理1.1.1. 下载小文件1.1.2. 下载大文件&#xff08;yield 支持预览的&#xff09;1.1.3. 下载大文件&#xff08;bytes&#xff09;1.1.4. 提供静态文件服务1.1.5. 中文文件名错误 1.2. 客户端处理1.2.1. 普通下载1.2.2. 分块下载1.2.3. …

naive-ui切换主题

1、在App.vue文件中使用 <script setup lang"ts"> import Dashboard from ./views/dashboard/index.vue import { NConfigProvider, NGlobalStyle, darkTheme } from naive-ui import { useThemeStore } from "./store/theme"; // 获取存储的主题类…

Kotlin 协程 (三)

协程通信是协程之间进行数据交换和同步的关键机制。Kotlin 协程提供了多种通信方式&#xff0c;使得协程能够高效、安全地进行交互。以下是对协程通信的详细讲解&#xff0c;包括常见的通信原语、使用场景和示例代码。 1.1 Channel 定义&#xff1a;Channel 是一个消息队列&a…

使用SQLite Studio导出/导入SQL修复损坏的数据库

使用SQLite Studio导出/导入SQL修复损坏的数据库 使用Zotero时遇到了数据库损坏&#xff0c;在软件中寸步难行&#xff0c;遂尝试修复数据库。 一、SQLite Studio简介 SQLite Studio是一款专为SQLite数据库设计的免费开源工具&#xff0c;支持Windows/macOS/Linux。相较于其…

【git config --global alias | Git分支操作效率提升实践指南】

git config --global alias | Git分支操作效率提升实践指南 背景与痛点分析 在现代软件开发团队中&#xff0c;Git分支管理是日常工作的重要组成部分。特别是在规范的开发流程中&#xff0c;我们经常会遇到类似 feature/user-management、bugfix/login-issue 或 per/cny/dev …

(八)深度学习---计算机视觉基础

分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高斯混合聚类LDA主题模型 一.图像数字化表示及建模基础 二.卷积神经网络CNN基本原…