javascript - 在反应中渲染二维数组的最佳方法?
问题描述
我正在尝试生成图形视图,但遇到了性能问题。我想更新视图,例如拖动起始节点,并将其反映在底层模型中。模型的更新似乎会强制更新图中每个节点的状态。我是否只是切换到带有键的地图并存储列和行以包装演示文稿?
<Graph>
{graph.map((row: any, i: number) => {
return (
<GraphRow key={i}>
{row.map((node: any) => {
return (
<GraphNode
className={Object.keys(node)
.filter(key => node[key])
.join(" ")}
key={`${node.x} ${node.y}`}
onClick={() => updateNode(toggleIsWall(node))}
onDragStart={() => {
setDraggedNode(node);
}}
onDragEnter={() => {
handleDragEnter(node);
}}
onDragLeave={() => {
handleDragLeave(node);
}}
onDragEnd={() => {
handleDragEnd(node);
}}
draggable
>
<div>
{node.x}, {node.y}
</div>
</GraphNode>
);
})}
</GraphRow>
);
})}
</Graph>
解决方案
谢谢您的帮助。我实现了自己的shouldComponentUpdate
,这有帮助,但还不够。我的方法的根本问题是试图用 div 表示节点。该数量的 div 表现非常糟糕。相反,我用来<svg>
表示每个节点。据我了解,如果那没有得到我需要的性能,那么下一步将是使用画布。希望这可以帮助某人。干杯!
推荐阅读
- groovy - 为什么groovy中会出现MissingMethodException的错误?
- javascript - 使用正则表达式在 JavaScript 中对 HTML 表进行排序
- python - 用户匹配查询不存在;定义了 User.DoesNotExist 异常处理程序
- docker - 在 docker build 期间挂载 CDROM 存储库
- javascript - Vue JS,如何在加载 HTML DOM 组件之前先运行 axios 请求 API?
- neo4j - 在 Neo4j 全文搜索索引中包含布尔值
- javascript - 自动递增正确格式的序列号
- mule - 任何点工作室中的 Mule 应用程序抛出原因:java.lang.ClassNotFoundException:com.google.common.cache.CacheLoader 错误
- angular - Angular 9.0.x 中缺少 ngtools2.ts 文件
- c++ - 逐元素从较小的数组转移到较大的数组