react hook(基础详解)

2023-11-19

首先我们知道Hook是可以100%向下兼容的,就是说即便在你以前的代码中加入hook写法也没有问题,同时提供了一个更直接的API包括props, state,context,refs以及生命周期,hook编写时使用的代码量也会更少,但这也是一个过渡,hook的使用去掉了class的概念,虽然以前的写法依旧可行,但新增hook的同时官方也表示没有计划移除class,这对程序员来说是很友好的,但react更推荐用户使用hook来编写代码

首先我们看一下state在传统和hook中的使用方式区别

首先演示第一个hook:

State Hook

下面用两种写法表现同样的计数器
传统:

import React from 'react'
export default class extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            count: 0,
        }
    }
    //添加数字并刷新
    add(){
        let {count} = this.state
        this.setState({
            count:count+1
        })
    }

    render() {
        return <div onClick={()=>this.add()}>
            {this.state.count}
        </div>
    }
}

Hook:(方括号中的时候第一个参数就是自定义的state元素,可以通过第二个自定义方法来刷新这个state)

import React,{useState} from 'react'
const Main = (props) =>{
    //方括号中第一个参数就是自定义的state元素,可以通过第二个自定义方法来刷新这个state
    const [count,setCount] =useState(0)
    function add() {
        setCount(count+1)//刷新count值
    }
    return (
        <div onClick={()=>add()}>{count}</div>
    )
}
export default Main

在这里我们使用hook中自定义的setCount()替换了传统的setState({})

我们可以看到使用了Hook之后Main变成了一个函数,但这个函数却有自己的状态(count),同时它还可以更新自己的状态(setCount)这两个写法可以显示一个同样的计数器效果,但是可以明显感觉出来hook写出来的更简洁,更明晰。

组件函数的写法有两种:

function Main(props) {
  return <div />;
}

或者箭头函数

const Main= (props) => {
  return <div />;
}

当然,如果我们想要使用多个state 变量,它允许我们给不同的 state 变量取不同的名称:

// 声明多个 state 变量
  const [age, setAge] = useState(42);
  const [fruit, setFruit] = useState('banana');

Effect Hook

在使用前我们还是要先引入useEffect

import React, { useState, useEffect } from 'react';

这个hook可以让你在函数组件中执行副作用操作 简单来说如果你以前了解react的生命周期,那么你就可以把useEffect Hook 看做componentDidMount,componentDidUpdate 和 componentWillUnmount 这三个函数的组合

接下来我们在前面使用hook写的计数器的基础上把useEffect放进去

import React,{useState,useEffect} from 'react'
function Main(props){
    //方括号中第一个参数就是自定义的state元素,可以通过第二个自定义方法来刷新这个state
    const [count,setCount] =useState(0)
    
    useEffect(() => {
        console.log(count)
    });
    //添加
    function add() {
        setCount(count+1)//刷新count值
    }
    return (
        <div onClick={()=>add()}>{count}</div>
    )
}
export default Main

这样就可以大家不难发现useEffect 会在每次渲染后都执行

使用effect时有一些副作用是需要清除的,例如订阅外部数据源

这种情况就可以这样清除

useEffect(() => {
    //使用需要结束后清除的方法
    /*...*/
    return function cleanup() {
       //在这里清除
        /*...*/
    };
});

Hook规则:

1.只在最顶层使用 Hook
2.只在 React 函数中调用 Hook

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

react hook(基础详解) 的相关文章

  • JavaScript 中的“new”关键字是什么?

    The newJavaScript 中的关键字第一次遇到时可能会很混乱 因为人们倾向于认为 JavaScript 不是面向对象的编程语言 它是什么 它解决什么问题 什么时候合适 什么时候不合适 它做了 5 件事 它创建一个新对象 这个对象的
  • 使用 npm 作为构建工具连接文件

    我最近发现我可以使用 npm 作为任务运行程序 而不是 gulp 或 grunt 到目前为止 一切都很棒 lint stylus jade uglify watch 等 但串联部分 我似乎无法实现 gulp 是这样的 gulp task s
  • 有没有办法监控页面上运行的 JavaScript 函数?

    有没有办法查看页面上正在执行哪些功能 如果我在页面上加载外部脚本 是否可以动态更改函数的功能或阻止其运行 HTML5 http www w3 org TR html5 scripting 1 html establish script bl
  • 将数组转换为具有默认值的对象的更简洁方法? (洛达什可用)

    我有一个数组 比如说 a b c 我想将其转换为一个对象 该对象以数组值作为键和我可以设置的默认值 所以如果默认值是true 我希望我的输出是 a true b true c true 下面的代码是否有更简洁的版本来实现此目的 var my
  • Typescript:如何在自定义过滤器中使用角度 $filter

    如何在自定义过滤器中使用 Angular filter 如何注入 filter依赖 module Filters export class CustomFilter public static Factory return function
  • 在 IE10 中禁用捏合放大

    在 IE10 触摸模式下 我希望仅使页面的特定部分可缩放 其余的不应该 我找到了这个 http msdn microsoft com en US library ie hh772044 aspx http msdn microsoft co
  • canvas.getContext('2D') 返回空值

    我创建了一个画布并将其命名为getContext 方法 但它返回null为上下文 这是我使用的代码 我在控制台中得到了这个
  • 如何将函数传递给 JavaScript Web Worker

    我想通过一个 或多个 函数传递postMessage 给网络工作者 因为我无法引用常规文件 为了启动 Web Worker 我将一个对象 URL 从 Blob 创建 传递给Worker构造函数 然后我传递一条消息 但到目前为止还没有在消息中
  • 在 php、ajax 或 javascript 中加载进度?

    任何人都知道如何在系统仍在服务器端获取数据的同时在客户端显示加载进度以及完成的百分比 例如 当我在客户端按下 确定 按钮时 它会调用服务器端从数据库收集数据 整个过程可能需要2到3分钟 如何在客户端显示加载进度 大约加载完成了多少 我怎样才
  • 如何检查元素的内容是否为空,如果是,则在 jquery 中删除该元素

    我目前正在尝试选择某个 div 内没有内容的任何 h2 元素并将其删除 这是我的 html 代码 div class skipToContainer h2 class vidSkipTo Hello h2 h2 class vidSkipT
  • 更改时触发跨度文本/html

    jQuery 或 JavaScript 中是否有任何事件在以下情况下触发span标签 text html 已更改 Code span class user location span user location change functio
  • 无法在渲染器进程中使用 Node.js API

    无法在 Electron 中使用任何与 Electron 或节点相关的操作 未定义获取错误过程 我检查了他们指导添加节点支持的各个地方 但这已经完成了 所以卡在这里 我的主要应用程序代码是 const electron require el
  • 如何将当前元素传递给 Knockout.js 绑定中的 Javascript 函数?

    因此 我尝试根据是否选中子复选框 使用 Knockout js 将类添加到元素 为此 我试图通过this作为我的函数的参数 目前 我的精简 DOM 结构如下 tr td td tr
  • HTML 和 JavaScript - 将滚动操作从一个元素传递到另一个元素

    假设我有两个 div div div div A scrollable list div 我想让它当光标停在里面时 control并且鼠标滚轮滚动 view将会滚动 无论如何要实现这一目标 好的 快速修复对我有用 即使固定 div 不可滚动
  • (0, eval) () 的作用是什么? [复制]

    这个问题在这里已经有答案了 以下内容来自这个问题 https stackoverflow com questions 14119988 return this 0 evalthis 14120023 14120023 function q
  • `ie9` - contenteditable false 在父级可编辑时不起作用

    我正在尝试制作内容可编辑和不可编辑的容器 用户可以通过 3 种方式使用它 他们可以将内容与non editable 他们可以将内容与editable 他们可以在不选择其中之一的情况下放置内容 可编辑 我正在努力实现以下目标 content
  • JavaScript 中最长的通用前缀

    我正在尝试解决 Leet Code 挑战14 最长公共前缀 https leetcode com problems longest common prefix 编写一个函数来查找字符串数组中最长的公共前缀字符串 如果没有公共前缀 则返回空字
  • 跨浏览器:禁用输入字段的不同行为(文本可以/不能复制)

    我有一个被禁用的输入 html 字段 在某些浏览器 Chrome Edge Internet Explorer 和 Opera 中可以选择并复制文本 但至少在 Firefox 中这是不可能的 您可以通过在不同浏览器中执行以下代码来测试
  • 使用 JavaScript onclick 添加表格行

    我正在尝试使用 javascript 添加下面找到的完全相同的元素 我已经尝试了这里找到的所有解决方案 我什至尝试用php echo但没有运气 无需更改任何输入名称或类似内容 只需单击该按钮即可向表中添加另一行 仅此而已 这是该元素 tr
  • NodeJS:如何获取服务器的端口?

    您经常会看到 Node 的示例 hello world 代码 它创建一个 Http Server 开始侦听端口 然后执行以下操作 console log Server is listening on port 8000 但理想情况下你会想要

随机推荐

  • SQL server 查询语句大全

    在 SQL Server 中 查询语句是最常用的语句类型 用于从数据库中提取有用的信息 SQL Server 中常用的查询语句有 SELECT FROM WHERE GROUP BY HAVING 和 ORDER BY 1 SELECT S
  • 【数电】常用时序逻辑电路模块总结

    文章目录 同步置零和异步置零 同步预置数和异步预置数 一 移位寄存器 I D触发器构成的4位移位寄存器 II 双向移位寄存器 74HC194 二 计数器 I 同步计数器 i 同步二进制计数器 1 同步二进制加法计数器 74161 2 同步二
  • iOS中自动消失提示框的实现

    iOS中自动消失提示框的实现 添加一个提示框 UIAlertView alert UIAlertView alloc initWithTitle 提示 message 你很漂亮 delegate self cancelButtonTitle
  • chrome浏览器安装失败,已解决(方便)

    原因分析 如果是第一次安装 一般都会安装成功 倘若报错后安装失败 说明之前电脑上存在Google Chrome 谷歌浏览器 安装的残余 导致再次安装时 无法将安装的数据正常的写入注册表 因为在软件安装过程中 都会将必要的文件添加到注册表中
  • 大数据学习之Scala——02Scala基础

    一 杂项 1 Scala语言输出的三种方式 字符串通过 号连接 类似java printf用法 类似C语言 字符串通过 传值 格式化输出 字符串插值 通过 引用 类似PHP println name name age age url url
  • dosbox中out of memory_在Rust中实现goto逻辑

    众所周知 在Rust中是没有goto表达式的 最近在 试着用Rust练习翻新一些古代陈旧代码 结果这堆古代的pascal代码中就有很多goto语句 于是写了几个宏来模拟了一下 在这里也写一篇文章介绍一下 希望给大家在思路上有所帮助 如果不想
  • ​​PMP项目管理—第3章 项目经理的角色。

    PMBOK项目管理知识体系指南 PMP项目管理学习笔记 总 第1章 引论 第2章 项目运行环境 第3章 项目经理的角色 第4章 项目整合管理 第5章 项目范围管理 第6章 项目进度管理 第7章 项目成本管理 第8章 项目质量管理 第9章 项
  • c/c++入门教程 - 1.基础c/c++ - 1.0 Visual Studio 2019安装环境搭建

    推荐视频课程 https www bilibili com video BV1et411b73Z p 2 已投币三连 b站果然是个学习的网站 本来是想在linux环境下运行QT 于是先学了几个月linux嵌入式驱动开发 后来发现太底层了 与
  • 【FPGA】面试问题及答案整理合集

    面试问题及答案整理合集 1 硬件描述语言和软件编程语言的区别 2 FPGA选型问题 3 建立时间和保持时间问题 3 亚稳态问题 4 竞争和冒险问题 5 乒乓操作问题 6 同步和异步逻辑电路 7 同步复位和异步复位 8 MOORE 与 MEE
  • CUDA异步并发之CUDA流详解

    CUDA中得异步并发 CUDA 将以下操作公开为可以彼此同时操作的独立任务 在主机上计算 设备上的计算 从主机到设备的内存传输 从设备到主机的内存传输 在给定设备的内存中进行内存传输 设备之间的内存传输 这些操作之间实现的并发级别将取决于设
  • 《Transfer Adaptation Learning: A Decade Survey》阅读笔记

    摘要 传统机器学习的目的是通过最小化训练数据的正则化经验风险 对测试数据的最小期望风险最小的模型 但假设训练数据和测试数据具有相似的联合概率分布 TAL的目标是通过从语义相关但分布不同的源域学习知识 来建立能够执行目标域任务的模型 在经典的
  • MySQL必知必会——第四章检索数据

    检索数据 本章将介绍如何使用SELECT语句从表中检索一个或多个数据列 SELECT语句 SQL语句是由简单的英语单词关键字构成的 每个SQL语句都由一个或多个关键字构成 最常用的SQL语句就是SELECT语句 它的用途是从一个或多个表中检
  • cycleGan的算法流程实现

    关于cycleGan的算法流程实现 只是看代码后进行了总结 具体细节可以自行寻找代码查看
  • mybatis逆向工程详细配置讲解(全)

    目录 前言 1 配置文件 2 GeneratorMapper xml 3 启动配置 4 生成文件讲解 5 细节 前言 使用mybatis提供的逆向工程生成实体bean 映射文件 Dao接口 而不用人为的去书写代码 显得比较麻烦 具体代码模块
  • ThreadPoolExecutor是如何处理任务的异常情况

    本文因生产环境线程池某些场景下的任务异常后 日志文件中没有被记录进来产生的困惑引发的思考 当然如果所有异步的业务方法run里面都加上一层try catch 就可以主动捕获所有的异常 也能够记录到日志文件中 然而总有一些人总有一些时候不小心漏
  • workbench连接mysql出现not connected

    用workbench管理工具连接mysql SCHEMAS下显示not connected Information中的Connection下显示NO CONNECTION 如下图 原因是Mysql服务没启动 解决方法 鼠标右键点击 计算机
  • 【python基础知识】13.类与对象(四)

    类与对象 四 前情回顾 类的继承 类的定制 类的继承 要怎么写 类的继承之多层继承 类的继承之多重继承 多层继承VS多重继承 练习题 类的定制 要怎么写 定制 可以新增代码 定制 也可重写代码 结语 前情回顾 之前 我们知道了面向对象编程的
  • 求一个数的所有的质因子。

    一个数的因子 一定有质因子组成 所有的质因子就可以代表这些因子 cin gt gt x vector
  • PM> Install-Package

    PM gt Install Package jQuery Version 1 10 2 To install jQuery run the following command in the Package Manager Console P
  • react hook(基础详解)

    首先我们知道Hook是可以100 向下兼容的 就是说即便在你以前的代码中加入hook写法也没有问题 同时提供了一个更直接的API包括props state context refs以及生命周期 hook编写时使用的代码量也会更少 但这也是一