React - Hooks 使用(函数组件中使用 React 特性)

news2024/10/6 10:32:59

React - Hooks 使用(函数组件中使用 React 特性)

  • 一. 为什么要使用 HOOKS?
  • 二. HOOKS 概念
  • 三. HOOKS 用法
    • 1. useState
      • 1.1 参数及返回值
      • 1.2 setState 两种写法
      • 1.3 setState 示例
    • 2. useEffect
      • 2.1 useEffect 实例
    • 3. useRef
      • 3.1 useRef 实例
  • 四. 一个 Hooks 组件实例

  1. Hook 是React 16.8.0版本增加的新特性/新语法
  2. 可以在函数组件中使用 state 以及其他的 React 特性

一. 为什么要使用 HOOKS?

  • React的组件创建方式,一种是类组件,一种是函数组件。
  • 函数组件相比较类组件,具有以下特点:
    (1)函数组件没有状态
    (2)函数组件没有生命周期
    (3)函数组件没有this
  • 这就说明函数组件,只能做UI展示的功能,涉及到状态的管理与切换,就不得不用类组件或者redux。
  • 在这种情况下,如果想使用函数组件编写一个完整的功能,就可以使用 HOOKS

二. HOOKS 概念

  1. Hook 是React 16.8.0版本增加的新特性/新语法
  2. 可以在函数组件中使用 state 以及其他的 React 特性

三. HOOKS 用法

  1. State Hook:React.useState()
  2. Effect Hook:React.useEffect()
  3. Ref Hook:React.useRef()

1. useState

使函数组件也可以有 state 状态, 并进行状态数据的读写操作。

import { useState } from "react";

const [state, setState] = useState(initState);

1.1 参数及返回值

  • initState: useState 参数
    在初始渲染期间,指定state值在内部作缓存
  • [state, setState]: useState 返回值,包含两个元素的数组,
    第一个参数:为内部当前的state状态值,
    第二个参数:为更新state状态值的函数

1.2 setState 两种写法

  1. 第一种写法

    setState(newState);
    

    参数为 非函数值直接指定新的状态值,内部用其覆盖原来的状态值

  2. 第二种写法

    setState(state => {
      // state : 原本的state值
      return newState
    });
    

    参数为函数,接收原本的状态值返回新的状态值,内部用其覆盖原来的状态值

1.3 setState 示例

const [count, setCount] = useState(0);

setCount(count + 1);

setCount((count) => {
  // count : 原本的state值
  return count + 1;
});

2. useEffect

在函数组件中执行副作用操作(用于模拟类组件中的生命周期钩子)
可以用来更好的处理副作用,比如 添加订阅、设置定时器、接口请求 以及执行其他包含副作用的操作

import { useEffect } from "react";

useEffect(
  () => {
    // 在此可以执行任何带副作用操作
    return () => { // 在组件卸载前执行
      // 在此做一些收尾工作, 比如清除定时器/取消订阅等
    };
  },
  [stateValue],// 如果指定的是[], 回调函数只会在第一次render()后执行
);

可以把 useEffect Hook 看做如下三个函数的组合:

  • componentDidMount()
  • componentDidUpdate()
  • componentWillUnmount()

2.1 useEffect 实例

const [count, setCount] = useState(0);
useEffect(() => {
  // 定时器
  let timer = setInterval(() => {
    setCount((count) => count + 1);
  }, 1000);
  return () => {
    // 清除定时器
    clearInterval(timer);
  };
}, []);

3. useRef

可以在函数组件中存储/查找组件内的标签或任意其它数据
作用:保存标签对象,功能与React.createRef()一样

import { useRef } from "react";

const refContainer = useRef(initValue);

3.1 useRef 实例

<input ref={myRef} type="text" />
<button onClick={showInputValue}>提示输入框信息</button>

const myRef = useRef();

function showInputValue() {
  console.log(myRef.current.value);
}

四. 一个 Hooks 组件实例

类组件 对比 函数组件
实现 state 状态修改、定时器、输入框信息打印、组件卸载

  1. 类组件 实现

    src/index.js 暴露 root

    import React from "react";
    import ReactDOM from "react-dom/client";
    import App from "./App";
    import { BrowserRouter } from "react-router-dom";
    
    const root = ReactDOM.createRoot(document.getElementById("root"));
    root.render(
      <BrowserRouter>
        <App />
      </BrowserRouter>
    );
    export default root;
    
    import React, { Component } from "react";
    import { createRef } from "react";
    import root from "../../index";//引入root路径
    export default class index extends Component {
      state = {
        count: 0,
        name: "tom",
      };
      myRef = createRef();
      componentDidMount() {
        this.timer = setInterval(() => {
          this.setState({
            count: this.state.count + 1,
          });
        }, 1000);
      }
      componentWillUnmount() {
        clearInterval(this.timer);
      }
    
      increment = () => {
        this.setState((state) => {
          return {
            count: state.count + 1,
          };
        });
      };
      updateName = () => {
        this.setState({
          name: "小明",
        });
      };
      unMount = () => {
        root.unmount();
      };
      showInputValue = () => {
        console.log(this.myRef.current.value);
      };
      render() {
        return (
          <div>
            <h4>数值为:{this.state.count}</h4>
            <button onClick={this.increment}>+1</button>
            <h4>名字:{this.state.name}</h4>
            <button onClick={this.updateName}>改名</button>
            <br />
            <br />
            <button onClick={this.unMount}>卸载组件</button>
            <br />
            <br />
            <input ref={this.myRef} type="text" />
            <button onClick={this.showInputValue}>打印输入框信息</button>
          </div>
        );
      }
    }
    
  2. 函数组件 实现

    src/index.js 暴露 root

    import React from "react";
    import ReactDOM from "react-dom/client";
    import App from "./App";
    import { BrowserRouter } from "react-router-dom";
    
    const root = ReactDOM.createRoot(document.getElementById("root"));
    root.render(
      <BrowserRouter>
        <App />
      </BrowserRouter>
    );
    export default root;
    
    import { useState, useEffect, useRef } from "react";
    import root from "../../index";//引入root路径
    function Index() {
      const [count, setCount] = useState(0);
      const [name, setName] = useState("tom");
      const myRef = useRef();
      useEffect(() => {
        let timer = setInterval(() => {
          setCount((count) => count + 1);
        }, 1000);
        return () => {
          clearInterval(timer);
        };
      }, []);
      function increment() {
        // setCount(count + 1);// 第一种写法
        setCount((count) => {
          return count + 1;
        });
      }
      function updateName() {
        setName("小明");
      }
      function unMount() {
        root.unmount();
      }
      function showInputValue() {
        console.log(myRef.current.value);
      }
      return (
        <div>
          <h4>数值为:{count}</h4>
          <button onClick={increment}>+1</button>
          <h4>名字:{name}</h4>
          <button onClick={updateName}>改名</button>
          <br />
          <br />
          <button onClick={unMount}>卸载组件</button>
          <br />
          <br />
          <input ref={myRef} type="text" />
          <button onClick={showInputValue}>打印输入框信息</button>
        </div>
      );
    }
    
    export default Index;
    
  3. 组件实现效果图
    在这里插入图片描述

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

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

相关文章

R语言中的偏最小二乘回归PLS-DA

主成分回归&#xff08;PCR&#xff09;的方法 本质上是使用第一个方法的普通最小二乘&#xff08;OLS&#xff09;拟合来自预测变量的主成分&#xff08;PC&#xff09;。这带来许多优点&#xff1a; 预测变量的数量实际上没有限制。 相关的预测变量不会破坏回归拟合。 但是…

Letbook Cookbook题单——数组4

Letbook Cookbook题单——数组4 59. 螺旋矩阵 II 难度中等 给你一个正整数 n &#xff0c;生成一个包含 1 到 n^2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; [外链图片转存失败,源站可能有防盗链机制,建议将图片保…

毕业设计-基于大数据的PM2.5浓度预测的研究-python

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

Excel 函数大全之TRANSPOSE function

TRANSPOSE function 有时您需要切换或旋转单元格。您可以通过复制、粘贴和使用转置选项来完成此操作。但是这样做会产生重复的数据。如果您不想这样,您可以使用 TRANSPOSE 函数键入公式。例如,在下图中,公式=TRANSPOSE(A1:B4)将单元格 A1 到 B4 水平排列。 注意: 如果您有…

Docker基本命令

目录一、Docker基本命令二、Docker镜像常用命令三、Docker 容器常用命令一、Docker基本命令 启动Docker systemctl start docker 停止Docker systemctl stop docker 重启Docker systemctl restart docker 开机启动Docker systemctl enable docker 查看Docker概要信息 dock…

通过动态图形感受数学之美

这两天正在使用PTC Mathcad 软件&#xff0c;它可以通过公式绘制出对应的曲线&#xff0c;通过曲线更容易的去理解公式中各种参数的含义。 下面先看几个例子 可以看到这个软件的函数和绘图功能是非常好用的&#xff0c;唯一的缺点就是&#xff1a;当参数范围比较宽的时候&#…

python+django企业员工人事档案管理系统arlys

系统主要分为两种角色&#xff0c;每个角色的功能如下所示&#xff1a; 管理员功能模块&#xff1a; 1.员工资料管理&#xff1a;查看员工列表&#xff0c;添加职工&#xff0c;修改信息&#xff08;搜索员工使用模糊查询&#xff09; 2.部门管理&#xff1a;查看部门列表&am…

vue.js:全局组件和局部组件

全局组件和局部组件 全局组件的定义的代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"author" content"xiaonaihu" /><meta name"generator" content"HBuilder X" …

知识图谱-KGE-语义匹配-双线性模型-2016:HolE

【paper】 Holographic Embeddings of Knowledge Graphs【简介】 本文是麻省理工的研究人员发表在 AAAI 2016 上的文章&#xff0c;提出了 HolE(Holographic Embedding)&#xff0c;是一个基于向量循环关联操作的组合向量空间模型。 组合表示 不同论文里对同一类方法的表述不…

第十四届蓝桥杯集训——JavaC组第五篇——四则运算/(求余/取模)

第十四届蓝桥杯集训——JavaC组第五篇——四则运算/(求余/取模) 目录 第十四届蓝桥杯集训——JavaC组第五篇——四则运算/(求余/取模) 四则运算 基础运算&#xff1a; 符号优先级 计算示例&#xff1a; 异常处理 取模运算% 基础概念 奇偶数 四则运算 大家都知道&…

基于Java+Springboot+Vue+elememt甜品屋蛋糕商城系统设计和实现

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取联系&#x1f345;精彩专栏推荐订阅收藏&#x1f447;&…

2023年网络安全预测

©网络研究院 就在一年前&#xff0c;对 2022 年的预测将勒索软件的扩散以及混合环境中远程工作的新方式所产生的漏洞视为对企业的致命威胁。在冠状病毒引起的动荡之后&#xff0c;更多组织正在协商将其网络基础设施迁移到云端的挑战。 另一个始终如一的主题是长期缺乏由…

node版本控制工具(nvm)

1.传统的node控制版本,需要去官网手动下载并安装;使用nvm可以快速的切换node版本,提高摸鱼时间哦~ 2.下载nvm(地址) 3.再d盘soft(这是我专门存放软件的文件夹,大家可以直接在d盘下建nvm哈)文件夹下新建nvm文件夹,将下载的压缩文件解压到该文件夹下 解压后nvm文件夹下就只有nvm…

[附源码]Python计算机毕业设计Django疫情网课管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

简化基于Scala的Web API开发

虽然说使用 Scala 语言的语法来写 SpringBoot 微服务已经可以让 Scala 开发者们兴奋不已了&#xff0c;但说实话&#xff0c;这并没有很大程度上发挥二者各自的最大威力。 单向上来讲&#xff0c;从 SpringBoot 微框架出发&#xff0c;Java、Scala 等 Java 虚拟机上的语言都会…

[附源码]JAVA毕业设计体育用品购物系统(系统+LW)

[附源码]JAVA毕业设计体育用品购物系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

神经网络流程图用什么画,神经网络识别流程图解

1、如何通过人工神经网络实现图像识别 人工神经网络&#xff08;Artificial Neural Networks&#xff09;&#xff08;简称ANN&#xff09;系统从20 世纪40 年代末诞生至今仅短短半个多世纪&#xff0c;但由于他具有信息的分布存储、并行处理以及自学习能力等优点&#xff0c;…

【2】AHB协议学习

目录 1、ahb2.0协议:1.1、基本传输1.2 传输类型1.3 突发操作1.4 控制信号1.41 传输方向1.4.2 传输大小1、ahb2.0协议: AHB是为提出高性能可综合设计的要求而产生的AMBA总线。 它是一种支持多总线主机和提高带宽操作的高性能总线。 1.1、基本传输 AHB传输包含两个截然不同的…

远程桌面-系统管理员不允许使用保存的凭据登录远程计算机

当你使用本机 Microsoft RDP 客户端(mstsc.exe)连接到远程 Windows 主机时,可以保存登录凭据,以避免每次都输入这些凭据。你只需要在 RDP 连接窗口中勾选“记住我”选项。在这种情况下,Windows 会将你的远程桌面密码保存到 Windows 凭据管理器。 此外,还有一件更重要的事…

VMware之安装配置CentOS7

安装步骤&#xff1a; 1、打开VMware虚拟机 创建新的虚拟机 2、根据你安装的虚拟机版本选择相应的 Workstation 什么是ISO镜像文件&#xff1f; 1、iso文件只是一个只读文件 2、.iso是电脑上光盘镜像&#xff08;CD Mirror&#xff09;的存储格式之一&#xff0c;因为其是根据I…