gpt4 book ai didi

javascript - 这是闭包在 useState 钩子(Hook)中的工作方式吗?

转载 作者:行者123 更新时间:2023-12-05 05:55:09 25 4
gpt4 key购买 nike

我想了解如何使用纯 Javascript 实现 useState Hook 。我卡在了使用闭包的部分。

这是代码。

    const React = (function () {
let hooks = [];
let idx = 0;

function useState(initVal) {
const _idx = idx;
console.log(_idx) // 0, 1

const state = hooks[idx] || initVal;

const setState = newVal => {
hooks[_idx] = newVal;
};

idx++;
return [state, setState];
}

function render(Component) {
idx = 0;
const C = Component();
C.render();
return C;
}

return { useState, render };
})();

function Component() {
const [count, setCount] = React.useState(1);
const [text, setText] = React.useState('apple');

return {
render: () => console.log({ count, text }),
click: () => setCount(count + 1),
type: (word) => setText(word),
}
}

var App = React.render(Component); // {count: 1, text: "apple"}
App.click();
var App = React.render(Component); // {count: 2, text: "apple"}
App.type('pear');
var App = React.render(Component); // {count: 2, text: "pear"}

当 setState 函数(点击或输入)被调用时,它根据索引更新钩子(Hook)数组的值,计数为 0,文本为 1。

这意味着 useState 中的 setState 函数通过 javascript 闭包记住每个状态(计数和文本)的 _idx 的值?

最佳答案

Which means setState function inside useState remembers the value of _idx of each state(count and text) by javascript closure?

是的。当调用 useState 时,它使用 idx 获取下一个可用索引并将其存储在常量 _idx 中。返回的 setState 函数形成一个闭包,因为即使 useState 已完成执行,它也会记住与其状态对应的 _idx

I stuck at the part where the closure is used.

其他使用闭包的地方:

    React 模块内的
  • useStaterender 函数在 hooksidx 上形成一个闭包。因此,即使在 React(一个 iife)完成执行后,函数也能够读取/写入这些变量。
  • renderclicktype 函数形成一个闭包。render 方法关闭 Component。因此,即使在 Component 函数执行完毕后,它也能够访问 counttext。类似地,clicktype 形成一个闭包,因此可以调用在 中定义的 setCountsetText 函数>组件范围。

关于javascript - 这是闭包在 useState 钩子(Hook)中的工作方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69528217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com