React Hooks 入门基础(详细使用)

一、简介

  • hooks 的本质:一套能够使函数组件更强大,更灵活的 “钩子”

  • React 体系里组件分为 类组件函数组件

    • 经过多年的实战,函数组件是一个更加匹配 React 的设计理念 UI = f(data),也更有利于逻辑拆分与重用的组件表达形式,而先前的函数组件是不可以有自己的状态的,为了能让函数组件可以拥有自己的状态,所以从react v16.8 开始,Hooks 应运而生。

    • 有了 hooks 之后,为了兼容老版本,class 类组件并没有被移除,俩者都可以使用。

    • 有了 hooks 之后,不能在把函数成为无状态组件了,因为 hooks 为函数组件提供了状态。

    • hooks 只能在函数组件或者自定义 hook 中使用,不能嵌套if/for/其他函数中react 会按照 hooks 的调用顺序识别每个 hook)。

  • hooks 解决了什么问题?

    • 组件的逻辑复用

      hooks 出现之前,react 先后尝试了 mixins 混入,HOC 高阶组件,render-props 等模式,但是都有各自的问题,比如 mixin 的数据来源不清晰,高阶组件的嵌套问题等等

    • class 组件自身的问题

      class 组件就像一个厚重的 战舰 一样,大而全,提供了很多东西,有不可忽视的学习成本,比如各种生命周期,this 指向问题等等,而更多时候需要的是一个轻快灵活的 快艇

  • hooks 让函数组件拥有了类组件的特性,例如组件内的状态、生命周期等,常用的有:

    • useState

    • useEffect

    • useRef 详细使用

    • useContext 详细使用

二、useState 使用

  • 基础案例

    import React, { useState } from "react";
    
    // 函数组件
    function Sub () {
      // 参数:状态初始值(传入 0 表示该状态的初始值为 0)
      // 返回值:数组(包含两个值:1、状态值(state)2、修改该状态的函数(setState))
    
      // 状态值名字可以自定义吗?可以自定义保持语义化
      // 返回值的顺序是否可以替换?不可以,第一个就是数据状态,第二个就是修改数据的函数
    
      // 组件的更新过程 与 当调用 setCount 的时更新过程:
    
      // 》首次渲染
      // 首次被渲染的时候,组件内部的代码会执行一次
      // 其中 useState 也会跟着执行,这里重点注意,初始值只在首次渲染时生效
    
      // 》更新渲染,调用 setCount 整个 app 中代码都会更新
      // 1、app 组件会再次渲染,这个函数会再次执行
      // 2、useState 再次执行,得到新的 count 值不是 0 而是修改之后的 1,模版会用新值渲染
      const [count, setCount] = useState(0)
      // 可以通过输出 count 验证
      console.log(count)
    
      // useState 可以执行多次
      const [list, setList] = useState([])
    
      // 点击方法
      function touchButton () {
        // 函数中不能写,会报错的
        // const [flag, setFlag] = useState(true)
        // + 1
        setCount(count + 1)
      }
    
      return (
        <button onClick={touchButton}>{count}</button>
        // <button onClick={() => setCount(count + 1)}>{count}</button>
      )
    }
    
    class App extends React.Component {
      render () {
        return (
          <div>
            <Sub></Sub>
          </div>
        )
      }
    }
    
    export default App
    
  • 函数方式

    import React, { useState } from "react";
    
    function getDefaultValue () {
      // 耗时操作
      for (let index = 0; index < 20000; index++) {
      }
      // 返回结果
      return 10
    }
    
    // 函数组件
    function Sub (props) {
      const [count, setCount] = useState(() => {
        // return props.count
        return getDefaultValue()
      })
      return (
        <button onClick={() => setCount(count + 1)}>{count}</button>
      )
    }
    
    class App extends React.Component {
      render () {
        return (
          <div>
            <Sub count={10}></Sub>
          </div>
        )
      }
    }
    
    export default App
    

二、useEffect 使用

  • 理解函数副作用,什么是副作用?

    副作用是相对于主作用来说的,一个函数除了主作用,其他的作用就是副作用。对于 React 组件来说,主作用就是根据数据(state/props)渲染 UI,除此之外都是副作用。

  • 常见的副作用

    • 数据请求 ajax 发送

    • 手动修改 dom

    • localstorage 操作

    • useEffect 函数的作用就是为 react 函数组件提供副作用处理的!

  • 简单案例:

    import React, { useEffect, useState } from "react";
    
    // 函数组件
    function Sub () {
      const [count, setCount] = useState(0)
      // 例如:count 的主作用就是更换按钮中的内容,但是当需要用到它的副作用时,需要在 useEffect 函数中实现它副作用效果
      useEffect(() => {
        console.log('副作用函数调用了')
        // 副作业函数会每次数据变化都执行,默认是全部属性的副作用都会调用该函数,可以指定
        // 例如:当它初始化或变化时设置为网页标题,这就是副作业
        document.title = count
      })
      return (
        // 这是 count 的主作用
        <button onClick={() => setCount(count + 1)}>{count}</button>
      )
    }
    
    class App extends React.Component {
      render () {
        return (
          <div>
            <Sub></Sub>
          </div>
        )
      }
    }
    
    export default App
    
  • 添加空数组,只在组件首次渲染时执行一次

    useEffect(() => {
        console.log('副作用函数调用了')
        document.title = count
    }, [])
    
  • 指定属性副作业执行,首次渲染时也会执行

    // 函数组件
    function Sub () {
      const [count, setCount] = useState(0)
      const [name, setName] = useState('dzm')
      // 指定 count/name 会有副作用回调,首次渲染也会回调
      useEffect(() => {
        console.log('副作用函数调用了')
        document.title = count
        // 此时什么时候会执行副作用函数?初始化 + count/name被修改时都会执行
      }, [count, name])
      
      // 可以写多个副作用函数
      // useEffect(() => {
      //   console.log('count 副作用函数调用了')
      // }, [count])
      // useEffect(() => {
      //   console.log('name 副作用函数调用了')
      // }, [name])
      
      return (
        <>
          <button onClick={() => setCount(count + 1)}>{count}</button>
          <button onClick={() => setName('test')}>{name}</button>
        </>
      )
    }
    
  • 注意:useEffect 回调函数中用到的数据(比如: count),也就是依赖数据,就应该出现在依赖项数组中,如果不添加依赖项会有 bug 出现,就算不是通过 useState 创建的属性也需要添加到数组中。

  • 清理副作用

    使用场景:在组件被销毁时,如果有些副作用操作需要被清理,就可以使用这种方式(比如常见的 定时器)。

    如果想要清理副作用,可以在副作用函数中的末尾 return 一个新的函数,在新的函数中编写清理副作用的逻辑,注意执行时机为:

    • 组件卸载时自动执行

    • 组件更新时,下一个 useEffect 副作用函数执行之前自动执行

    import { useEffect, useState } from "react"
    
    const App = () => {
      const [count, setCount] = useState(0)
      useEffect(() => {
        const timer = setInterval(() => {
          setCount(count + 1)
        }, 1000)
        return () => {
          // 用来清理副作用的事情
          clearInterval(timer)
        }
      }, [count])
      return (
        <div>{count}</div>
      )
    }
    
    export default App
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬虫学习(网页解析)

目录 了解&#xff1a; 参考图 介绍 bs4库&#xff1a; 解析器&#xff1a; 解析方法 代码示例 lxml库&#xff1a; 解析器 解析方法 代码示例 了解&#xff1a; 参考图 (1) html解析器&#xff1a; (2) 解析方式&#xff1a; 介绍 ### 前言&#xff1a; 网页…

财政分权数据集:省级地级市财政分权度(1999-2021年)

财政分权是指中央政府和地方政府在财政收入和支出方面各自拥有一定的自主权&#xff0c;即政府财政权力在中央和地方之间进行分割和分配的一种制度安排。财政分权的实施可以促进地方政府的责任感和创造力&#xff0c;提高政府的效率和服务水平&#xff0c;同时也可以增强地方政…

蓝桥杯嵌入式第十三届(第二套客观题)

文章目录 前言一、题目1二、题目2三、题目3四、题目4五、题目5六、题目6七、题目7八、题目8九、题目9十、题目10总结前言 本篇文章继续讲解客观题。 一、题目1 这个其实属于送分题,了解嵌入式或者以后想要入行嵌入式的同学应该都对嵌入式特点有所了解。 A. 采用专用微控制…

KDZD-JP简易式机械碰撞试验台

一、产品制作标准 依据高压开关标准要求制作&#xff1a;GB7251-2013《低压成套开关设备和控制设备》、GB3906-2006 《3.6KV-40.5KV 交流金属封闭开关设备和控制设备》、GB/T 11022—2011《高压开关设备和控制设备标准的共用技术要求》、GB/T 1984—2014 《高压交流断路器》、…

全网最细的自定义类型详解(结构体,枚举,联合),友友们快来接收吧

各位csdn的友友们肯定都掌握了c语言中char&#xff0c;short, int, long, float, double的类型,这些都是我们c语言中的一些内置类型&#xff0c;其实c语言是可以允许我们创造一些类型的&#xff0c;今天阿博就带领友友们一起掌握这些新的自定义类型&#x1f60a;&#x1f60a;&…

[Java Web]Session | 一文详细介绍会话跟踪技术中的Session

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;Java Web 目录Session1、介绍2、工作流程3、工作原理4、基本使用5、Session的钝化与活化5.1、提出问题5.2、&…

【C语言蓝桥杯每日一题】—— 递增序列

【C语言蓝桥杯每日一题】—— 递增序列&#x1f60e;前言&#x1f64c;递增序列&#x1f64c;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01;&#xff01;&#xff01; &#x1f60a;作者…

软考中级-软件工程

1 软件过程1.1 能力成熟度模型&#xff08;CMM&#xff09;初始&#xff08;混乱&#xff09;->可重复&#xff08;建立基本、重复以往&#xff09;->已定义&#xff08;文档化、标准化&#xff09;->已管理&#xff08;制定产品质量标准&#xff09;->优化&#x…

HTML5 SSE

HTML5 服务器发送事件(Server-Sent Events) 服务器发送事件&#xff08;Server-sent Events&#xff09;是基于 WebSocket 协议的一种服务器向客户端发送事件和数据的单向通讯。 HTML5 服务器发送事件&#xff08;server-sent event&#xff09;允许网页获得来自服务器的更新。…

快速将PDF转换为图片:免费的在线PDF转换器

在现代数字时代&#xff0c;PDF是一种非常常见的文件格式。它们在学术界&#xff0c;商业领域和许多其他领域中被广泛使用。有时&#xff0c;您可能需要将PDF文件转换为图像格式&#xff0c;以便能够方便地与他人共享和使用。在这种情况下&#xff0c;您可以使用免费的在线PDF转…

PyCharm 配置sqlite3驱动

在PyCharm中可以查看sqlite3数据库&#xff0c;具体要如何做呢&#xff1f; 数据库入口 打开PyCharm&#xff0c; 在最右侧&#xff0c;有一个Database的表示&#xff0c;点击如下图所示。 如果没有找到这个选项&#xff0c; 点击View -> Tool Windows -> Database同…

chatgpt实际是怎样工作的?

文章翻译自&#xff1a; https://www.assemblyai.com/blog/how-chatgpt-actually-works/ ChatGPT 是 OpenAI 的最新语言模型&#xff0c;比其前身 GPT-3 有了重大改进。与许多大型语言模型类似&#xff0c;ChatGPT 能够为不同目的生成多种样式的文本&#xff0c;但具有更高的精…

MBD-有感(Hall)开环BLDC控制模型(下)

目录 前面 保护策略 DC_Bus_Measurements Protection_Check 外设配置 最后 前面 上一篇已经把霍尔有感BLDC开环控制模型的主要部分分析完成了 MBD-有感(Hall)开环BLDC控制模型&#xff08;上&#xff09; 语雀 这一篇分析一些边边角角&#xff0c;但不成体系的部分。…

全网最详细,Jmeter接口测试场景-万条测试数据校验结果,循环断言(案例)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 在工作中&#xff0…

这个ChatGPT插件可以远程运行代码,还生成图表

ChatGPT的插件使数据科学成为一种简单、愉快的体验 我们做数据分析时一般都是使用这样的流程来进行&#xff1a;运行jupyter notebook、安装库、解决依赖关系和版本控制&#xff0c;数据分析&#xff0c;生成图表。ChatGPT的“Code Interpreter”插件可以帮助我们进行数据分析…

【Redis】五大数据结构及其常用指令

文章目录说明String类型List类型Set类型Hash类型Sorted Set 排序集合总结说明 Redis里面的数据类型有String、List、Set、Hash、Zset。这篇文章会介绍这5种数据类型并介绍操作它们的指令. String类型 字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的&#xff0…

5.1.1 Ext JS之Grid actioncolumn动作列的动态显示

在Ext JS 的 Grid中添加动作列的方式是配置一个 actioncolumn类型的动作列,这个动作列可以包含多个图表的按钮。 添加的方式如下: {xtype: actioncolumn,items:[{iconCls: x-fa fa-trash,}]}在有的时候场景中, 会根据不同行的数据来决定是否显示动作按钮, 也就是最后的效果…

关于OpenAI的DALL的一点使用心得

文章目录注册DALL使用根据描述来generate上传图片来generate也可以根据描述信息或者相似的图片来进行设计注册DALL https://openai.com/product/dall-e-2 使用 根据描述来generate surprise me 自动生成描述&#xff08;因为每个月只有15个免费credits&#xff0c;节省起见…

java面试题(持续更新)

java面试题&#xff08;持续更新&#xff09; java 基础 java面向对象有哪些特征 面向对象的三大特征&#xff1a;封装、继承、多态 封装&#xff1a;隐藏了类的内部实现机制&#xff0c;可以在不影响使用的情况下改变类的内部结构&#xff0c;同时也保护了数据&#xff0c;…

Microsoft Dynamics 365 Business Central Planning Worksheet中Action Message状态变化

学习目标&#xff1a; 掌握Planning Worksheet中Action Message状态变化 学习内容&#xff1a; 掌握 创建物料&#xff0c;工作中心&#xff0c;工艺路线&#xff0c;BOM&#xff0c;物料和工艺路线&#xff0c;BOM的关联掌握 按订单的生产的物料卡片设置掌握 创建销售订单并…