我有一个反应数据表,我正在努力使其更加轻量级,以便它可以在较弱的设备上用于较大的数据集。我正在尝试一些事情,并且听到了有关 preact/signals 的好消息,但我看到的示例是非常基本的用例,我对性能提升非常怀疑。我看到两种例子。
import { signal } from "@preact/signals-react";
const count = signal(0);
function Counter() {
return (
<div>
<p>Count: {count}</p>
<button onClick={() => count.value++}>click me</button>
</div>
);
}
import { signal } from "@preact/signals";
const todos = signal([
{ text: "Buy groceries" },
{ text: "Walk the dog" },
]);
我想要实现的是,我有一个具有许多属性(都具有相同类型)的元素列表,我可以在其中使用诸如react-window之类的东西创建虚拟化列表。我只能“订阅”状态的片段,因此应用程序仅重新渲染绝对必要的内容。
所以列表可能是这样的,您可以在其中编辑某些字段(未计算)
名字 | 姓氏 | 全名 | 电子邮件 | 电话 |
---|---|---|---|---|
洛琳 | 罗达 | 洛琳罗达 | ... | ... |
杰琳 | 天堂 | 杰琳天堂 | ... | ... |
万寿菊 | 狐狸 | 万寿菊狐狸 | ... | ... |
是否可以通过修改某人的姓氏仅重新呈现该特定行的姓氏和全名的方式来制作此列表? (或者更好的是,甚至不重新渲染单元格,只是更改字符串)
如何使我的信号“可精细订阅和修改”?
实际上很简单:信号可以嵌套。
import { signal } from '@preact/signals-react';
const person = signal({
firstName: signal('John'),
lastName: signal('Doe'),
});
function App() {
console.log('component rerender');
return (
<div>
<p>{person.value.firstName}</p>
<p>{person.value.lastName}</p>
<input onInput={(e) => (person.value.firstName.value = e.target.value)} />
</div>
);
}
您可以使用该输入编辑名字,完整的组件将不会重新渲染;相反,只会更新
firstName
的文本。
对于你的表,你会做类似的事情,有一个信号包装一个数组,其中每个记录都使用信号作为其单独的属性。