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

Vue 如何实现组件缓存?

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

头像组件内部:

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

组件外部,父组件:

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

源码参考

头像组件大概实现如下:

<template>

<img :src="show_url" v-if="show_url" />

<img src="@/assets/logo.jpg" 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 数据前就把头像等资源拿到,这样渲染不会有闪烁。
但是这样感觉逻辑没有拆分开,会不会不太好?标准的做法是什么?非专业前端求助~


回答:

把 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>

以上是 Vue 如何实现头像组件缓存? 的全部内容, 来源链接: utcz.com/p/932978.html

回到顶部