javascript - 我试图在纯 JavaScript 中实现 useState 钩子以查看它的工作原理。下面是我的代码,但它不工作并进入无限循环
问题描述
对我来说,React 能够在重新渲染之间保持函数组件内的状态变量值似乎有点神奇。所以我试图实现自己,看看事情是如何运作的。但是失败了。如果您可以指出一些好的资源,我可以在其中看到实现此过程的幕后内容,或者可以告诉我在代码中做错了什么。在这一点上,React 源代码对我来说有点难以理解。谢谢你。
const MyReact = {
state: null,
stateInitialized: false,
setState(newState) {
if (this.state !== newState);
{
this.state = newState;
Component();
}
},
useState(initialValue) {
if (!this.stateInitialized) {
this.stateInitialized = true;
this.state = initialValue;
}
return [this.state, this.setState];
},
};
function Component() {
const [count, setCount] = MyReact.useState(10);
console.log(count);
setCount(20);
}
Component();
解决方案
您的代码中有两个问题:
setState()
:中的分号错误if (this.state !== newState);
,导致无条件调用 ofComponent()
,从而导致无休止的递归。- 更微妙:在
useState()
中,您返回时this.setState
没有将其绑定到MyReact
,这会导致全局setCount()
设置state
(即在window
对象上)。将其替换为this.setState.bind(this)
。
推荐阅读
- ios - 当ios应用程序处于非活动状态时需要多少秒才能进入后台状态
- python - 如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?
- dart - 将值添加到 DART 中其他地图的地图
- ios - 在 Swift 中以编程方式将按钮添加到 stackView
- google-cloud-platform - 如何在 Google Cloud 中运行无服务器批处理作业
- python - 如何使用 apply 函数和 lambda 函数将列表的值添加到列值?
- python - pyspark pandas 对象作为数据框 - TypeError
- scala - 基于过滤器的csv文件读取和循环
- java - 我需要在第二个“if”语句中更改什么?
- javascript - 如何像推特一样加载网页