【发布时间】:2019-03-08 04:30:16
【问题描述】:
我正在构建一个在同一个视图中安装数百甚至数千个 vue 组件实例的应用程序。每个组件都有一个 id,它引用 vuex 存储中的一个对象。
<my-component :id="item1"></my-component>
<my-component :id="item2"></my-component>
<my-component :id="item3"></my-component>
...
商店:
state: {
myComponentData: [
{
id: 'item1',
name: 'Hawaiian Shirt',
selected: false,
// ...
},
// ...
]
}
在 my-component 中,我在 store 中查找它的对象并将其存储在计算属性中:
computed: {
myComponentData: function () {
return this.$store.state.myComponentData.find(el => el.id === this.id);
},
isSelected: function () {
return this.myComponentData.selected;
},
// ...
}
可以通过与组件本身或应用程序中其他位置的其他组件交互来操作商店中的对象属性。
问题是当我尝试使用数百或 1000 多个元素运行此程序时,加载需要 30 秒或更长时间。
如果我删除计算的属性,或者用静态值替换它们,那么页面会无缝加载。只有当我尝试从存储中加载所有计算属性时才会出现延迟问题。
在加载许多(1500 多个)使用计算属性和 Vuex 的 Vue 组件时,有没有办法提高性能?我已经研究了动态/异步组件、vue-async-computed 和 vue-rx 作为可能的解决方案,但我不确定在这种情况下哪个会有所帮助。
【问题讨论】:
-
我认为您最好的选择是在处理大型列表时采用虚拟滚动包之类的方法。本质上,不要渲染组件,直到它在 DOM 中可见(或在某个 +/- 阈值内)。
-
除了@DigitalDrifter 所说的,您也可以使用功能组件。 vuejs.org/v2/guide/render-function.html#Functional-Components
标签: asynchronous vue.js vuex