hooks的作用

在react16.8版本之后,由于hooks的出现,函数组件得到了扩展,完全不使用"类",就能写出一个全功能的组件。

 React Hooks 的意思是,组件尽量写成纯函数,如果需要外部功能和副作用,就用钩子把外部代码"钩"进来。

一. useState

useState()用于为函数组件引入状态(state)。纯函数不能有状态,所以把状态放在钩子里面。

import React, { useState } from 'react';function Example() {// 声明一个叫 "count" 的 state 变量,初始值为0,后续通过setCount改变它能让视图重新渲染const [count, setCount] = useState(0);return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}

useState()函数接受状态的初始值,作为参数。该函数返回一个数组,数组的第一个元素是一个变量(上例是count),指向状态的当前值。第二个元素是一个函数(上例是setCount),用来更新该状态,约定是set前缀加上状态的变量名

useState总结

  • useState让函数组件也可以有state状态, 并进行状态数据的读写操作
  • 语法: const [xxx, setXxx] = useState(initValue)
  • useState()说明:
    • 参数: 第一次初始化指定的值在内部作缓存
    • 返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的函数
  • setXxx()2种写法:
    • setXxx(newValue): 参数为非函数值, 直接指定新的状态值, 内部用其覆盖原来的状态值
    • setXxx(value => newValue): 参数为函数, 接收原本的状态值, 返回新的状态值, 内部用其覆盖原来的状态值

二. useEffect

useEffect()用来引入具有副作用的操作,最常见的就是向服务器请求数据。以前,放在componentDidMount里面的代码,现在可以放在useEffect()

useEffect(()  =>  {// Async Action
}, [dependencies])

上面用法中,useEffect()接受两个参数。第一个参数是一个函数,异步操作的代码放在里面。第二个参数是一个数组,用于给出 Effect 的依赖项,只要这个数组发生变化,useEffect()就会执行。

useEffect的作用

只要是副作用(side effect),都可以使用useEffect()引入。它的常见用途有下面几种。

  • 获取数据
  • 事件监听或订阅
  • 改变 DOM
  • 输出日志

可以把useEffect看做如下三个生命周期的组合

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

useEffect的返回值

useEffect()允许返回一个函数,在组件卸载时,执行该函数,清理副作用。如果不需要清理副作用,useEffect()就不用返回任何值。

 React.useEffect(()=>{let timer = setInterval(()=>{setCount(count => count+1 )},1000)return ()=>{clearInterval(timer)}},[])

如上例,useEffect()在组件加载时设置了一个定时器,并且返回一个清理函数,在组件卸载时清空定时器。

此处相当于执行了componentWillUnmount()生命周期钩子。

useEffect的第二个的参数

  • 省略,省略时相当于组件全局作为依赖,每次组件渲染时都会执行useEffect()
  • [],相当于没有依赖,只会在组件挂载时执行一次useEffect(),相当于componentDidMount()生命周期钩子
  • [x,xxx],数组内的变量为依赖,当依赖发生变化时,都会执行useEffect(),相当于componentDidUpdate()生命周期钩子

多个副作用的注意点

使用useEffect()时,有一点需要注意。如果有多个副效应,应该调用多个useEffect(),而不应该合并写在一起。

function App() {const [varA, setVarA] = useState(0);const [varB, setVarB] = useState(0);useEffect(() => {const timeout = setTimeout(() => setVarA(varA + 1), 1000);return () => clearTimeout(timeout);}, [varA]);useEffect(() => {const timeout = setTimeout(() => setVarB(varB + 2), 2000);return () => clearTimeout(timeout);}, [varB]);return <span>{varA}, {varB}</span>;
}

三. useReducer

useReducers()钩子用来引入 Reducer 功能。

用法: const [state, dispatch] = useReducer(reducer, initialState);

它接受 Reducer 函数和状态的初始值作为参数,返回一个数组。数组的第一个成员是状态的当前值,第二个成员是发送 actiondispatch函数。

下面是一个计数器的例子。用于计算状态的 Reducer 函数如下。

const myReducer = (state, action) => {switch(action.type)  {case('countUp'):return  {...state,count: state.count + 1}default:return  state;}
}

组件代码如下

function App() {const [state, dispatch] = useReducer(myReducer, { count:   0 });return  (<div className="App"><button onClick={() => dispatch({ type: 'countUp' })}>+1</button><p>Count: {state.count}</p></div>);
}

四. useRef

useRef 返回一个可变的 ref 对象,其 current 属性被初始化为传入的参数initialValue

写法:const refContainer = useRef(initialValue);

用法与createRef()一致

function TextInputWithFocusButton() {const inputEl = useRef(null);const onButtonClick = () => {// `current` 指向已挂载到 DOM 上的文本输入元素inputEl.current.focus();};return (<><input ref={inputEl} type="text" /><button onClick={onButtonClick}>Focus the input</button></>);
}

参考文档

React Hooks教程之基础篇
React Hooks 入门教程

常用hooks用法总结相关推荐

  1. python Pool常用函数用法总结

    在本篇内容里小编给大家整理的是一篇关于python Pool常用函数用法总结内容,有需要的朋友们可以学习下. 1.说明 apply_async(func[,args[,kwds]):使用非堵塞调用fu ...

  2. C++string类常用函数 c++中的string常用函数用法总结

    string类的构造函数: string(const char *s);    //用c字符串s初始化 string(int n,char c);     //用n个字符c初始化 此外,string类 ...

  3. python常用模块用法_python笔记之常用模块用法分析

    python笔记之常用模块用法分析 内置模块(不用import就可以直接使用) 常用内置函数 help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像 ...

  4. [转]jQuery的each方法的几种常用的用法

    下面提一下jQuery的each方法的几种常用的用法 复制代码 代码如下:  var arr = [ "one", "two", "three&quo ...

  5. mysql常见关键字的用法_MySQL 常用关键字用法详解

    MySQL 常用关键字用法详解 在开发工程中,操作数据库的时候经常会有不同类型的条件查询,除了使用where外,Mysql本身也提供了很多常用的关键字.本文主要介绍一些常用的关键字,像update.i ...

  6. 介绍lookup函数十大常用的用法

    转载:https://baijiahao.baidu.com/s?id=1627410097387782364&wfr=spider&for=pc 介绍lookup函数十大常用的用法, ...

  7. html5 ins标签,HTML ins标签常用的用法有哪些?HTML ins常用属性的介绍

    HTML ins标签常用的用法有哪些?HTML ins常用属性的介绍都在这里,本篇文章主要介绍了html ins标签用法和定义都有什么,还有一些html ins标签常用属性的介绍 HTML ins标签 ...

  8. maya 常用命令用法整理

    MAYA常用命令用法整理 孤立模式 Shift + i -- 单独显示物体 Ctrl + h -- 隐藏该物体 Ctrl + Shift + h -- 显示上一个被隐藏的物体 /在Outliner / ...

  9. react hooks介绍以及常用hooks列举

    当你在使用React构建应用程序时,React Hooks是一种非常强大的功能,它可以使你更容易地处理组件状态和生命周期.它们允许你将逻辑与React组件分离,从而使代码更清晰.更可维护. React ...

最新文章

  1. linux监控(陆续补充)
  2. Visual Studio 2005 Web Application Projects 正式推出
  3. java如何爬取304_HTTP 304错误的详细讲解
  4. python判断成语_python正则表达式抓取成语网站
  5. linux下无法umount移动设备
  6. BeetleX框架详解-小结
  7. 前端学习(525):等分布局
  8. python bootstrap 视频_想用Django+ Bootstrap写一个网站, 有哪些比较系统完整的书或者视频可以参考?...
  9. 游戏股的年过完了,盈利下滑,有企业靠卖房维持业绩
  10. 鼠年春节90后们很忙:加班、看春晚、找工作都是主力
  11. Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value
  12. 北航、商汤提出的网络二值化新算法 IR-Net,到底好使不?
  13. mongorepository查询条件_Java操作MongoDB采用MongoRepository仓库进行条件查询 | 学步园...
  14. 华为数通ensp命令(一)
  15. 阿里云盘 Mac客户端(附福利兑换码)
  16. Cartographer(二)使用思岚rplidar雷达进行cartographer建图
  17. pwntcha库的安装依赖
  18. TorchScript简介
  19. uniapp 消息提示框
  20. linux原生运行微信客户端,巧用 Docker 在 Linux 下 运行微信 PC 客户端

热门文章

  1. 竞品分析:金融导流产品-财鱼管家VS金猫管家
  2. 简短心情说说致自己,给自己最美的一句话
  3. 第二证券|银行板块集体走高 青岛银行A股涨停H股暴涨超50%
  4. 2022-09-05:作为国王的统治者,你有一支巫师军队听你指挥。 :给你一个下标从 0 开始的整数数组 strength , 其中 strength[i] 表示第 i 位巫师的力量值。 对于连续的一
  5. 计算机推演未来发展动象,大学生计算机基础学习心得五篇
  6. UOJ#172. 【WC2016】论战捆竹竿
  7. MATLAB 安装 问题 配置Microsoft Visual C++ 2008 Redistributable 的解决方法
  8. Android仿微信朋友圈6之实现消息提醒功能
  9. 海洋霸权和Libra
  10. CPU圓形風扇底座怎麼拆