vue的slot中的子组件每次都会被update,频繁update导致性能低下,如何避免?

如这个样例(请点击后查看Console变化):
https://codepen.io/hzsrc/pen/gbYxOry

只要组件中任何状态发生变化,vue的slot中的子组件每次都会被update,频繁update导致性能低下。

一些大组件(比如多行多列的表格),里面有上千个单元格子组件,每次只要修改表格的任何一个属性,都会导致整个表几千个子组件全部update,造成严重的性能问题。

这属于bug吗,有没有办法避免不必要的update吗?

阅读 331
2 个回答

用作用域插槽

<template>
    <div>
        <section>
            <div v-for="row in rows" :key="row.pkey">
                <button @click="row.checked=!row.checked">Change checked:</button>
                <cell v-slot="slotProps">
                    <span>{{row.checked}}</span>
                </cell>
            </div>
        </section>
        <hr>
        <section>
            <button @click="num++">Change num:</button>
            {{num}}
        </section>
    </div>
</template>

<script>
const cell = {
    template: '<span><slot :data="{}"></slot></span>',
    updated() {
        console.log('cell updated')
    }
}

export default {
    components: { cell },
    data() {
        return {
            rows: Array(10).fill().map((_, i) => ({
                checked: 0,
                pkey: i
            })),
            num: 0
        }
    }
}
</script>

或者用函数式组件:


<template functional>
    <span>
        <slot></slot>
    </span>
</template>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏