Vue 如何实现头像组件缓存?

Vue 如何实现组件缓存?

版本:vue2
如存在一个头像组件,会被反复渲染使用。

头像组件内部:

会通过 props.user 传递的用户信息,异步获取用户头像并更新 data.show_url 来实现头像显示。
在获取到用户的头像前,展示的都是默认头像。

组件外部,父组件:

在一个列表中渲染N个头像组件,会出现几百个同样内容头像组件,但每个头像组件都会重新渲染。
即肉眼会看到头像从默认变为用户头像,然后拖动列表时频繁闪烁。

源码参考

头像组件大概实现如下:

<template>
    <img :src="show_url" v-if="show_url" />
    <img src="@/assets/logo.png" v-else />
</template>

<script>
export default {
    props: {
        user: {
            avatar: "",
            id: 0
        },
    },
    data() {
        return {
            show_url: "",
        }
    },
    methods: {
        async loadImage(userId) {
            this.show_url = await getLocalAvatarURL(userId) // 下载网络资源并存储为本地资源
        },
    },
    created() {
        if (this.user.id != "" && parseInt(this.user.id) > 0) {
            this.loadImage(this.user.id, this.user.avatar)
        }
    },
    watch: {
        "user.id":function (newVal) {
            const userId = newVal
            if (userId != "" && parseInt(userId) > 0) {
                this.loadImage(userId, this.user.avatar)
            }
        },
    },
}
</script>

父组件伪代码:

<template>
    <div v-for="item in users">
        <UserAvatar :user="item.user"></UserAvatar>
    </div>
</template>

能否实现同一内容的组件被内部缓存,展示时不再闪烁?

我尝试 <keep-alive> 加在父组件中,貌似是不太符合我的场景的,没有成功。
我能够想到的解决办法,那就是在父组件中,获取 users 数据前就把头像等资源拿到,这样渲染不会有闪烁。
但是这样感觉逻辑没有拆分开,会不会不太好?标准的做法是什么?非专业前端求助~

阅读 2.5k
1 个回答

把 show_url 的值缓存了就可以,目前主要是请求是异步的。可以使用 store 或者直接赋值回去。

keep-alive 应该也可以,但是我 这边遍历的好使不 没试过好使不好使,需要注意绑定 key

<template>
    <div v-for="item in users">
       <keep-alive>
           <UserAvatar :user="item.user" :key="item.id"></UserAvatar>
       </keep-alive>
    </div>
</template>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题