javascript - 在反应状态下使用类实例
问题描述
我有一堂课
class Booper{
constructor(){
this.boops = 0;
}
}
以及使用此类来维护某些状态的反应组件
import React, {useState} from 'react';
import ReactDOM from 'react-dom';
const App = () => {
const [booper, setBooper] = useState(new Booper());
const handleClick = () => {
booper.boops = booper.boops+1;
setBooper(booper);
}
return (
<div>
{booper.boops}<br/>
<button onClick={handleClick}>
Boop? :(
</button><br/>
</div>
)
}
ReactDOM.render(<App />, document.querySelector("#root"))
但是,当我单击按钮时,反应似乎不会触发重新绘制。
如果我添加以下内容,它确实有效。
const App = () => {
...
const clone = (original) => {
return Object.assign(Object.create(Object.getPrototypeOf(original)), original)
}
const handleClickWithClone = () => {
const cloned = clone(booper)
cloned.boops = cloned.boops+1
setBooper(cloned);
}
...
return (
<div>
...
<button onClick={handleClickWithClone}>
Boop! :)
</button><br/>
</div>
)
}
但是,我不完全确定这是要走的路。我不知道垃圾收集器是否会清理所有克隆的对象。或者,如果此解决方案存在其他性能问题。
有没有更好的方法在反应状态中使用类实例?
(完整的小提琴:https ://jsfiddle.net/ho6fka1x/2/ )
解决方案
您正在直接改变状态,这不会导致重新渲染。
这应该工作
const handleClick = () => {
// booper.boops = booper.boops + 1; //<---remove this
setBooper(prev => ({...prev, boops: prev.boops + 1}));
};
推荐阅读
- asp.net-mvc - 错误“不包含 'Select' 的定义并且没有扩展方法 'Select'
- python - 我需要 Python 拼写检查器的帮助
- powershell - 在 DataGridView 中搜索字符串并仅显示结果
- linux - 对通过管道传输到“读取时”的多个文件的tail -f 会产生意想不到的结果
- android - SearchView 使用 PageKeyedDataSource 不显示任何结果甚至错误
- android - 将许多图像从外部存储加载到 ListView 中的 ImageViews
- string - 如何将一行中的哈希引用转换为perl中的常量
- android - 从 Fragment1 调用 Fragment2 获取结果
- python - 我有 2 个数据集 xy 和 xi,我想将它们组合成一个数据集我该怎么做
- java - 在 Stream API 中跳过相同的组合