react hook是react推出的一种特殊函数。这些函数可以让你在不创建react class的情况下依然可以使用react的一些特性(诸如目前react的钩子函数拥有的所有特性)。

最常用的hook有useState, useEffect, 日常开发使用这两个就足够了。如果再懂点useReduer, useCallback, useMemo, useRef, useImperativeHandle, useLayoutEffect, useDebugValue ,自定义hook,就再好不过了。


useState是什么?

它允许我们在react函数组件里使用state,可以完全替代this.state的所有特性。不过,hook只可以用在函数组件里,在类组件里不生效哦

怎么用useState?

  1. 引入useState

Import React, { useState } from ‘react’

2. 在函数组件里声明state属性

const [ xx, setXxx ] = useState(xx的初始值);

useState方法接受的唯一参数,就是xx的初始值。

3. 在函数组件里想要读取state属性

函数组件里没有this,读取state属性是直接读取xx

4. 在函数组件里想更新state属性

直接使用setXxx( xx的更新值) 即可更新xx的值

实例操作

场景:

某个文档文字过长,点击“查看更多”按钮文档会全部展示出来,点击“收起”按钮,文档会收起一部分。

实现思路:

定义一个state属性fold,类型为boolean,当展示”收起”按钮时,fold值为true;点击可切换成“查看更多”,fold值也会变为false;

实现代码:

使用react 类组件实现如下:

import React, {Component} from 'react';class HookExample extends Component {constructor(props){super(props);this.state = {fold: true,}}render() {const { fold } = this.state;return (<div className="hook-example"><article><header><h2>Life</h2></header><section className={fold ? 'fold' : 'unfold'}><p>  If life is a river, it is the most exciting section.</p><p>  Flowing a trickle of childhood, life began to restlessness, personality spray, a piece after piece of Pentium the melody of youth。It is surging, it's always a time of the wild and intractable, slap embankment, heaving ship of life。</p></section></article><span onClick={()=>{this.setState({fold: !fold})}}>{fold ? '查看更多' : '收起'}</span></div>);}
}export default HookExample;

使用hook函数组件实现如下:

import React, {useState} from 'react';
function HookExample(){const [fold, setFold] = useState(true);return (<div className="hook-example"><article><header><h2>Life</h2></header><section className={fold ? 'fold' : 'unfold'}><p> If life is a river, it is the most exciting  section.</p><p> Flowing a trickle of childhood, life began to  restlessness,personality spray, a piece after  piece of  Pentium the melody of youth。 It is  surging, it's always  a time of the wild and  intractable, slap embankment, heaving ship of  life。</p></section></article><span onClick={()=>{setFold(!fold)}}>{fold ? '查看更 多' : '收起'}</span></div>);
}
export default HookExample;

页面效果:

实现步骤详解:

第一步:创建组件,声明state属性

使用react类组件可以这样实现:

import React, {Component} from 'react';
class HookExample extends Component {constructor(props){super(props);this.state = {fold: true,}
}

而用useState,只需:

import React, {useState} from 'react';
function HookExample(){const [fold, setFold] = useState(true);

useState只接收一个参数,就是该state属性的初始值。它会返回一个数组,里面包含两个值,通过数组解构的方式将第一个值赋给用户定义的state属性(即fold),第二个值为state属性的更新函数,赋给用户定义的属性更新函数(setFold)。

const [ fold, setFold ] = useState(true)
// 等同于
const result = useState(true);
const fold = result[0];
const setFold = result[1];

第二步:读取state属性

在react 类组件里,我们需要这样:

const { fold } = this.state;
<section className={fold ? 'fold' : 'unfold'}>

在使用了hook的函数组件里,我们只需:

<section className={fold ? 'fold' : 'unfold'}>

类组件里,我们需要通过this.state读取到fold的值。而在函数组件里,直接使用fold即可。

第三步: 更新state属性

react组件里,如下:

<span onClick={()=>{ this.setState({fold: !fold}) }}>{fold ? '查看更多' : '收起'}</span>

在函数组件里,如下:

<span onClick={()=>{setFold(!fold)}}>{fold ? '查看更多' : '收起'}</span>

在类组件里,通过调用setState更新fold,更新后的fold会与当前的state对象进行合并。

而在函数组件里,直接调用第一步声明的更新函数setFold即可更新fold的值,fold值更新后,react会重新渲染HookExample组件,并把最新的fold值传给它。

使用小提示

在实际开发中,我们可能需要多个state属性。你可以写多个useState

const [A1, setA1] = useState('');
const [A2, setA2] = useState(true);

如果state属性直接有业务关联,那么可以把这几个state属性合在一起,用一个useState即可。

const [A, setA] = useState({A1: ‘’,A2: true
});

与react类组件不同的是,当我们更新属性A时,会完全替代之前的A值,而不是merge原来的A值。


恭喜你学会了useState,接下来还有useEffect等一系列教程等着你,要加油哦!

hook xposed 自定义类_【开始学习React Hook(1)】Hook之useState相关推荐

  1. hook xposed 自定义类_使用Xposed实现Hook

    使用Xpose框架实现Hook操作 1.项目导入 在app/build.gradle中配置 repositories { jcenter() } dependencies { compileOnly ...

  2. 如何学习streamdecoder类_如何学习篇5:强化2种能力——2种学习模式之运动类:隐性学习...

    [本文摘要] [注]本文所述内容为学习Yjango<学习观>相关视频之后的总结,观点归Yjango所有,本文仅作为学习之用. 阅读本节,会让你对英语这类运动类知识的学习豁然开朗,你会知道英 ...

  3. java导入自定义类_导入自定义Java类

    我是Java的新手,但我一直在网上寻找解决方案,但似乎都没有用.请帮我. 我有两个文件.其中之一是包含主要功能的java文件.在里面: ... VaporVisitor visitor = new V ...

  4. groovy 使用java类_深入学习java中的Groovy 和 Scala 类

    前言 Java 传承的是平台,而不是语言.有超过 200 种语言可以在 JVM 上运行,它们之中不可避免地会有一种语言最终将取代 Java 语言,成为编写 JVM 程序的最佳方式.本系列将探讨三种下一 ...

  5. okhttp 工具类_日语学习工具推荐,小白必备!

    有很多同学问我,有没有好用的日语学习工具? 当然有啦~这些学习工具大概分为辞典类.翻译类.日语知识类等等. 今天呢,在自身使用的工具里挑选了下面8个学习工具网站,适合各个学习阶段,从日语初级到精通,它 ...

  6. java import自定义类_自定义类加载器-从.class和.jar中读取

    一. 类加载器 JVM中的类加载器:在jvm中,存在两种类加载器, a) Boostrap ClassLoader:这个是由c++实现的,所以在方法区并没有Class对象的实例存在.用于加载JAVA_ ...

  7. react div onclick叠加_深入学习 React 合成事件

    翁斌斌,微医云前端工程师,在程序员的修炼道路上永不止步. 以下分析基于React, ReactDOM 16.13.1版本 提出问题 我们借鉴一个比较典型的案例开始来分析React事件 export 从 ...

  8. react学习预备知识_在10分钟内学习React基础知识

    react学习预备知识 If you want to learn the basics of React in the time it takes you to drink a cup of coff ...

  9. vba 定义类_工作表中如何响应自定义事件

    大家好,在上两讲中讲了类模块的调试行为,对于我们写代码人员来讲,要充分地理解每个知识点的概念,才能在实际工作中灵活运用,在我的第一套教程<VBA代码解决方案>中,我推出的是一种积木编程的思 ...

最新文章

  1. ×××S:Reporting Services 技巧
  2. 题目 1470:【蓝桥杯】【入门题】【基础练习VIP】时间转换
  3. python的print换行
  4. easyui中tab页中js脚本无法加载的问题及解决方法
  5. wepy 项目的初始化应用
  6. Ubuntu Linux配置IP地址
  7. oracle scn与数据恢复,[Oracle] SCN与数据恢复的关系
  8. es6笔记 day3---Promise
  9. python中的正则表达式是干嘛的_python中正则表达式总结
  10. 解决python读取json格式数据后提取object不存在报错KeyError
  11. 虚拟机下安装ubuntu
  12. 暴雪总裁总结游戏十条经验
  13. socket工具IP显示问题与连接不上问题
  14. python第三方库 invalid requirement_python第三方库安装出问题
  15. 自己DIY word2010脚注和尾注没有的格式
  16. Python之自制二维码
  17. C++typedef的用法
  18. python顺时针旋转_python——n*n矩阵顺时针旋转90度
  19. mysql获取汉字拼音首字母_MySQL数据库获取汉字拼音的首字母函数
  20. 金富瑞UCML2.0应用框架平台 for Asp.Net WEB 开发平台

热门文章

  1. C#窗体应用程序崩溃解决方法总结
  2. 怎么把word转换pdf,pdf转换word ,pdf转换成高清图片
  3. linux中内部命令有哪些,linux内部命令有哪些
  4. face alignment by 3000 fps系列学习总结(二)
  5. SDM For Face Alignment 流程介绍及Matlab代码实现之预处理篇
  6. linux中设置默认权限的命令,Linux默认权限掩码
  7. javascript 计算两个坐标的距离 米_土方全面应用计算
  8. JS字符串与二进制的相互转化
  9. python临床数据_从临床试验中获取数据
  10. 蓝牙BLE(协议栈、OSAL、蓝牙APP工具)