前文介绍了如下的Hooks例子 https://blog.csdn.net/qq_39606853/article/details/122283215?spm=1001.2014.3001.5501

import React, { useState } from 'react';function Example() {// 声明一个叫 "count" 的 state 变量const [count, setCount] = useState(0);return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}

我们将通过将这段代码与一个等价的 class 示例进行比较来开始学习 Hook。

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>);}
}

一开始state是{count: 0},当用户点击按钮后调用this.setState( )把state.count增加1。

Hooks和function组件

提醒一下,React里的function组件是这么写的

const Example = (props) => {// 你可以在这使用 Hookreturn <div />;
}

或是这样:

function Example(props) {// 你可以在这使用 Hookreturn <div />;
}

你之前可能就知道了这些都是无状态的组件。我们现在引入在这些组件里增加state的能力,所以我们更喜欢叫它function组件。

Hooks不能在class组件内部工作。但是你可以使用它替代class组件。

什么是Hooks

在我们新的例子首先导入useState

import React, { useState } from 'react';function Example() {// ...
}

什么是一个Hook?一个Hook就是一个特殊的方法可能让你"勾入"React的特性里。比如,useState是一个Hook用来让你在function组件里增加React的state。之后我们将会学习一些其他的Hooks。

什么时候使用Hook?如果你想写一个function组件并在其中增加一些state,之前你只能把它改为class组件的形式,现在你可以在function组件里用Hook来实现增加state的功能。现在让我们开始实现它。

声明一个State变量

在一个class组件里,我们通过在构造函数里传入{ count: 0 }给this.setState( )把count设为0。

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

在函数组件中,我们没有 this,所以我们不能分配或读取 this.state。我们直接在组件中调用 useState Hook:

import React, { useState } from 'react';function Example() {
// 声明一个叫 “count” 的 state 变量
const [count, setCount] = useState(0);

调用useState是干了啥?它声明了一个state变量。这个变量叫count,我们也可以命名成任意别的名字,比如banana。这是一种在方法调用之间保存值的方法——useState是一个新的完全可以用来替代class组件里的this.state的方式。一般来说,变量在方法调用结束后消失,但state变量能被React保存住。

我们给useState传递什么参数?useState( )唯一的参数就是初始状态。不像在class组件里,状态不是必须为一个对象。我们可以设为一个数字或者字符串都可以。在例子中,我们仅仅期望当用户点击后反映出一个数字来,所以传递0给初始状态(如果我们想要两个不同的state变量,可以调用useState两次)。

useState返回什么?它返回了一对值——当前的状态和更新状态的方法。这就是我们写const [count, setCount] = useState()的原因。和class组件里的this.state.count以及this.setState是类似的,除了你是一下子获得它们俩的。

现在我们知道了useState干了啥,我们的例子就变得更有意思了

import React, { useState } from 'react';function Example() {
// 声明一个叫 "count" 的 state 变量
const [count, setCount] = useState(0);

我们声明了一个count状态变量,把它设为0。React将会在重复渲染中记住它,并把最新的值返回给我们的方法。如果我们想更新它,我们可以调用setCount。

读取状态

当我们想要在class组件显示当前计数值的时候,我们读取this.state.count

<p>You clicked {this.state.count} times</p>

在函数中,我们可以直接用 count:

<p>You clicked {count} times</p>

更新状态

在class组件里,我们通过调用this.setState( )来更新state。

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

在函数中,我们已经有了 setCount 和 count 变量,所以我们不需要 this:

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

总结

现在让我们来仔细回顾一下学到的知识,看下我们是否真正理解了。

import React, { useState } from 'react';
function Example() {const [count, setCount] = useState(0);return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}
  • 第1行:我们从React里导入了useState这个Hook。它可以让我们在function组件里保持住内部state。

  • 第4行:在Example组件内部,我们通过调用useState声明了一个新的state变量。它返回了一对值。count反映了按钮点击的次数。我们传递给useState唯一参数就是state的初始值。第二个返回的是更新state的方法,命名为setState。

  • 第9行:当用户点击时,我们调用setCount传递给一个新的值。React将会重新渲染Example组件,把新的count值传递给它。

好像很多的内容。别急!如果你发现你迷失了,再从上往下看一眼上面的代码。一旦你尝试忘掉class组件里的state用法并用新鲜的眼光扫视这些代码,你会发现很有趣。

提示:方括号有什么用?

你可能注意到我们用方括号定义了一个 state 变量

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

等号左边名字并不是 React API 的部分,你可以自己取名字:

const [fruit, setFruit] = useState('banana');

这种 JavaScript 语法叫数组解构。它意味着我们同时创建了 fruit 和 setFruit 两个变量,fruit 的值为 useState 返回的第一个值,setFruit 是返回的第二个值。它等价于下面的代码:

var fruitStateVariable = useState('banana'); // 返回一个有两个元素的数组
var fruit = fruitStateVariable[0]; // 数组里的第一个值
var setFruit = fruitStateVariable[1]; // 数组里的第二个值

当我们使用 useState 定义 state 变量时候,它返回一个有两个值的数组。第一个值是当前的 state,第二个值是更新 state 的函数。使用 [0] 和 [1] 来访问有点令人困惑,因为它们有特定的含义。这就是我们使用数组解构的原因。

提示:使用多个 state 变量

将 state 变量声明为一对 [something, setSomething] 也很方便,因为如果我们想使用多个 state 变量,它允许我们给不同的 state 变量取不同的名称:

function ExampleWithManyStates() {
// 声明多个 state 变量
const [age, setAge] = useState(42);
const [fruit, setFruit] = useState('banana');
const [todos, setTodos] = useState([{ text: '学习 Hook' }]);

在上面的组件里,我们有age、fruit、todos这些state,我们可以单独的来更新它们。

function handleOrangeClick() {// 和 this.setState({ fruit: 'orange' }) 类似setFruit('orange');
}

不是非用多个state变量不可的。State变量可以为一个对象或者数组,这样你可以把相关的内容组织好。但是不像class组件里的this.setState,更新一个state变量永远只会更新它而不是合并它。

使用 State Hook相关推荐

  1. reactjs三个常用的Hook:State Hook、 Effect Hook、 Ref Hook

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

  2. 1 State Hook

    Hook,使用在函数组件中 不要在循环,条件或嵌套函数中(if.switch.for)调用 Hook 1. 函数指向相同的引用 更新方式:函数组件中state变化时才重新渲染(React使用Objec ...

  3. 了解react-hook以及State Hook

    react更新到16.8版本后最主要的内容就是增加了hook这个特性,它的主要作用可以理解为对react的函数组件进行了一次升级,使react的函数组件拥有了和react类组件一样的功能(关于以前版本 ...

  4. 前端学习(3311):redux的state hook对象

  5. 前端学习(3310):redux的state hook对象

  6. React Hook的用法: State + Effect(一)

    React Hook 简述 React Hook 是React 16.8 这个版本新增的一个特性.在此之前我们编写React组件一般大多数都是用 class组件,而非函数组件,因为函数组件不具有cla ...

  7. 如何使用React Hook

    class组件和函数组件 我们希望编写代码的时候,尽可能将整块可复用的部分封装起来.这样可以一定程度提高代码的内聚性,将其耦合性,使得程序开发变得更加可维护.通常情况下,我们将代码块抽离成组件来实现封 ...

  8. react hook问题讲解

    React Hook 官网地址:https://react.docschina.org/docs/hooks-faq.html (1)问题分析? Hook 是什么? Hook 是一个特殊的函数,它可以 ...

  9. React hook 中的数据获取

    相关说明: 对于hook相关词不翻译,感觉翻译后怪怪的. effect hook 效果钩子,用于执行一些副作用例如获取数据 . state hook 状态钩子. 使用----------- 和 --- ...

最新文章

  1. 中国科技巨擘(BAT)竞逐人工智能
  2. 看菲菲详解如何快速获取linux命令帮助
  3. 如何删除Cookie?
  4. go的错误处理(异常捕获、处理):defer+recover机制处理错误、自定义异常(自定义错误)
  5. 8086加法指令ADD
  6. 统计测序数据reads数和碱基数的几种方法
  7. 关于Socket通信服务的心跳包(转)
  8. 一场大火,让云计算巨头的数据中心化为灰烬!10 万Rust 游戏玩家的数据永久丢失,无法恢复
  9. @程序员:别人身边的小姐姐是这样来的,你能学学吗
  10. window 2008 搭建的DHCP服务器
  11. NOIP经典基础模板总结
  12. ftp 上传下载整个目录
  13. ArcGIS在三调,农村土地确权,国情普查项目中常用的编辑工具
  14. ActiveMQ的下载安装与操作示例
  15. matlab分位数回归,分位数回归及其实例
  16. 联想台式计算机重装系统教程,台式机装系统步骤 联想台式电脑怎么重装系统...
  17. configure error:Package requirements (openssl) were not met
  18. NLP自然语言处理 集束搜索(beam search)和贪心搜索(greedy search)
  19. iOS导航控制器——UINavigationController使用详解
  20. 【Java开源项目】消息推送平台 日志引入

热门文章

  1. 国内智慧城市建设发展问题的探讨(来源: 通信世界周刊)
  2. 【Opencv实战】Python神器 | ps做印章太麻烦?无法拒绝的提取印章神技能,很多人都不知道~(附源码)
  3. 长沙python哪家培训机构好
  4. alexa api php,Alexa的XML API获取网站的Alexa排名的PHP示例代码
  5. 想要用CAD制图软件查找文字该怎么办
  6. ubuntu20.04升级到22.04之后,不能从ubuntu复制文件到windows
  7. [Unity 3D] 重力感应与罗盘(一)
  8. 帝国CMS免签支付插件-易支付插件
  9. 两台电脑之间共享文件
  10. QT上位机源码+STM32图像采集