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

react hooks后面的JavaScript机制如何工作?

柳杰
2023-03-14
问题内容

我的问题与使反应挂钩成为可能的Javascript机制有关。

React的最新发展使我们能够创建钩子。对于React状态,在以下简单函数中:

function App () {
  const [someVar, setSomeVar] = useState('someVarDefaultValue');
  return (
    <div 
      onClick={() => setSomeVar('newValue')}>{someVar}
    </div>
  );
}

挂钩useState返回带有访问器和变量的数组,我们通过App函数内部的数组分解来使用它们。

因此,在幕后,该钩子看起来像(只是一个伪代码):

function useState(defaultValue) {
  let value = defaultValue;

  function setValue(val) {
    value = val;
  }

  return [value, setValue];
}

当您在JS中尝试此方法时,它将无法正常工作-
如果您在setValue某处使用,从数组分解的值将不会更新。即使您将value用作对象,也不能使用Primitive defaultValue

我的问题是挂钩机制在JS中如何工作?

从我在React
源代码中看到的内容来看,它使用reducer函数和对Flow进行类型检查。对于我来说,要理解全局,代码很棘手。

这个问题不是关于如何在React中编写自定义钩子。


问题答案:

您必须将值存储在函数外部,以便在调用之间返回持久性结果。另外,设置该值必须在其调用的组件上重新渲染:

 // useState must have a reference to the component it was called in:
 let context;

 function useState(defaultValue) {
   // Calling useState outside of a component won't work as it needs the context:
   if(!context) throw new Error("Can only be called inside render");
   // Only initialize the context if it wasn't rendered yet (otherwise it would re set the value on a rerender)
   if(!context.value)
    context.value = defaultValue;
   // Memoize the context to be accessed in setValue
   let memoizedContext = context;
   function setValue(val) {
      memoizedContext.value = val;
      // Rerender, so that calling useState will return the new value
      internalRender(memoizedContext);
   }

  return [context.value, setValue];
 }

// A very simplified React mounting logic:
function internalRender(component) {
   context = component;
   component.render();
   context = null;
}



 // A very simplified component
 var component = {
  render() {
    const [value, update] = useState("it");
    console.log(value);
    setTimeout(update, 1000, "works!");
  }
};

internalRender(component);

然后,在setValue被调用时,组件useState将重新渲染,然后将再次被调用,并且将返回新值。



 类似资料:
  • 问题内容: 描述为: “共享秘密”的存储库,这是一种在不使用反射的情况下在另一个程序包中调用实现私有方法的机制。package- private类实现了一个公共接口,并提供了在该包内调用package- private方法的能力。实现该接口的对象是通过限制访问的第三包提供的。该框架避免了为此目的使用反射的主要缺点,即损失了编译时检查。 有人可以提供一个示例来说明此机制如何使一个包中的类访问另一个包

  • 所以我以前遇到过这个问题,很自然地我在这里寻求帮助。Luksprog的回答很棒,因为我不知道ListView和GridView是如何通过回收视图来优化自己的。所以在他的建议下,我能够改变我向GridView添加视图的方式。问题是现在我有了一些没有意义的东西。这是我的来自我的: 问题是当我滚动时,这会发生,而不是在位置0上。。。看起来像是第6位和第8位,加上第8位有两个。现在我仍在尝试使用ListV

  • 本文向大家介绍Javascript 引擎工作机制详解,包括了Javascript 引擎工作机制详解的使用技巧和注意事项,需要的朋友参考一下 Javascript 引擎工作机制 javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈、全局对象、执行环境、变量对象、活动对象、作用域和作用域链等,这些概念正是JS引擎工

  • 问题内容: 我想创建一个发布-订阅基础结构,其中每个订阅者都将收听多个(例如100k)频道。 我认为可以将Redis PubSub用于此目的,但是我不确定在这里订阅数千个频道是否是最佳实践。为了回答这个问题,我想知道Redis中的订阅机制在后台如何工作。 另一种选择是为每个订户创建一个频道,并在两者之间放置一些组件,该组件将获取所有消息并将其发布到相关的频道。 还有其他想法吗? 问题答案: Sal

  • 问题内容: 以下代码如何将该数组按数字顺序排序? 我知道如果计算结果是… 小于0 :“ a”被排序为比“ b”低的索引。 零: “ a”和“ b”被视为相等,并且不执行排序。 大于0: “ b”被排序为比“ a”低的索引。 在排序过程中是否多次调用了数组排序回调函数? 如果是这样,我想知道每次将两个数字传递给函数。我假设它首先使用“ 25”(a)和“ 8”(b),然后是“ 7”(a)和“ 41”(

  • 本文向大家介绍spark工作机制?相关面试题,主要包含被问及spark工作机制?时的应答技巧和注意事项,需要的朋友参考一下 用户在client端提交作业后,会由Driver运行main方法并创建spark context上下文。 执行add算子,形成dag图输入dagscheduler,按照add之间的依赖关系划分stage输入task scheduler。 task scheduler会将sta