[React Hooks 翻译] 3-8 State Hook

2023-10-29

示例:等价的class组件

使用class实现一个计数器,你可能会这么写

class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }

  render() {
    return (
      <div>
        <p>You clicked {this.state.count} times</p>
        <button onClick={() => this.setState({ count: this.state.count + 1 })}>
          Click me
        </button>
      </div>
    );
  }
}
复制代码

下面是使用Hook重构的代码

import React, { useState } from 'react';

function Example() {
  // Declare a new state variable, which we'll call "count"
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}
复制代码

Hooks和函数组件

Hook出来以前,函数组件和无状态组件是等价的,但是Hook出来以后,函数组件也可以有状态了,此时二者并不等价。所以我们现在更喜欢使用函数组件这个名字

Hook不能在class组件中使用

什么是Hook?

什么是Hook?Hook就是一个钩子函数,用Hook就能从函数组件里hook到React state和生命周期。比如useState就是一个Hook,它能让函数组件使用React state(原本只有class组件才有state的)

何时该使用Hook? 如果你在编写一个函数组件并意识到你需要为它添加一些状态,之前你必须将它转换为一个类。现在,您可以在现有函数组件中使用Hook。

声明状态变量

在class组件里我们通过在构造函数中将this.state设置为{count:0}来将计数状态初始化为0

class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }
复制代码

在function组件内部调用useState Hook

import React, { useState } from 'react';

function Example() {
  // Declare a new state variable, which we'll call "count"
  const [count, setCount] = useState(0);
复制代码

useState 做了什么? useState声明了一个状态变量。

  1. 这里我们的变量叫做count,但我们可以称之为其他任何东西,比如banana。
  2. useState是一种在函数调用之间“保留”某些值的方法。通常,当函数退出时变量会被清除,但React将保留状态变量。
  3. useState和this.state提供了完全相同的功能。

传递给useState作为参数是什么? useState的唯一参数是初始状态。

  1. 与类不同,状态不必是对象。可以是任何类型的值
  2. 在我们的示例中,我们只需要一个数字表示用户单击的次数,因此将0作为变量的初始状态。
  3. 如果我们想在状态中存储两个不同的值,我们可以调用useState两次。

useState返回什么? 当前状态和更新它的函数。

  1. 这与类中的this.state.count和this.setState类似,只不过将它们放在一对中。

为什么useState没有命名为createState?

"create"不准确,因为状态仅在我们的组件第一次呈现时create。下一次渲染useState将为我们“提供”当前状态。否则它根本不会是“状态”! Hook名称总是已以"use"开头也是有原因的。我们将在后来的规则中了解原因。

读取状态

类组件里我们这么写

  <p>You clicked {this.state.count} times</p>
复制代码

函数组件里我们这么写

  <p>You clicked {count} times</p>
复制代码

更新状态

类组件:

  <button onClick={() => this.setState({ count: this.state.count + 1 })}>
    Click me
  </button>
复制代码

In a function, we already have setCount and count as variables so we don’t need this:

  <button onClick={() => setCount(count + 1)}>
    Click me
  </button>
复制代码

转载于:https://juejin.im/post/5cea48e451882570db16b2a8

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

[React Hooks 翻译] 3-8 State Hook 的相关文章

随机推荐

  • 深入学习java源码之Math.scalb()与 Math.powerOfTwoF()

    深入学习java源码之Math scalb 与 Math powerOfTwoF final关键字 final在Java中是一个保留的关键字 可以声明成员变量 方法 类以及本地变量 一旦你将引用声明作final 你将不能改变这个引用了 编译
  • 百度面试题——天平称重问题

    问题描述 用天平 只能比较 不能称重 从一堆小球中找出其中唯一一个较轻的 使用x 次天平 最多可以从y 个小球中找出较轻的那个 求y 与x 的关系式 解题思想 该题主要考查逻辑思维能力 我在首次遇见该题时 首先想到的对半拆分 找出其中较轻的
  • CUDA矩阵乘法及优化【参加CUDA线上训练营】

    目录 矩阵乘法 CPU方式 GPU方式 GPU中矩阵相乘步骤 GPU矩阵乘法代码示例 利用shared memory优化矩阵乘法 Share Memory矩阵乘法代码示例 矩阵乘法 CPU方式 利用三个for循环进行矩阵乘法 GPU方式 G
  • 网盘系统

    作者主页 编程千纸鹤 作者简介 Java 前端 Pythone开发多年 做过高程 项目经理 架构师 主要内容 Java项目开发 毕业设计开发 面试技术整理 最新技术分享 收藏点赞不迷路 关注作者有好处 文末获得源码 项目编号 BS XX 1
  • CTFhub_SSRF靶场教程

    CTFhub SSRF 题目 1 Bypass 1 1 URL Bypass 请求的URL中必须包含http notfound ctfhub com 来尝试利用URL的一些特殊地方绕过这个限制吧 1 利用 绕过限制url https www
  • http post 方法传递参数的2种方式

    try HttpPost httpPost new HttpPost url StringEntity stringEntity new StringEntity param param参数 可以为 key1 value1 key2 val
  • 什么是人力资源360度评估法?

    1 360度评估法的定义 360度评估法 360 Feedback 又称 360度考核法 或 全方位考核法 属于人力资源中绩效考核方法之一 是指由员工自己 上司 直接部属 同仁同事甚至顾客或家人等从全方位 各个角度来评估人员的方法 而且 为
  • java注解与反射的基本使用(这一篇就够了!)

    一 注解 Annotation 1 什么是注解 相信大家对注解应该并不陌生 在现在信息飞速发展的年代 各种优秀的框架或许都离不开注解的使用 像我们在实现接口一个方法时 也会有 Override注解 注解说白了就是对程序做出解释 与我们在方法
  • 【three.js】世界坐标系和设备坐标系

    three js 坐标系转换 简述 屏幕坐标转世界坐标 世界坐标转屏幕坐标 第三方 CSS2DRenderer 第三方 CSS3DRenderer 简述 物体的坐标转换过程大致为 局部坐标 gt 世界坐标 gt 观察空间坐标 gt 裁剪空间
  • vue项目流程demo示例

    前言 自己写从头做一个vue项目 没什么技术 主要是温顾流程 gt 没写完 只写到创建完项目 目录 1 准备工作 node 淘宝镜像 yarn vite IDE集成开发工具 2 创建项目 初始化项目 文件目录 3 全局设置 主题设置 全局变
  • python3,使用sys.setdefaultencoding('utf-8'),编译时报错

    借鉴博客 http blog csdn net fly910905 article details 74922378 正常情况下 我们在使用python做页面开发时 防止中文出现乱码问题 python2 情况下会使用 如下语句 import
  • ‘mkvirtualenv‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    问题 mkvirtualenv 不是内部或外部命令 也不是可运行的程序 或批处理文件 或者 mkvirtualenv 无法将 mkvirtualenv 项识别为 cmdlet 函数 脚本文件或可运行程序的名称 请检查名称的拼写 如果包括路径
  • 华为HCIP云计算考证心得

    华为认证是社会认证中一种 现在很多公司也比较看重这个的 有的公司还会根据你考取证书的等级高低有工资加成 透露下我之前所在的公司 是华为的合作伙伴 就是华为代理公司把 持有HCIP证书可有每月有500的加成 IE的话1000 当然不同的公司也
  • php实现抽奖

    不啰嗦 直接上代码
  • Unity 轻量级对象池管理器(上)

    参考 https www jianshu com p 144181beab79 完整代码请跳转至 Unity 轻量级对象池管理器 下 一 前言 很多时候 你都要考虑一个问题 就是到底是牺牲时间换空间 还是牺牲空间换时间 特别是在资源紧缺的那
  • 前后端分离项目打包上传服务器

    前后端分离项目打包上传服务器 项目环境 前端项目打包 npm run build 后端项目打包 xshell和xftp 项目环境 本次项目前端使用的是vue 后端使用spring boot 分别使用的编辑器是vs code和ide 前端项目
  • Failed to load resource: the server responded with a status of 500 ()

    文章目录 前提 解决思路 心得 前提 1 最近在写SSM博客项目 基于jsp编写的 跟着视频敲 直接运行已经给好的资料 在登录验证的时候 发现页面加载半天 如下图 2 于是就盲目的去比对是不是自己复制的代码有问题 然后就一行行的比对 这犯了
  • Linux中磁盘分区的具体步骤

    磁盘分区是在Linux操作系统中重要的任务之一 通过分区可以让我们更好地管理磁盘空间 并更好地使用磁盘来存储数据和程序 在这篇博客里 我将向大家介绍如何在Linux中进行磁盘分区的实战步骤 步骤一 打开终端 首先 我们需要打开终端 在终端中
  • Linux系统巡检项及详细巡检方法与解决方案

    一 背景 1 开发脚本实现OS配置参数巡检 2 推动监控系统发布OS巡检插件 3 利用监控数据形成报表 二 巡检项整改方案解析 1 检查僵尸进程 此项检查项是检查主机系统是否存在D状态的进程 D是一种不可中断的sleep 如果发现D状态并且
  • [React Hooks 翻译] 3-8 State Hook

    示例 等价的class组件 使用class实现一个计数器 你可能会这么写 class Example extends React Component constructor props super props this state coun