React-Hooks

一、类组件和函数式组件的对比

Hook 的特性:在编写class 的情况下,使用state 以及其他React 特性(比如生命周期)

类组件相比于函数式组件的优势:

  1. 类组件可以定义自己的state,用来保存组件自己内部的状态。函数式组件不可以,因为函数每次调用都会产生新的临时变量
  2. 类组件有自己的生命周期,可以在对应的生命周期中完成自己的逻辑。比如在componentDidMount 中发送网络请求,并且该声明周期函数只会执行一次。函数式组件在函数中发送网络请求,意味着每次重新渲染都会重新发送一次网络请求。
  3. 类组件可以在状态改变时只会重新执行render 函数,以及重新调用的声明周期函数componentDidUpdate 等,函数式组件在重新渲染时,整个函数都会被执行

二、Hooks 的使用

1、useState

  • 在函数退出后函数中定义的变量会“消失”, 而state 中的变量会被React 保留
  • useState 接收唯一一个参数,在第一次组件被调用时使用并作为初始值(如果没有传递参数,那么初始值为undefined)
  • useState 的返回值是一个数组,可以通过解构获取state 和setState
import { memo, useState } from "react"
function CounterHook(props) {const [ counter, setCounter ] = useState(0)function decrement() {setCounter(counter - 1)}return (<div>   <h2>当前计数: {counter}</h2><button onClick={e=>setCount(count+1)}>+1</button><button onClick={decrement}>-1</button></div>)
}
export default memo(CounterHook)

2、useEffect

a、useEffect 的基本使用
  • useEffect 传入的回调函数会在组件被渲染完成后,会自动执行
  • effect 在每次渲染的时候都会执行
// 在组件第一次渲染、组件更新时都会执行
useEffect(() => {// 当前传入的回调函数会在组件被渲染完成后,会自动执行// 网络请求/DOM操作/事件监听
})
b、useEffect 传入的回调函数的返回值 (清除操作)
  • useEffect 传入的回调函数可以有一个返回值,这个返回值是另外一个回调函数。这是effect 可选的清除机制,每个effect 都可以返回一个清除函数,这样就可以将添加和移除订阅的逻辑放在一起
  • react 会在组件更新和卸载的时候执行清除操作
useEffect(() => {console.log("")// 回调函数:回调函数 => 组件被重新渲染或者组件卸载的时候执行return () => {console.log("")}
})
 c、一个函数式组件可以有多个useEffect
useEffect(() => {console.log("修改state")
})
useEffect(() => {console.log("监听redux 中的数据")return () => {// 取消redux 中数据的监听}
})
d、useEffect 的两个参数(effect 的性能优化)
  1. 参数一:执行的回调函数
  2. 参数二:该useEffect 在哪些state 发生变化时,才重新执行(受谁的影响)
e、useEffect 的第二个参数是空数组时
  • 当useEffect 的第二个参数是空数组时,只在组件第一次渲染时执行
  • 类似于类组件的 componentDidMount
  • 如果useEffect 的第一个参数回调函数有返回值时,只会在组件卸载时执行
  • 类似于类组件的componentWillUnmount
useEffect(() => {console.log("在组件第一次渲染时执行一次")return () => {console.log("在组件卸载时执行一次")}
}, [])
f、useEffect 的第二个参数不是空数组时
  • useEffect 的第二个参数是数组,并且数组中有依赖的值
  • useEffect 会在组件第一次渲染时执行一次
  • 并且当依赖的值发生变化时,useEffect 会自动执行
  • 该useEffect 在哪些state 发生变化时,才重新执行(受谁的影响)
useEffect(() => {console.log("count 发生了变化")
}, [count])

3、useContext

组件中使用共享的Context 有两种方式:

  1. 类组件可以通过类名contextType = MyContext 方式,在类中获取context
  2. 多个Context 或者在函数式组件中通过MyContext.Consumer 方式共享context

注意事项:

  • 当组件上层最近的<MyContext.Provider> 更新时,该Hook 会触发重新渲染,并使用最新传递给MyContext provider 的context value 值
// src/context/index.js
import { createContext } from "react"
const UserContext = createContext()
const ThemeContext = createContext()
export {UserContext,ThemeCoontext
}// src/index.js
import { UserContext, ThemeContext } from "@/context/index.js"
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<UserContext.Provider value={{ name: "why", age: 18 }}><ThemeContext.Provider value={{ color: "red", size: 30 }}><App/></ThemeContext.Provider></UserContext.Provider>
);// src/App.jsx
import { memo, useContext } from 'react'
import { UserContext, ThemeContext } from "@/context/index.js"
const App = memo(() => {// 使用contextconst user = useContext(UserContext)const theme = useContext(ThemeContext)return (<div><h2>{ user.name } - { user.age }</h2><div style={{ color: theme.color, fontSize: theme.size }}>主题</div></div> )
})
export default App

4、useReducer(了解)

  • useReducer 是useState 的一种替代方案
  • 在某些情况下,如果state 的处理逻辑比较复杂时,可以通过useReducer 来对其进行拆分
  • 或者这次修改的state 需要依赖之前的state 时,也可以使用
import { useReducer } from 'react'
function reducer(state, action) {switch(action.type) {case "increment"return { ...state, counter: state.counter + 1 }case "decrement"return { ...state, counter: state.counter - 1 }case "add_number"return { ...state, counter: state.counter + action.num }case "sub_number"return { ...state, counter: state.counter - action.num }}
}
const App = memo(() => {const [state,dispatch] = useReducer(reducer, {counter: 0})return (<div><h2>{state.counter}</h2><button onClick={e => dispatch({ type: "increment" })}>+1</button><button onClick={e => dispatch({ type: "decrement" })}>-1</button><button onClick={e => dispatch({ type: "add_number", num: 5 })}>+5</button><button onClick={e => dispatch({ type: "sub_number", num: 5 })}>-5</button></div>)
})

5、useCallback(性能优化)

  • useCallback 性能优化:当需要将一个函数传递给子组件时,最好使用useCallback 进行优化,将优化之后的函数传递给子组件
  • 在依赖不变的情况下,多次定义的时候,返回的值是相同的

当修改count 时,会影响子组件HYHome 重新渲染,当修改message 时,子组件不重新渲染

import { useCallback, useRef } from 'react'
const HYHome = memo(function(props) {// props 中的属性发生改变时,组件本身就会被重新渲染const { increment } = propsconsole.log("HYHome 被渲染")return (<div><button onClick={increment}>increment + 1</button></div>) 
})
const App = memo(function() {const [count, setCount] = useState(0)const [message, setMessage] = useState("hello")// 1. 闭包陷阱const increment = useCallback(function foo() {console.log("increment")setCount(count + 1)}, [count])// 2. 使用useRef 实现const countRef = useRef()countRef.current = countconst increment = useCallback(function foo() {console.log("inncrement")setCount(countRef.current + 1)}, [])// 3. 普通的函数const increment = () => {setCount(count +1)}return (<div><h2>计数: {count}</h2><button onClick={increment}>+1</button><HYHome increment={increment}/><h2>{ message }</h2><button onCick={e => setMessage(Math.random())}>修改message</button></div>)
})    

6、useMemo

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

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

相关文章

Linux:进程地址空间

目录 1.程序地址空间 2.进程地址空间 1.程序地址空间 我们在讲C/C语言的时候&#xff0c;32位平台下&#xff0c;我们见过这样的空间布局图 我们来验证一下这张图的正确性&#xff1a; int un_gval;int init_gval100;int main(int argc, char* argv[],char* env[]){//代码…

网络安全事件分级指南

文章目录 一、特别重大网络安全事件符合下列情形之一的&#xff0c;为特别重大网络安全事件&#xff1a;通常情况下&#xff0c;满足下列条件之一的&#xff0c;可判别为特别重大网络安全事件&#xff1a; 二、重大网络安全事件符合下列情形之一且未达到特别重大网络安全事件的…

Shell脚本 变量 语句 表达式

常见的解释器 #!/bin/sh #不推荐(了解) #!/bin/bash #!/usr/bin/python #!/bin/awk#!后跟的字符表示要启动的程序&#xff0c;该程序读取该文件执行。 #! 是一个约定的标记&#xff0c;它告诉系统这个脚本需要什么解释器来执行shell 函数 myShellName () {command1 }函数调用…

Linux: network: tcpdump:通过分析应该抓到包了,却没找不到的另一个原因:-s

最近又遇到一个类似的问题,也是在tcpdump抓到的包里没有找到应该看到的包,搞得很迷惑。这次是现场技术给研发挖了一个坑,给带偏了。研发自己抓包,发现根本就是没有丢在主机和虚拟机之间,也不是Linux内核丢掉了包。 那怎么回事呢?如果研发从主机上抓的没有问题,而是技术…

【计算机设计大赛作品】VR项目-中国古字贾湖刻字—信息可视化赛道获奖项目深入剖析【可视化项目案例-21】

🎉🎊🎉 你的技术旅程将在这里启航! 记得看本专栏里顶置的可视化宝典导航贴哦! 🚀🚀 本专栏为可视化专栏,包含现有的所有可视化技术。订阅专栏用户在文章底部可下载对应案例完整源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不论你…

前端实现一个时间区间内,再次单选功能,使用Antd组件库内日历组件Calendar

需求&#xff1a;需要先让用户选择一个时间区间&#xff0c;然后再这个时间区间中&#xff0c;让用户再次去单选其种特殊日期。 思路&#xff1a; 1.先用Antd组件库中日期选择DatePicker.RangePicker实现让用户选择时间区间 2.在选择完时间区间后&#xff0c;用这个时间区间…

从零开始 --- 创建vue项目

1、Vue脚手架创建项目 vue create home_vue 我选择了vue3 2、引入element-plus npm i element-plus vue2 对应 npm i element-ui main.js中 import { createApp } from vue import App from ./App.vue import ElementPlus from element-plus import element-plus/theme-…

英语中疑问句

一般疑问句 Is there any tea in the cup? Do you have any children? May I have some fish? Would you like some tea? Could you give me some advices? Shall we buy some vegetables? Should you do like this? Can I borrow some money from you? Why not have …

Spring框架知识总结

目录 1、Spring框架有哪些设计模式&#xff1f; 2、介绍一下Spring框架和SpringBoot框架&#xff1f; 3、介绍一下SpringBoot具有哪些功能模块&#xff1f; 4、Spring用到了什么组件&#xff1f; 5、什么是IoC? 什么是AOP&#xff1f; 6、SpringBoot运行原理&#xff1…

鸿蒙HarmonyOS开发用什么语言

1.网上流行一句有中国底蕴的话&#xff1a;鸿蒙系统方舟框架盘古大模型。都方舟框架了肯定主推的是ArkUI框架。其实还能使用C、Java和Js开发。 2.从API8开始&#xff0c;Java语言已经从鸿蒙开发剔除了&#xff0c;而官方推荐的是ArkTs.下图是ArkTS与TS、JS的关系。 ArkTs 是TS的…

BFS:八数码问题求解

八数码原题 剖析一下BFS BFS算法是一种图遍历算法&#xff0c;它从起点开始&#xff0c;逐层扩展搜索范围&#xff0c;直到找到目标节点为止。 BFS算法一般选择队列作为节点存储的数据结构&#xff0c;我们将搜索目标节点的问题抽象为寻找目标状态&#xff0c;那么队列…

Vue3 reative回显问题

1. reactive 在做项目的时候通常会遇到这种情况&#xff0c;比如我们有一个 Table 显示数据&#xff0c;添加 Table 数据的时候使用 dialog 弹出&#xff0c;在里面填写字段然后添加。 在 vue3 中&#xff0c;对于对象的响应式定义推荐使用 reactive &#xff0c;那么可以写入…

运筹学经典问题(二):最短路问题

问题描述 给定一个图&#xff08;有向图或无向图&#xff09; G ( V , E ) G (V, E) G(V,E)&#xff0c; V V V是图中点的集合&#xff0c; E E E是图中边的集合&#xff0c;图中每条边 ( i , j ) ∈ E (i, j) \in E (i,j)∈E都对应一个权重 c i j c_{ij} cij​&#xff08;…

Android取消深色适配

从Android10&#xff08;API 29&#xff09;开始&#xff0c;在原有的主题适配的基础上&#xff0c;Google开始提供了Force Dark机制&#xff0c;在系统底层直接对颜色和图片进行转换处理&#xff0c;原生支持深色模式。当系统设置深色主题背景或者进入省电模式情况下会进入深色…

2023年烟花爆竹经营单位主要负责人证模拟考试题库及烟花爆竹经营单位主要负责人理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年烟花爆竹经营单位主要负责人证模拟考试题库及烟花爆竹经营单位主要负责人理论考试试题是由安全生产模拟考试一点通提供&#xff0c;烟花爆竹经营单位主要负责人证模拟考试题库是根据烟花爆竹经营单位主要负责人…

C++ STL容器概览

容器概览 容器分类 顺序容器提供对元素&#xff08;半开&#xff09;序列的访问。 vectorlistforward_listdeque 关联容器提供基于关键字的关联查询。 有序关联容器&#xff1a;通常用平衡二叉树&#xff08;红黑树&#xff09;实现。 mapmultimapsetmultiset 无序关联容器&a…

NestJS使用gRPC实现微服务通信

代码仓库地址&#xff1a;https://github.com/zeng-jc/rpc-grpc-practice 1.1 基本概念 gRPC 基于 Protocol Buffers&#xff08;protobuf&#xff09;作为接口定义语言&#xff08;IDL&#xff09;&#xff0c;意味着你可以使用 protobuf 来定义你的服务接口&#xff0c;gRP…

【HDFS面试】HDFS面试题答案

题目 HDFS文件写入和读取流程 HDFS组成架构 介绍下HDFS&#xff0c;说下HDFS优缺点&#xff0c;以及使用场景 HDFS作用 HDFS的容错机制 HDFS的存储机制 HDFS的副本机制 HDFS的常见数据格式&#xff0c;列式存储格式和行存储格式异同点&#xff0c;列式存储优点有哪些? …

【环境搭建】Win10下安装Docker

下载地址 Docker Windows 桌面版下载地址 各镜像下载地址 可能遇到的问题 安装后一直显示以下文字 Starting the Docker Engine… Docker Engine is the underlying technology that runs containers 请尝试使用此方法&#xff1a;https://zhuanlan.zhihu.com/p/667495068

RGB颜色表示法(RGBA解释) 以及常见的色调

RGB&#xff1a;代表red&#xff0c;green&#xff0c;blue。即用这三个色调表示所有颜色。 表示方式如&#xff1a;&#xff08;255,255,255&#xff09;白色、&#xff08;0,0,0&#xff09;黑色 改变三个不同的数值可以得到不同的颜色&#xff0c;数值取值范围为0-255&#…