react中Hooks

2023-11-14

React Hook/Hooks是什么?

1 Hook是react 16.8版本增加的新特性/新语法
2 因为函数式组件没有this,使用hooks可以让函数式组件使用 state 以及其他的react 特性(比如生命周期钩子)

常见的Hook

(1) state Hook:React.useState()
(2) Effect Hook: React.useEffect()
(3) Ref Hook: React.useRef()
(4) Context Hook: React.useContext()

1. state Hook

  1. 让函数组件也可以有state状态,并进行状态数据的读写操作
  2. 语法:const [ xxx, setxxx] = React.useState(inintValue)
  3. useState()说明:
    参数:第一次初始化指定的值在内部作缓存,也就是虽然函数组件调用多次,初始值initValue只传一次,之后将解构出的状态作缓存
    返回值:包含2个元素的数组。第一个为内部当前状态,第二个为更新状态值的函数
  4. setxxx() 两种写法
    (1)setxxx(newValue):参数为非函数值,直接指定新的状态值,内部用其覆盖原来的状态值
    (2)setxxx(value => newValue) :参数为函数,接收原本的状态值,内部用其覆盖原来的状态值

案例:

function Demo() {
    // 调用useState() 当有多个状态时需要写多次useState
    const [count, setCount] = React.useState(0)
    const [username, setName] = React.useState('张三')
    // 点击事件回调
    function add() {
        setState(count => count+1)
    }
    function changeName() {
        setState('李四')
    }
    return (
        <div>
            <h1>当前和为:{count}</h1>
            <h1>当前用户为:{userName}</h1>
            <button onclick={add}>点击+1</button>
            <button onclick={changeName}>切换用户</button>
        </div>
    )
}

2. Effect Hook

  1. Effect Hook 可以让函数组件中执行副作用操作(类似类组件生命周期)
  2. react中副作用操作;
    发ajax请求获取数据
    设置订阅、启动定时器
    手动更改真实DOM
  3. 语法:
  React.useEffect(()=>{
     // 在此可以写附带作用操作
      let timer = setTimeout(() => {
          setCount(count => count+1)
      }, 1000)
      return() =>{ // 组件将要卸载前执行
          // 此处做一些收尾工作,如清除定时器、取消订阅等
          clearInterval(timer)
      }
  },[])

(1)useEffect()传 两个参数 第一个参数为函数 若函数中返回函数 这个返回的函数相当于执行componentWillUnmount(){}钩子,没有返回则不执行componentWillUnmount(){}钩子
(2) 当第二个参数不传,则相当于监听所有状态 相当于执行生命周期 componentDidMount(){}钩子和componentDidUpdate(){}钩子
(3)当第二个参数传[],则相当于什么也不监听 此时第一个参数相当于执行生命周期 componentDidMount(){}狗子
(4)当第二个参数传[XXX],则相当只监听XXX状态 只要XXX状态改变此时第一个参数相当于执行生命周期 componentDidMount(){}钩子和componentDidUpdate(){}钩子 ,若其余状态改变 不用执行componentDidUpdate(){}钩子

案例
案例场景:当页面一加载和每秒自增,点击卸载按钮卸载组件清空定时器

function Demo() {
    const [count, setCount] = React.useState(0)
    React.useEffect(()=>{
        // 在此可以写附带作用操作
        let timer = setTimeout(() => {
            setCount(count => count+1)
        }, 1000)
        return() =>{ // 组件将要卸载前执行
            // 此处做一些收尾工作,如清除定时器、取消订阅等
            clearInterval(timer)
        }
    },[])
    // 卸载组件回调
    function unmount() {
        // ReactDom.unmountComponentAtNode() 此方法为模拟卸载组件场景,用之前须引入 impont ReactDom from 'react-dom'
        ReactDom.unmountComponentAtNode(document.getElementById('root'))
    }
    return (
        <div>
            <h1>当前和为:{count}</h1>
            <button onclick={unmount}>卸载组件</button>
        </div>
    )
}

3. Ref Hook

  1. Ref Hook可以在函数组件中存储/查找组件内的标签或任意其他数据
  2. 语法:const myRef = React.useRef()
  3. 作用:保存标签对象,功能与类组件中React.createRef()一样

案例

function Demo() {
    const myRef = React.useRef()
    // 提示按钮回调
    function add() {
      alert(myRef.current.value)
    }
    return (
        <div>
            <input type="text" ref={myRef} />
            <button onclick={showValue}>提示输入框内容</button>
        </div>
    )
}

4. Context Hook

useContext()是用来处理多层级传递数据的方式。其主要用于解决函数组件之间传值的问题
步骤:
1. 首先要进行导入createContext,useContext
2. 在子组件中使用useContext进行接收父组件传递的上下文
3. 创建一个上下文全局变量
4. 在父组件将值传递过去,Provider 相当于提供者

案例

// 首先要进行导入createContext,useContext
import React,{useState,createContext,useContext} from 'react'
function Child(){
//在子组件中使用useContext进行接收父组件传递的上下文,这样值就能传递过来了
    const count1=useContext(CountContext)
    return (
        <h1>{count1}</h1>
    )
}
// 创建一个上下文全局变量
const CountContext=createContext()
function Example3(){
    const [count,setCount]=useState(0)

    function handleClick(){
        setCount(count+1)
    }
   
    return (
        <div>
            点击{count}
            <button onClick={handleClick}>clickme</button>
            // 其次是作为父组件将值传递过去,Provider 相当于提供者,Child是子组件
            <CountContext.Provider value={count}>
                <Child></Child>
            </CountContext.Provider>
        </div>
    )
}
export default Example3

还有更多hook 有待后期补充

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react中Hooks 的相关文章

随机推荐

  • 【Linux】---文件基础I/O

    文章目录 回顾C语言文件操作接口 文件相关的系统调用接口 打开和关闭文件 文件的打开方式 文件描述符 文件描述符的分配规则 write read 重定向 dup2 mysell 回顾C语言文件操作接口 在C语言中对于文件的操作有着几个常用的
  • retinaface人脸对齐

    yolov5 face 人脸对齐 yolov5 face align rar 深度学习文档类资源 CSDN下载 GitHub foamliu MobileFaceNet PyTorch PyTorch implementation of M
  • 高等数学教材啃书汇总重难点(三)微分中值定理与导数的应用

    本章节包含多个知识点 一些列微分中值定理是考研证明题的重头戏 而洛必达和泰勒展开则是方法论的天花板难度 虽然对于小题的考察难度较低 整体上仍需重点复习 1 费马引理 2 罗尔定理 3 拉格朗日定理 4 柯西中值定理 5 洛必达法则 6 泰勒
  • 求一个4*4矩阵两对角线元素之和 设计一个程序

    提示你一下 但是只应该加一次 中间行的对角线元素重叠 由于当n是奇数的时候 每行上对角线元素的序号相加是n 1 对角线的元素在每行上的分布是规律的 共n行 不过思想是从行出发 矩阵由数组array n n 表示for int i 0 i
  • 用C语言解“计算工资”题

    7 10 计算工资 某公司员工的工资计算方法如下 一周内工作时间不超过40小时 按正常工作时间计酬 超出40小时的工作时间部分 按正常工作时间报酬的1 5倍计酬 员工按进公司时间分为新职工和老职工 进公司不少于5年的员工为老职工 5年以下的
  • Vue3全局提示(Message)

    Vue2全局提示 Message 可自定义设置以下属性 自动关闭的延时 duration 类型 number 单位ms 默认 3000ms 消息距离顶部的位置 top 类型 number 单位px 默认 30px 调用一次只展示一个提示 调
  • datax源码解析-任务拆分机制详解

    datax源码解析 任务拆分机制详解 写在前面 此次源码分析的版本是3 0 因为插件是datax重要的组成部分 源码分析过程中会涉及到插件部分的源码 为了保持一致性 插件都已大部分人比较熟悉的mysql为例子说明 本文我们来看看datax的
  • [云原生专题-22]:K8S - 集群编排工具K8S与SWARM比较与技术选择

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122750196 目录 前言 第1章
  • Tomcat安装及IDEA配置Tomcat教程

    Tomcat安装 以Tomcat8 5为例 1 网站链接 Apache Tomcat Apache Tomcat 8 Software Downloads 根据个人喜好 我安装的是8 5版本 2 下载完解压即可 我的安装目录为 E Envi
  • R语言入门(一)

    R语言入门 一 在vscode中使用R语言注意事项 按照其他教程安装配置插件 使用run source运行r代码 使用run code 会报错 原因未知 生成正态分布的点数据 import pandas as pd import numpy
  • win7+ VS2010安装CUDA7.0图文说明

    win7 VS2010安装CUDA7 0图文说明 1 查看本机配置 查看显卡类型是否支持NVIDIA GPU 选中计算机 gt 右键属性 gt 设备管理器 gt 显示适配器 NVIDIA GeForce GT 610 从https deve
  • Servlet 基础知识(4)(利用Servlet实现文件上传功能)

    目录 1 DiskFileUpload 类 1 setSizeMax 方法 2 setSizeThreshold 方法 3 setRepositoryPath 方法 4 parseRequest HttpServletRequest req
  • TOOLS_Python获取音域范围

    基于librosa pyin方法 链接 获取基频最值 对比标准音高序列 得到音域范围 def create standard pitch sequence 生成一个包含名称的标准音高序列 T C C D D D E E F F G G G
  • 第七届蓝桥杯省赛C++B组 最大比例

    最大比例 X星球的某个大奖赛设了M级奖励 每个级别的奖金是一个正整数 并且 相邻的两个级别间的比例是个固定值 也就是说 所有级别的奖金数构成了一个等比数列 比如 16 24 36 54 其等比值为 3 2 现在 我们随机调查了一些获奖者的奖
  • sublime text3 安装 golangsublime 配置

    1 安装git 因为golang是通过git来管理远程包的 所以我们首先要安装git 下载地址 http www git scm com download git安装比较简单 直接下一步即可 在Windows Explorer integr
  • Spring Boot:如何配置Undertow容器?不会我教你

    环境说明 Windows10 Idea2021 3 2 Jdk1 8 SpringBoot 2 3 1 RELEASE 一 前言 作为springboot开发者 使用最多的就是Tomcat 这是springboot默认的容器技术 而且是内嵌
  • MyEclipse修改.properties文件的编码

    MyEclipse中新建一个messageResource properties文件 如果输入中文保存时就会提示错误 Save could not be completed Reason some characters cannot be
  • 京东零售大佬为你讲解:黑盒测试的底层逻辑

    什么是黑盒测试 它是把程序看作一个黑盒子 在不考虑程序内部结构的情况下 检查程序功能是否按照PRD的规定正常使用 程序是否能适当地接收输入数据 产生正确的输出 这其实就是黑盒测试的定义 也是黑盒测试的底层逻辑 一般人不会重视定义 但往往就是
  • html5 canvas(小树姐的牛掰到爆了的作品)

    自从小树嫁了个牛逼的前端之后 canvas的境界超过我了 小树demo 小编表示 这个境界 这个几何 让我有种跪舔的感觉 http www wow trend com brand index shtml 这个hover让我彻底凌乱了 div
  • react中Hooks

    React Hook Hooks是什么 常见的Hook 1 state Hook 2 Effect Hook 3 Ref Hook 4 Context Hook React Hook Hooks是什么 1 Hook是react 16 8版本