首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

第八篇:深入 React-Hooks 工作机制:“原则”的背后,是“原理”

React 团队面向开发者给出了两条 React-Hooks 的使用原则,原则的内容如下: 1. 只在 React 函数中调用 Hook; 2. 不要在循环、条件或嵌套函数中调用 Hook。...这个注释——因为目前大部分的 React 项目都在内部预置了对 React-Hooks-Rule(React-Hooks 使用规则)的强校验,而示例代码中把 Hooks 放进 if 语句的操作作为一种不合规操作...我们一起来看看单击“修改姓名”按钮后会发生什么: 组件不仅没有像预期中一样发生界面变化,甚至直接报错了。报错信息提醒我们,这是因为“组件渲染的 Hooks 比期望中更少”。...这个现象有点像我们构建了一个长度确定的数组,数组中的每个坑位都对应着一块确切的信息,后续每次从数组里取值的时候,只能够通过索引(也就是位置)来定位数据。...注意这个过程就像从数组中依次取值一样,是完全按照顺序(或者说索引)来的。

2.2K10

接着上篇讲 react hook

react hook 这里主要讲 hook 的语法和使用场景 hook Hook 是一个特殊的函数,使用了 JavaScript 的闭包机制,可以让你在函数组件里“钩入” React state 及生命周期等特性...userState 函数初始化变量值,返回一个数组,数组第一项是这个初始化的变量,第二项是响应式修改这个变量的方法名。...,下次用的时候直接拿计算的结果就好了,不需要计算( 如果我们有 CPU 密集型操作,我们可以通过将初始操作的结果存储在缓存中来优化使用。...如果操作必然会再次执行,我们将不再麻烦再次使用我们的 CPU,因为相同结果的结果存储在某个地方,我们只是简单地返回结果他通过内存来提升速度,React.useMemo 是新出来的 hooks api,并且这个...如果函数组件被 React.memo 包裹,且其实现中拥有 useState 或 useContext 的 Hook,当 context 发生变化时,它仍会重新渲染.默认情况下其只会对复杂对象做浅层对比

2.6K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    React Hooks 源码探秘:深入理解其内部工作机制

    前言React Hooks 是 React 16.8 引入的一个新特性,它允许你在不编写 class 组件的情况下使用 state 和其他 React 特性。...二、React Hooks概述React Hooks 是一系列可以让你在函数组件中添加状态和其他React特性的函数。Hooks只能在函数组件的顶层调用,且不能在普通的JavaScript函数中调用。...每次调用 useState 或 useEffect 时,都会检查当前的 hooks 数组中是否存在对应的 Hook。如果不存在,就会创建一个新的 Hook 并将其添加到数组中。3....如果有任何一个 Hook 的依赖项发生了变化,那么组件就需要重新渲染。...调用链:根据组件的渲染次数分配唯一的 hookIndex,并将对应的 Hook 存储在 hooks 数组中。渲染优化:通过比较依赖项来判断是否需要重新执行 Hooks。

    21021

    【React】1804- React 实现自动上报 pvclick 的埋点 Hooks

    前言 此篇文章笔者将围绕 React 中自定义 hooks 给大家讲讲自定义 hooks 的概念以及我们要如何来设计编写自定义 hooks......这是因为在更新过程中,如果通过 if 条件语句,增加或者删除 hooks,那么在复用 hooks 的过程中,会产生复用 hooks 状态和当前 hooks 不一致的问题。...使用到了如下4个 React Hooks: 使用 useContext 获取埋点的公共信息,当公共信息改变时,会统一更新。...使用 useEffect 监听 DOM 事件,把 reportMessage 作为依赖项,在 useEffect 中进行事件绑定,返回的销毁函数用于解除绑定。...效果 刚开始时依次点击按钮1,2,3,效果如下: 点击点击按钮后,再依次点击按钮1,2,3时,效果如下: 本文参考:React 进阶实践指南[2],感兴趣的小伙伴可以去瞧瞧~ 最后 以上就是笔者对于自定义

    44730

    从React源码学hooks

    例如,在如下的函数组件中:const [name, setName] = useState('小科比');setName('大科比');当我们点击 input 按钮时,执行了 setName(),此时对应的...函数组件更新过程我们的 hooks 都是在函数组件中使用的,所以让我们去看一下 render 过程关于函数组件的更新。...记录了当前页面的 state,在函数组件中,它以链表的形式记录了 hooks 信息) 和 updateQueue 置为 null,在接下来的函数组件执行过程中,会把新的 hooks 信息挂载到这两个属性上...,则保存在eagerState,下次 render 时可以直接使用,而无需再计算。...hook 存在,若存在且上一轮 render 和本轮的依赖项没发生变化,说明副作用不需要执行,创建一个 effect 对象添加到 updateQueue 链表后直接返回;若两次的依赖项发生了变化,向

    58940

    React源码分析6-hooks源码

    例如,在如下的函数组件中:const [name, setName] = useState('小科比');setName('大科比');当我们点击 input 按钮时,执行了 setName(),此时对应的...函数组件更新过程我们的 hooks 都是在函数组件中使用的,所以让我们去看一下 render 过程关于函数组件的更新。...记录了当前页面的 state,在函数组件中,它以链表的形式记录了 hooks 信息) 和 updateQueue 置为 null,在接下来的函数组件执行过程中,会把新的 hooks 信息挂载到这两个属性上...,则保存在eagerState,下次 render 时可以直接使用,而无需再计算。...hook 存在,若存在且上一轮 render 和本轮的依赖项没发生变化,说明副作用不需要执行,创建一个 effect 对象添加到 updateQueue 链表后直接返回;若两次的依赖项发生了变化,向

    63130

    React源码分析--hooks源码

    例如,在如下的函数组件中:const [name, setName] = useState('小科比');setName('大科比');当我们点击 input 按钮时,执行了 setName(),此时对应的...函数组件更新过程我们的 hooks 都是在函数组件中使用的,所以让我们去看一下 render 过程关于函数组件的更新。...记录了当前页面的 state,在函数组件中,它以链表的形式记录了 hooks 信息) 和 updateQueue 置为 null,在接下来的函数组件执行过程中,会把新的 hooks 信息挂载到这两个属性上...,则保存在eagerState,下次 render 时可以直接使用,而无需再计算。...hook 存在,若存在且上一轮 render 和本轮的依赖项没发生变化,说明副作用不需要执行,创建一个 effect 对象添加到 updateQueue 链表后直接返回;若两次的依赖项发生了变化,向

    2.9K40

    React-hooks源码

    例如,在如下的函数组件中:const [name, setName] = useState('小科比');setName('大科比');当我们点击 input 按钮时,执行了 setName(),此时对应的...函数组件更新过程我们的 hooks 都是在函数组件中使用的,所以让我们去看一下 render 过程关于函数组件的更新。...记录了当前页面的 state,在函数组件中,它以链表的形式记录了 hooks 信息) 和 updateQueue 置为 null,在接下来的函数组件执行过程中,会把新的 hooks 信息挂载到这两个属性上...,则保存在eagerState,下次 render 时可以直接使用,而无需再计算。...hook 存在,若存在且上一轮 render 和本轮的依赖项没发生变化,说明副作用不需要执行,创建一个 effect 对象添加到 updateQueue 链表后直接返回;若两次的依赖项发生了变化,向

    60440

    从React源码来学hooks是不是更香呢

    例如,在如下的函数组件中:const [name, setName] = useState('小科比');setName('大科比');当我们点击 input 按钮时,执行了 setName(),此时对应的...函数组件更新过程我们的 hooks 都是在函数组件中使用的,所以让我们去看一下 render 过程关于函数组件的更新。...记录了当前页面的 state,在函数组件中,它以链表的形式记录了 hooks 信息) 和 updateQueue 置为 null,在接下来的函数组件执行过程中,会把新的 hooks 信息挂载到这两个属性上...,则保存在eagerState,下次 render 时可以直接使用,而无需再计算。...hook 存在,若存在且上一轮 render 和本轮的依赖项没发生变化,说明副作用不需要执行,创建一个 effect 对象添加到 updateQueue 链表后直接返回;若两次的依赖项发生了变化,向

    64130

    React源码分析6-hooks源码6

    例如,在如下的函数组件中:const [name, setName] = useState('小科比');setName('大科比');当我们点击 input 按钮时,执行了 setName(),此时对应的...函数组件更新过程我们的 hooks 都是在函数组件中使用的,所以让我们去看一下 render 过程关于函数组件的更新。...记录了当前页面的 state,在函数组件中,它以链表的形式记录了 hooks 信息) 和 updateQueue 置为 null,在接下来的函数组件执行过程中,会把新的 hooks 信息挂载到这两个属性上...,则保存在eagerState,下次 render 时可以直接使用,而无需再计算。...hook 存在,若存在且上一轮 render 和本轮的依赖项没发生变化,说明副作用不需要执行,创建一个 effect 对象添加到 updateQueue 链表后直接返回;若两次的依赖项发生了变化,向

    71550

    React源码中的hooks是怎样运行的

    例如,在如下的函数组件中:const [name, setName] = useState('小科比');setName('大科比');当我们点击 input 按钮时,执行了 setName(),此时对应的...函数组件更新过程我们的 hooks 都是在函数组件中使用的,所以让我们去看一下 render 过程关于函数组件的更新。...记录了当前页面的 state,在函数组件中,它以链表的形式记录了 hooks 信息) 和 updateQueue 置为 null,在接下来的函数组件执行过程中,会把新的 hooks 信息挂载到这两个属性上...,则保存在eagerState,下次 render 时可以直接使用,而无需再计算。...hook 存在,若存在且上一轮 render 和本轮的依赖项没发生变化,说明副作用不需要执行,创建一个 effect 对象添加到 updateQueue 链表后直接返回;若两次的依赖项发生了变化,向

    1.3K70

    从React源码来学hooks是不是更香呢_2023-02-28

    例如,在如下的函数组件中: const [name, setName] = useState('小科比'); setName('大科比'); 当我们点击 input 按钮时,执行了 setName(),...函数组件更新过程 我们的 hooks 都是在函数组件中使用的,所以让我们去看一下 render 过程关于函数组件的更新。...memoizedState 记录了当前页面的 state,在函数组件中,它以链表的形式记录了 hooks 信息) 和 updateQueue 置为 null,在接下来的函数组件执行过程中,会把新的 hooks...,则保存在eagerState,下次 render 时可以直接使用,而无需再计算。...hook 存在,若存在且上一轮 render 和本轮的依赖项没发生变化,说明副作用不需要执行,创建一个 effect 对象添加到 updateQueue 链表后直接返回;若两次的依赖项发生了变化,向

    74930

    从React源码来学hooks是不是更香呢_2023-02-07

    例如,在如下的函数组件中:const [name, setName] = useState('小科比');setName('大科比');当我们点击 input 按钮时,执行了 setName(),此时对应的...函数组件更新过程我们的 hooks 都是在函数组件中使用的,所以让我们去看一下 render 过程关于函数组件的更新。...记录了当前页面的 state,在函数组件中,它以链表的形式记录了 hooks 信息) 和 updateQueue 置为 null,在接下来的函数组件执行过程中,会把新的 hooks 信息挂载到这两个属性上...,则保存在eagerState,下次 render 时可以直接使用,而无需再计算。...hook 存在,若存在且上一轮 render 和本轮的依赖项没发生变化,说明副作用不需要执行,创建一个 effect 对象添加到 updateQueue 链表后直接返回;若两次的依赖项发生了变化,向

    79120

    从React源码来学hooks是不是更香呢

    例如,在如下的函数组件中:const [name, setName] = useState('小科比');setName('大科比');当我们点击 input 按钮时,执行了 setName(),此时对应的...函数组件更新过程我们的 hooks 都是在函数组件中使用的,所以让我们去看一下 render 过程关于函数组件的更新。...记录了当前页面的 state,在函数组件中,它以链表的形式记录了 hooks 信息) 和 updateQueue 置为 null,在接下来的函数组件执行过程中,会把新的 hooks 信息挂载到这两个属性上...,则保存在eagerState,下次 render 时可以直接使用,而无需再计算。...hook 存在,若存在且上一轮 render 和本轮的依赖项没发生变化,说明副作用不需要执行,创建一个 effect 对象添加到 updateQueue 链表后直接返回;若两次的依赖项发生了变化,向

    71230

    React源码分析6-hooks源码_2023-02-21

    例如,在如下的函数组件中:const [name, setName] = useState('小科比');setName('大科比');当我们点击 input 按钮时,执行了 setName(),此时对应的...函数组件更新过程我们的 hooks 都是在函数组件中使用的,所以让我们去看一下 render 过程关于函数组件的更新。...记录了当前页面的 state,在函数组件中,它以链表的形式记录了 hooks 信息) 和 updateQueue 置为 null,在接下来的函数组件执行过程中,会把新的 hooks 信息挂载到这两个属性上...,则保存在eagerState,下次 render 时可以直接使用,而无需再计算。...hook 存在,若存在且上一轮 render 和本轮的依赖项没发生变化,说明副作用不需要执行,创建一个 effect 对象添加到 updateQueue 链表后直接返回;若两次的依赖项发生了变化,向

    83430

    超性感的React Hooks(五):自定义hooks

    每个数组都提供两个操作数组的按钮,点击一下,分别往原数组中添加数字1或者数字2 。 ? 结合之前我们总结过的useState与刚才封装好的equalArr方法,能够简单实现我们想要的效果。...利用这样的特性,当触发点击事件时,我们就不再关注额外的逻辑,而只需要关注数组A的变化即可。 在React Hooks中,这样的自定义方法,我们就可以称之为自定义Hooks。...由于使用场景的特殊性,在自定义的hooks中,我们还可以使用所有官方提供的hooks,例如useState,useEffect等。...基于这样的思考,在实践项目中,我们大概率会重复实现方法去请求同样的数据,用户信息,某个配置项信息,权限信息等等,都可以使用这样的思路一次性解决。 4 再进一步思考。...点击一下按钮,元素div宽度增加10像素。 jQuery中,点击事件会关注那些内容? 1.在原始宽度基础上+10px2.给元素div设置新的宽度值 而React的点击事件呢?

    1.3K30

    React Hooks 设计动机与工作模式

    /无状态组件(Function Component/Stateless Component) 函数组件顾名思义,就是以函数的形态存在的 React 组件。...看起来好像没啥毛病,但是如果你在这个在线 Demo中尝试点击基于类组件形式编写的 ProfilePage 按钮后 3s 内把用户切换为 Sophie,你就会看到如下图所示的效果: ?...React-Hooks 的出现,就是为了帮助函数组件补齐这些(相对于类组件来说)缺失的能力。 如果说函数组件是一台轻巧的快艇,那么 React-Hooks 就是一个内容丰富的零部件箱。...按照 useEffect 的设定,每当我们点击“点我增加一个待办项”这个按钮,驱动 count+1 的同时,DOM 结构里也会被追加一个 li 元素。以下是连击按钮三次之后的效果图: ?...Hooks 在使用层面有着严格的规则约束:对于如今的 React 开发者来说,如果不能牢记并践行 Hooks 的使用原则,如果对 Hooks 的关键原理没有扎实的把握,很容易把自己的 React 项目搞成大型车祸现场

    99540

    React Hooks踩坑分享

    如果要在项目中使用React Hooks,强烈推荐先安装eslint-plugin-react-hooks(由React官方发布)。...在很多时候,这个eslint插件在我们使用React Hooks的过程中,会帮我们避免很多问题。...本文主要讲以下内容: 函数式组件和类组件的不同 React Hooks依赖数组的工作方式 如何在React Hooks中获取数据 一、函数式组件和类组件的不同 React Hooks由于是函数式组件...二、React Hooks依赖数组的工作方式 在React Hooks提供的很多API都有遵循依赖数组的工作方式,比如useCallBack、useEffect、useMemo等等。...万不得已的情况下,你可以把函数加入effect的依赖项,但把它的定义包裹进useCallBack。这就确保了它不随渲染而改变,除非它自身的依赖发生了改变。

    2.9K30

    你可能不知道的 React Hooks

    应提供三个控制按钮: 启动、停止和清除。...突变、订阅、计时器、日志记录和其他副作用不允许出现在函数组件的主体中(称为 React 的 render 阶段)。 这样做会导致用户界面中的错误和不一致。...Level 5:使用 count 作为依赖项 useEffect(() => { const interval = setInterval(() => { setCount(count +...此代码没有资源泄漏,实现正确,但可能存在性能问题。 memoization 是 React 中主要的性能优化工具。 React.memo 进行浅比较,如果引用相同,则跳过 render 阶段。...防止在钩子上读写相同的数值 不要在渲染函数中使用可变变量,而应该使用useRef 如果你保存在useRef 的值的生命周期小于组件本身,在处理资源时不要忘记取消设置值 谨慎使用无限递归导致资源衰竭 在需要的时候使用

    4.7K20

    React报错之React Hook useEffect has a missing depende

    正文从这开始~ 总览 当useEffect钩子使用了一个我们没有包含在其依赖数组中的变量或函数时,会产生"React Hook useEffect has a missing dependency"警告...最明显的解决方法是将obj变量添加到useEffect钩子的依赖数组中。然而,在本例中,它将导致一个错误,因为在JavaScript中,对象和数组是通过引用进行比较的。...useMemo钩子接收一个函数,该函数返回一个要被记忆的值和一个依赖数组作为参数。该钩子只有在其中一个依赖项发生变化时才会重新计算记忆值。...useCallback 请注意,如果你正在使用一个函数,你将使用useCallback钩子来获得一个在渲染期间不会改变的记忆回调。...the rule for a single line // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return

    38510
    领券