【发布时间】:2021-06-12 04:38:51
【问题描述】:
我遇到了一个让我大吃一惊的性能问题。 给定以下组件:
<template lang="pug">
div
div {{ counter }}
div(v-for="idx in new Array(10000).keys()", :key="idx")
b-button(v-on:click="increment()") ++
</template>
<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
@Component
export default class Test extends Vue {
private counter = 0;
increment() {
console.log(Date.now());
this.counter++;
}
}
</script>
我希望当我更改 counter 时,vue 不会重新渲染整个组件。看来我错了,当counter 更改时,我的表现很糟糕。我是否遗漏了什么,vue 应该如何工作?
更新
我用预先计算的值替换了new Array(10000).keys() 调用,但性能保持不变。用常规按钮替换 b-button 可以显着提高性能,这向我表明,由于某种原因,每次 counter 更改时都会重新创建所有按钮。
<template lang="pug">
div
div {{ counter }}
div(v-for="idx in keys", :key="idx")
b-button(v-on:click="increment()") ++
</template>
<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
@Component
export default class Test extends Vue {
private counter = 0;
private keys = [...new Array(10000).keys()];
increment() {
console.log(Date.now());
this.counter++;
}
}
</script>
更新
删除div {{ counter }} 绑定可以获得完美的性能(例如,替换为div 0)。
【问题讨论】:
标签: vue.js vuejs2 vue-component bootstrap-vue