预防Hooks的小错误

安装 eslint-plugin-react-hooks

npm i eslint-plugin-react-hooks -D

并且在package.json中配置规则

"eslintConfig": {"extends": ["react-app","react-app/jest"],"plugins": ["react-hooks"],"rules": {"react-hooks/rules-of-hooks":"error"}}

Hooks的原理

  • 单向链表通过next把hooks串联起来
  • memoizedState存在fiber node上,组件之间不会相互影响
  • useState和useReducer中通过dispatchAction调度更新任务

Hooks的使用注意事项

  • 只能在顶层调用Hooks? Hooks是使用数组或单链表串联起来,Hooks顺序修改会打乱执行结果
  • useState在多个组件中引入,彼此之间会不会有影响? 在React中Hooks把数据存在fiber node上的,每个组件都有自己的currentlyRenderingFiber.memoizedState

Hooks的问题

  • 只能在顶层调用Hooks? Hooks是使用数组或单链表串联起来,Hooks顺序修改会打乱执行结果
  • useState在多个组件中引入,彼此之间会不会有影响? 在React中Hooks把数据存在fiber node上的,每个组件都有自己的currentlyRenderingFiber.memoizedState

对传统React的影响

生命周期函数如何映射到Hooks?

import {useEffect, useState,useRef} from 'react'class Counter extends Component{state = {overflow:0}static getDerivedStateFromProps(props, state) {if (props.count > 10) {return {overflow:true}}}
}function Counter(props) {const [overflow, setOverflow] = useState(false)if (props.count > 10) {setOverflow(true)}
}
export default App;
import {useEffect, useState,useRef} from 'react'function App() {const [count, setCount] = useState(0);const it = useRef();useEffect(() => {// componentDidMountit.current=setInterval(() => {setCount(count=>count +1)},1000)return () => {// componentWillUnmountconsole.log("组件即将被删除")}}, [])useEffect(() => {if (count >= 10) {// componentDidUpdateclearInterval(it.current)}})return (<div>count:{count}</div>)
}
export default App;

函数组件还没办法完全取代类组件,componentDidCatch和 componentDidCatch和getSnapshotBeforeUpdate函数还不能被代替

  1. React16新的生命周期弃用了componentWillMount、componentWillReceivePorps,componentWillUpdate
  2. 新增了getDerivedStateFromProps、getSnapshotBeforeUpdate来代替弃用的三个钩子函数(componentWillMount、componentWillReceivePorps,componentWillUpdate)
  3. React16并没有删除这三个钩子函数,但是不能和新增的钩子函数(getDerivedStateFromProps、getSnapshotBeforeUpdate)混用,React17将会删除componentWillMount、componentWillReceivePorps,componentWillUpdate
  4. 新增了对错误的处理(componentDidCatch)

类实例成员变量如何映射到Hooks ?

class App{it = 0
}
function App() {const it =useRef(0)
}

Hooks中如何获取历史props和state ?

import React,{useEffect, useState,useRef} from 'react'function Counter(props) {const [count, setCount] = useState(() => {return props.defaultCount || 0});const prevCountRef = useRef();const prevCount =prevCountRef.current >= 0?prevCountRef.current :"count未发生变化"let it =useRef()useEffect(() => {prevCountRef.current = count}, [count]);useEffect(() => {it.current=setInterval(() => {setCount(count=>count +1)},100)},[])useEffect(() => {if (count >= 10) {clearInterval(it.current)}})return <button onClick={() => {setCount(count+1)}}>Now:{count},before:{prevCount}</button>
}export default Counter;
  1. 定义一个ref来保存上一次的count值
  2. 副作用同步count到ref中,页面ref不受重新渲染的影响
  3. 可以在下一次渲染周期中取出上一次渲染内容

如何强制更新一个Hooks组件?

import {useEffect, useState,useRef} from 'react'function App() {const [count, setCount] = useState(0)const [updater,setUpdate]=useState(0)function forceUpdater() {setUpdate(updater => updater + 1)}const prevCountRef = useRef();useEffect(() => {prevCountRef.current = count;})const prevCount = prevCountRef.currentreturn <h1>Now:{count},before:{prevCount}</h1>
}
export default App;
  1. 创建一个不参与实际渲染的state
  2. 更新值,以此来出发强制渲染

今日金句

人若软弱,就是最大的敌人;人若坚强,就是最好的朋友。坚强的个性,才是你怯懦时的打气筒,摔倒时的拐杖,冲锋时的号角。人生最大的悲剧,并不是败给了对手,而是败给了自己。

Hooks 常见的问题相关推荐

  1. React之 常见的hooks

    前面是类组件,今天是函数式组件 函数式组件的特点 没有状态 没有生命周期 没有this useState src>index.js import React from 'react' impor ...

  2. git原理及常见使用方法

    Git 原理入门-来自阮一峰 Git 是最流行的版本管理工具,也是程序员的必备技能之一. 即使天天使用它,很多人也未必了解它的原理.Git 为什么可以管理版本?git add.git commit这些 ...

  3. Java 最常见的 10000+ 面试题及答案整理:持续更新

    Java面试题以及答案整理[最新版]Java高级面试题大全(2021版),发现网上很多Java面试题都没有答案,所以花了很长时间搜集,本套Java面试题大全,汇总了大量经典的Java程序员面试题以及答 ...

  4. React学习笔记5:React Hooks概述

    文章目录 概述 React的两套API 类和函数的差异 副效应(副作用)是什么? 钩子(hook)出现的意义 三大框架对比 为什么学习hooks 应用场景 新版本特性解读 Hook使用规则 概述 Re ...

  5. 探React Hooks

    前言 众所周知,hooks在 React@16.8 中已经正式发布了.而下周周会,我们团队有个同学将会仔细介绍分享一下hooks.最近网上呢有不少hooks的文章,这不免激起了我自己的好奇心,想先行探 ...

  6. spring.profiles.active配置了没生效_一文带你彻底学会 Git Hooks 配置

    你好,我是小桔,是一个没有感情的代码崽. 今天给大家介绍一下 Git Hooks,相信 Git 大家都在用吧,Git 除了用作版本控制,还有许多高级功能,Git Hooks 就是其中之一. 本文环境: ...

  7. 【译】什么是React Hooks

    原文:What are React Hooks? 作者:Robin Wieruch 译者:博轩 React Hooks 于 2018年10月的React Conf 中引入,作为在 React 函数组件 ...

  8. 理解 React Hooks

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由志航发表于云+社区专栏 TL;DR 一句话总结 React Hooks 就是在 react 函数组件中,也可以使用类组件(classe ...

  9. (十三)react hooks

    react hooks react hooks 出几道react hooks面试题 class组件存在哪些问题 用useState实现state和setState功能 用useEffect模拟组件生命 ...

最新文章

  1. PVN3D: 基于Deep Point-wise 3D关键点投票的6D姿态估计网络(香港科技大学提出)
  2. android 手机 吉字节,Java 数据类型05Android开发小典
  3. php excel 组件,Yii Framework框架使用PHPExcel组件的方法示例
  4. springboot文件上传服务器,SpringBoot: 浅谈文件上传和访问的坑 (MultiPartFile)
  5. Mysql价格降低20%应该怎么写_mysql优化20条原则
  6. Comet OJ - 2019 六一欢乐赛
  7. Python每日小知识(2):字符串和编码
  8. Docker的Solomon Hykes在OSCON上的主题演讲的要点
  9. Git(9):通俗易懂的Git指令
  10. vcpkg 详细介绍
  11. 机器学习(3)特征提取2 -- 文本特征提取(包括中文文本特征提取)
  12. java线性方程组求解_java解线性方程组
  13. (已解决)ubuntu下网易云音乐无法打开
  14. linux超进程,linux下查看超线程
  15. html类型的网页文件,文件的ContentType类型-网页设计,HTML/CSS
  16. mysql alter auto increment_修改mysql中Auto_increment值的例子
  17. 【DB】数据库面试笔试题库及详解(小麦苗DBA宝典出品)--数据库运维宝典
  18. sqlserver实现抽奖Demo
  19. Android 中触摸事件与点击事件分析
  20. 1.Python-准备工作:搭建环境与“Hello,world!”

热门文章

  1. 网络劫持问题都应该如何解决?
  2. 2019年第十届蓝桥杯c/c++B组国赛决赛真题题目
  3. 基于JAVA糖果销售管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  4. UE4项目聚集—为所有创意人开放的虚幻引擎
  5. 蓝牙服务器维修理地址,云服务器蓝牙
  6. 自动切换手机耳机模式和话筒模式
  7. 微信小程序tabBar改变图片大小方法
  8. 如何大幅提高 Django 网站加载速度
  9. oracle自带加加解密工具的使用一例
  10. P3488 [POI2009]LYZ-Ice Skates