React hooks认知及使用

2023-11-12

Hook介绍

Hook 是 React 16.8 的新增特性。它是完全可选的,并且100%向后兼容。它可以让你使用函数组件的方式,运用类组件以及 react 其他的一些特性,比如管理状态、生命周期钩子等。从概念上讲,React 组件一直更像是函数。而 Hook 则拥抱了函数,同时也没有牺牲 React 的精神原则。

优点:

1、代码可读性更强,原本同一块功能的代码逻辑被拆分在了不同的生命周期函数中,容易使开发者不利于维护和迭代,通过 React Hooks 可以将功能代码聚合,方便阅读维护。
2、组件树层级变浅。
3、不用再去考虑 this 的指向问题。

缺点:

对一些钩子函数不支持。当下 v16.8 的版本中,还无法实现 getSnapshotBeforeUpdate 和 componentDidCatch 这两个在类组件中的生命周期函数。

Hook 规则

不在循环,条件或嵌套函数中调用 Hook, 确保总是在你的 React 函数的最顶层调用他们。
不在普通的 JavaScript 函数中调用 Hook,在 React 的函数组件或者自定义 Hook 中调用 Hook。

Hook API

useState	在函数组件中维护自己的状态
useEffect	在函数组件中实现生命周期钩子函数
useContext	用来处理多层级传递数据的方式,减少组件嵌套
useReducer	跟react-redux的使用方式一样,算是提供一个 mini 的 Redux 版本
useCallback	获得一个记忆函数,避免在某些情况下重新渲染子组件,用来做性能优化
useMemo	获得一个记忆组件,和useCallback非常类似,它适用于返回确定的值
useRef	生成对 DOM 对象的引用,它是一个真正的引用,而不是把值拷过去
useImperativeHandle	透传ref,用于让父组件获取子组件内的引用
useLayoutEffect	同步执行副作用,在页面完全渲染完成后,操作DOM

useState

在类组件中,我们使用 this.state来保存组件状态,并对其修改触发组件重新渲染。而在函数组件中,由于没有 this 这个黑魔法,可能通过 useState 来帮我们保存组件的状态。

import { useState, useEffect, useContext } from 'react';
export default () => {
  // state状态管理
  const [count, setCount] = useState(0)
  return <div>
    <h1>{count}</h1>
    <button onClick={() => setCount(count + 1)}>点击增加</button>
    <button onClick={()=>setCount(count-1)}>点击增加</button>
  </div>
}

useEffect

语法:useEffect(fn,Array)

第一个参数传递函数,可以用来做一些副作用比如异步请求,修改外部参数等行为。
第二个参数是个数组,数组中的值发生变化才会触发 useEffect 第一个参数中的函数。
如果第二个参数是个空数组的话,默认会在页面加载后执行一次。
如果第一个参数有返回值,会在组件销毁或者调用函数前调用。
可以使用useEffect模拟componentDidMount、 componentDidMount 和 componentWillUnmount钩子函数。

import React, { useState, useEffect } from "react";
function App(){
	const [count, setCount] = useState(0);
	useEffect(()=>{
	    //只要count有变化,就会执行这里
	},[count])
	
	useEffect(()=>{
	    //如果在下面没有参数的话,页面加载后执行,执行一次
	    return()=>{
	        //页面退出的时候执行
	    }
	},[])
}

useContext

用来处理多层级传递数据的方式,使用 useContext 可以解决 Consumer 多状态嵌套的问题

import React, { useContext } from "react";

const colorContext = React.createContext("gray");
function Bar() {
  const color = useContext(colorContext);
  return <div>{color}</div>;
}
function Foo() {
  return <Bar />;
}
function App() {
  return (
    <colorContext.Provider value={"red"}>
      <Foo />
    </colorContext.Provider>
  );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React hooks认知及使用 的相关文章

  • 浏览器视口大小(以设备像素为单位)

    Goal 我希望 Flash 能够获得有关浏览器视口宽度和高度 以设备像素为单位 的准确信息初始化 调整大小或浏览器缩放事件时 规格 我需要将 flash 嵌入到在 chrome safari firefox 等中运行的 html 页面中
  • Vue 3 Composition API 提供/注入在单文件组件中不起作用

    我正在使用 Composition API 在 VueJS 3 中创建一个库 我实现了提供 注入 如中所述docs https v3 vuejs org guide composition api provide inject html i
  • 在版本 4.4.6 中禁用 ckeditor 上下文菜单

    我在 Rails4 项目中使用 ckeditor 我尝试了 ckeditor gem 和 ckeditor rails gem 来提供 ckeditor 库 这里有多个帖子 人们希望删除 ckeditor 上下文菜单 以便可以显示本机浏览器
  • 为什么 window 与 Internet Explorer 中的 window.self 不同?

    关于我如何遇到这个问题有一个复杂的背景故事 但为什么self属性不完全等于窗口本身 在 Safari 和 Firefox 及其朋友中 结果如我所料 gt window window self true gt window window se
  • 通过 JavaScript 获取表单名称

    我有一个简单的问题 但我在网上找不到好的解决方案 我有这个 HTML 代码
  • 从 React Native Js 代码调用 Android Native UI 组件方法

    我创建了一个 CustomView SignatureView java 它扩展了 LinearLayout 以捕获 Android Native 中的签名 并创建了SignatureCapturePackage java和Signatur
  • 从回调中访问状态

    我在从回调访问组件状态时遇到问题 国家的价值num更改正确 但此类更改对于加载时定义的回调函数不可见 import React useState from react class MyObject callback gt void cons
  • JavaScript 验证和 PHP 验证?

    我正在使用 jquery 验证插件来验证空表单 我还应该在 PHP 中检查一下以确保 100 正确吗 或者用 javascript 验证就可以了 谢谢 您应该始终在服务器上进行验证 如果用户以某种方式不使用 Javascript 提交表单
  • React 中的 Reconciliation 详解

    我是 React JS 的新手 谁能准确解释和解是如何运作的 我尝试从 React 官方网站上理解它 但没有得到它 我是这样理解的 您会同意 React 使用组件使事情变得简单且更快 通过 JSX 我们可以让用户定义的组件变得更容易 一天结
  • 按下回车键时不刷新页面

    我遇到了一些问题 只要表单中有输入 回车键就会触发页面刷新 下面的代码 如果按下回车并且文本区域 input 中没有输入任何文本 则不会刷新页面 但是如果按下回车并且 input中有输入或者光标位于文本区域 我不确定是什么触发了它 因为 s
  • 使用 JavaScript 移动页面上的按钮

    我的按钮可以移动 但奇怪的是 我无法弄清楚偏移是否有问题 我希望我的按钮随着鼠标光标移动 但现在它的移动方式不是我想要的 有时它会消失 另外 创建的新按钮是重叠的 我不知道如何解决这个问题并拥有更好的外观 var coorA var coo
  • 创建反应应用程序:npm 错误!解析“...”附近时 JSON 输入意外结束

    描述错误 npx create react app my app不适合我 我试过npm cache clean force但我一次又一次地遇到同样的错误 重现步骤 npm cache clean force npm npx create r
  • 用于选择特定 div 中具有特定类的锚元素的 jQuery 选择器是什么

    我有一些这样的代码 我想选择每个 a 带有类的标签status在 div 中foo div a class status a div 你可以这样做 foo find status a
  • 如何使用 JavaScript 或 jQuery 克隆 HTML 元素的样式对象?

    我正在尝试克隆元素的样式对象 这应该允许我在更改后重置所述元素的样式 例如 el style left 50px curr style left 50px Modify the elements style The cloned style
  • 如何从浏览器向服务器发送“页面将关闭”消息?

    我想向每个 html 文档添加一个脚本 JavaScript 该脚本向服务器发送两条消息 页面确实打开了 页面将关闭 此消息包含页面打开的时间 打开消息应在文档加载时 或加载完成时 发送 这是简单的部分 The close message
  • 有没有办法使用 ko.observableArray 作为地图?

    有没有办法使用ko observableArray http knockoutjs com documentation observableArrays html像地图 字典一样 例如 var arr ko observableArray
  • Flot 库将 y 轴设置为最小值 0 和最大值 24

    如何将 y 轴设置在 0 到 24 的范围内 这是我的代码 j plot j placeholder d1 xaxis mode time min new Date 2010 11 01 getTime max new Date 2011
  • 仅当显式选择行时才关闭 ui-bootstrap typeahead

    我创建了这个jsBin http jsbin com livuqafe 2 edit来证明我遇到的问题 如果您转到此处 请尝试输入 五 并继续 你的自然反应是输入 五 然后按 Tab 如果你想要 五百 你可以向下箭头一次 但是 在这种情况下
  • 如何通过索引访问 JSON 对象中的字段

    我知道这不是最好的方法 但我别无选择 我必须通过索引访问 JSONObject 中的项目 访问对象的标准方法是只写this objectName or this objectName 我还找到了一种获取 json 对象内所有字段的方法 fo
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容

随机推荐

  • 传奇服务端GOM引擎和GEE引擎区别在哪里?

    关于GameOfMir跟GEE引擎之间的区别简单说Gom引擎支持了BDE数据库 Access数据库 而GEE目前还没有支持BDE数据库 mysql数据库可惜mysql数据库支持还不完善 引擎没有绝对的好坏主要是在使用上操作上功能都差不多今天
  • 【安利】mac免费开源文字识别-使用脚本和快捷指令-可识别中文(利用macOCR)

    前言 在mac上 常用的截图文本识别软件有TextScanner iText等等 但是它们都是付费的 这次我无意发现了利用脚本和苹果快捷指令就可以使用的开源截图文本识别软件 推荐给大家 github地址为 schappim macOCR G
  • word2vec中文相似词计算和聚类的使用说明及c语言源码

    word2vec相关基础知识 下载安装参考前文 word2vec词向量中文文本相似度计算 目录 word2vec使用说明及源码介绍 1 下载地址 2 中文语料 3 参数介绍 4 计算相似词语 5 三个词预测语义语法关系 6 关键词聚类 1
  • Django 运行报错 Manager isnt accessible via Category instances

    错误 Manager isn t accessible via Category instances 原因 views handler里面写错 category s Category objects all 正确的写法是 category
  • 如何运用krpano生成第一全景项目

    使用droplet制作 生成一个全景 下载好krpano包后 解压文件夹 可以看到文件夹下有诸多文件 这时打开全景图片 拖入 droplet bat 文件 马上立刻就生成一个全景项目文件了 打开新生成的文件夹 打开tour html文件 用
  • Linux磁盘分区UUID查看和修改

    查看磁盘的UUID 方法1 root ac810 blkid dev sda2 UUID 4e87d18b 3223 4f9d aa48 2bd450ad33d0 TYPE ext4 PARTUUID 337a99de 78d8 4d7d
  • R语言-画散点图

    plot 函数 plot cars dist cars speed y x main XXX 画标题 xlab XXX X坐标轴标题 ylab XXX Y坐标轴标题 xlim c 0 30 设置X轴范围为从0到30 ylim c 0 140
  • sklearn中的fit_transform、获取特征、标签转换

    skearn中有数据预处理的功能 如fit transform 和fit transform fit 求得训练集X的均值 方差 最大值 最小值 这些训练集X固有的属性 transform 在fit的基础上 进行标准化 降维 归一化等操作 f
  • Linux如何检查目录大小

    1 查看当前文件目录各个文件夹大小 du h max depth 1 查看指定目录 du h max depth 1 path 2 查看当前目录下所有目录及子目录大小 du h 代表当前目录下 也可以换成一个明确的路径 h表示用K M G的
  • 基于opencv-python的人脸识别和鸟图识别

    目录 图像识别 人脸识别 鸟图识别 一 人脸识别 即使是地铁挤压的人脸 也是有尊严的 值得被检测 经过 OpenCV 的努力 成功检测 左图是正常被识别的人脸 中图由于挤地铁人脸已不可识别 右图OpenCV单应性变换后 拯救了被miss的人
  • Docker部署Jupyter

    Docker部署Jupyter Docker安装 拉取镜像 docker pull jupyter base notebook 创建挂载目录 mkdir p opt jupyter jovyan chmod 777 opt jupyter
  • 利用 Python PyPDF2库轻松提取PDF文本(及其他高级操作)

    当需要从PDF文件中提取文本时 Python中的PyPDF2库是一个非常有用的工具 无论您是需要分析PDF文档中的内容还是需要在文档中搜索特定的信息 PyPDF2都可以帮助您轻松实现这些任务 在本文中 我们将探讨如何使用PyPDF2库提取P
  • Python编写时钟程序(运行结果在“视频“选项里)(适合学过编程2年00个月~2年11个月的人(中级篇))

    1 初始设置 from datetime import 导入相关库 from turtle import from time import sleep setup 675 675 设置窗口大小 hideturtle 隐藏海龟 mode lo
  • ElasticSearch 7.7.0 高级篇-搜索技术

    前言 有了前面的理论知识和上机实操的经验 那么下面我们将使用程序开发es 当然本篇说白了就是前面知识的总结和回顾 一 ES不分词 exact value 搜索 1 1 实战体验term filter各种不分词搜索 term filter q
  • LdapTemplate对AD域进行查询1000条记录限制,实测有效!

    公司的一个项目要从AD上取数据 但是用SpringLdap获取所有用户的时候会默认显示1000条数据 ldapTemplate search query base OU xxxx DC xxxx where objectclass is p
  • 数据压缩实验之 JPEG原理分析及JPEG解码器的调试

    文章目录 1 实验名称 2 实验目的 3 主要设备 4 实验内容 4 1 JPEG文件格式 4 2 JPEG编解码原理 4 2 1 编码流程 4 2 2 解码流程 5 实验步骤 5 1 逐步调试JPEG解码器程序 5 1 1 理解程序设计的
  • 传统机器学习和深度学习

    传统机器学习 传统机器学习从一些观测 训练 样本出发 试图发现不能通过原理分析获得的规律 实现对未来数据行为或趋势的准确预测 相关算法包括 逻辑回归 隐马尔科夫方法 支持向量机方法 K 近邻方法 三层人工神经网络方法 Adaboost算法
  • 计算机网络 二、网络协议

    一 定义 网络协议是计算机网络中互相通信的对等实体间交换信息时必须要遵守的规则的集合 二 划分层次 三 计算机的体系结构 3 1 具有五层协议的体系结构 具有五层协议的体系结构具 有五层协议的体系结构 1 应用层 application l
  • JNDI和数据库连接池

    1 JNDI 含义 JNDI Java Naming and Directory Interface java命名与目录的接口 是一个有关应用程序设计API 为开发人员提供了查找和访问各种命名和目录服务的通用 统一的接口 使用JNDI的步骤
  • React hooks认知及使用

    Hook介绍 Hook 是 React 16 8 的新增特性 它是完全可选的 并且100 向后兼容 它可以让你使用函数组件的方式 运用类组件以及 react 其他的一些特性 比如管理状态 生命周期钩子等 从概念上讲 React 组件一直更像