当前位置: 首页 > 面试题库 >

React如何实现钩子,使其依赖于调用顺序

晋功
2023-03-14
问题内容

React Hooks useState 可以将本地状态附加到无状态功能组件,例如

const [name, setName] = useState('tom')
const [age, setAge] = useState(25)

我想知道执行上面两行后的本地状态对象树是什么样子? 胡克规则说了一些关于状态如何处理的事情

React依赖于Hook的调用顺序

还是局部状态根本不是对象树,而只是一个数组?

提前致谢!


问题答案:

挂钩在内部实现为队列,每个挂钩由引用下一个的节点表示。

从文档中:

每个组件都有一个内部的“内存单元”列表。它们只是JavaScript对象,我们可以在其中放置一些数据。当您调用类似于useState()的Hook时,它将读取当前单元格(或在第一个渲染期间将其初始化),然后将指针移至下一个单元格。这就是多个useState()调用的方式如何各自获得独立的本地状态。

该架构将类似于

{
  memoizedState: 'A',
  next: {
    memoizedState: 'B',
    next: {
      memoizedState: 'C',
      next: null
    }
  }
}

单个钩子的架构如下。可以在实现中找到

function createHook(): Hook {
  return {
    memoizedState: null,

    baseState: null,
    queue: null,
    baseUpdate: null,

    next: null,
  };
}

使钩子表现为memoizedStateand 的关键属性next

在调用每个函数之前,prepareHooks()将调用Component调用,其中,当前光纤及其在hooks队列中的第一个钩子节点将存储在全局变量中。这样,每当我们调用一个钩子函数时(useXXX()),它将知道在哪个上下文中运行。

在update finishHooks()之后,将调用该钩子队列中第一个节点的引用,该引用将存储在该memoizedState属性中的渲染光纤上



 类似资料:
  • 我发现自己处于一种奇怪的境地。我正在实现一个钩子,我无法实现我想要的。 我有这样的想法: 我的问题是函数setFoo正确执行,所以foo state是一个新的数组,但是setBar依赖于foo的状态,接收一个空数组。基本上setBar是在setFoo完成之前执行的,所以getBar函数接收一个空数组。 管理这种依赖的正确方法是什么? 谢谢F

  • 问题内容: 我有一个使用的组件,然后它的输出取决于上下文中的值。一个简单的例子: 当使用来自react和jest快照的浅色渲染器测试此组件时。如何更改值? 问题答案: 通常,使用钩子应该不会改变测试策略。实际上,这里更大的问题不是问题,而是上下文的使用,这使事情变得有些复杂。 有很多方法可以使这项工作,但是我发现唯一可以使用的方法是注入一个模拟钩子: 但是,这有点脏,并且是特定于实现的,因此,如果

  • 我在useeffect钩子上得到以下错误。 React Hook use效应有一个缺失的依赖项:当前页面。要么包含它,要么删除依赖array.eslintreact-钩子/穷举-deps 你知道我为什么会得到这个吗? }

  • 问题内容: React钩子介绍了用于设置组件状态的方法。但是我如何使用钩子来代替如下代码的回调: 我想在状态更新后做一些事情。 我知道我可以用来做其他事情,但是我必须检查状态以前的值,这需要一个位代码。我正在寻找可以与钩子一起使用的简单解决方案。 问题答案: 您需要使用钩子来实现此目的。

  • React hooks引入了来设置组件状态。但是我如何使用钩子来替换回调,如下代码所示:

  • 当类组件的输入道具相同时,可以使用PureComponent或ShouldComponentUpdate来避免呈现。现在,您可以通过将函数组件包装在react.memo中来对它们进行同样的处理。 所期望的: 我希望只有当模态可见时才呈现模态(由this.props.show管理) 对于类组件: 如何在功能组件中使用?在modal.jsx中? 相关代码: 功能组件modal.jsx(我不知道如何检查