【发布时间】:2020-08-11 03:37:28
【问题描述】:
我的 VueJS 和 Vuetify 项目有问题。
我想创建一个带有可扩展行的表。这将是一张订单表,可以查看每个订单的购买产品。对于一页,它应该显示至少 100 行订单。
为此,我使用了 Vuetify 框架中的<v-data-table>。
有什么问题?
在准备好一切之后,我意识到它可以工作,但是对于每一行的扩展,我必须等待几秒钟(它太长了 - 它必须是一个快速的系统)。并且为了扩展所有可见记录,需要等待超过 20 秒整个页面滞后。
我尝试了什么?
我从标准的 Vuetify <v-data-table> 和 show-expand 属性和 expanded-item 插槽开始 - 这是我的第一次尝试 - 最慢。
其次,我尝试自己创建 - 但使用 Vuetify:
<v-data-table>
<template v-slot:item="{item}">
<td @click="item.expanded = !item.expanded">expand / hide</td>
<!--- [my table content here - too long to post it here] -->
<tr v-if="item.expanded">
<td :colspan="headers.length">
<v-data-table>
<!--- [content of the nested table - also too long to post it here] -->
</v-data-table>
</tr>
</template>
</v-data-table>
有趣的是 - 我意识到 v-if 比 v-show 工作得更快,这是一个奇怪的事实,因为我认为将 display: none 更改为空应该比将整个对象添加/删除到 DOM 问题更少.
这种方法比第一种方法快一点,但还是太慢了。
我发现了一个提示,可以为我的表中的每个 v-btn 设置 :ripple="false",我做到了 - 有所帮助,但只是一点点。
一切都在 Chrome 和 Firefox 上进行了测试,在三台装有 Windows 和 Linux Fedora 的设备以及两部 Android 智能手机上进行了测试。
我还应该做什么?
提前谢谢你!
【问题讨论】:
-
数据项是什么样的?您是否在扩展项目时延迟加载它们?
-
在 VueJS 的挂载部分,我运行 Vuex 操作,它会立即从数据库中获取带有交易的订单,因此当订单展开时,交易将从状态加载
-
真的很难说没有看到实际的数据结构。项目对象是大、复杂还是嵌套严重?您能否简化返回的初始数据库结构,然后随着行的展开而按需延迟加载项目详细信息?
-
好的,这是一份包含所有数据的订单:pastebin。在我的订单数组中应该至少有 100 行这样的。
-
我尝试使用纯 js onClick="" 事件 - 简单的函数添加/删除
display: nonecss 属性。它很快就起作用了。但是如何在 VueJS 中实现呢?
标签: javascript performance vue.js vuejs2 vuetify.js