【vue】关于异步函数使用不当导致的template内容完全无法渲染的问题

bash 复制代码
<script setup>
const fetchProduct = async () => {
  ......
}
await fetchProduct()
</script>

我突然template中的内容完全无法渲染

原因就是基础知识忘了(全栈工程师的通病,这一方面熟了,那一方面就生了)

解决方法是将 fetchProduct 的调用放在一个 onMounted 钩子函数中

bash 复制代码
onMounted(async () => {
  await fetchProduct()
})

将 fetchProduct 的调用放在 onMounted 钩子函数中的原因是:

异步操作和组件生命周期: fetchProduct 函数是一个异步函数,它使用 await 关键字来等待网络请求的完成。 异步操作需要时间,而 Vue 组件的渲染过程是同步的。 如果直接在 script setup 中调用 await fetchProduct(),Vue 会尝试立即渲染组件,但此时 fetchProduct 还没有完成,product、carouselItems 和 isLoading 等数据可能仍然是初始值(空对象或 undefined),导致组件渲染为空白或显示错误信息。

onMounted 的作用: onMounted 是 Vue 提供的一个生命周期钩子函数,它会在组件的 DOM 元素被挂载到页面后执行。 这意味着,当 onMounted 函数被调用时,Vue 已经完成了组件的初始渲染,并且 DOM 元素已经就绪。 将 fetchProduct 的调用放在 onMounted 中,确保了在数据加载完成后再更新组件的视图。 这样,Vue 就可以使用加载完成的数据来渲染组件,避免了渲染空白或错误信息的问题。

避免阻塞渲染: 直接在 script setup 中使用 await 会阻塞组件的渲染过程,直到 fetchProduct 完成。 这会影响用户体验,因为用户需要等待数据加载完成才能看到任何内容。 使用 onMounted 可以避免这个问题,因为 onMounted 在组件渲染完成后执行,不会阻塞渲染过程。

最佳实践: 将异步数据加载操作放在生命周期钩子函数中(如 onMounted、onBeforeMount 等)是 Vue 的最佳实践,它可以确保数据加载的时机正确,并避免潜在的渲染问题。

简而言之,onMounted 提供了一个安全的上下文来执行异步操作,确保在组件已渲染且 DOM 元素可用后才进行数据获取和更新,从而避免渲染问题并提高用户体验。 这与 Vue 的响应式系统相协调,确保数据变化后视图能够正确更新。

总结

总结一下,为什么效率如此只差呢?要是放在三年前,小小前端还不得手到擒来,主要是服兵役两年,编程啥的全忘了,编程又特别注意细节,细节忘了,就会导致一直出莫名其妙的错误。

而且,现在又搞全栈,前端好不容易熟悉了点,又去搞后端,后端好不容器熟悉了点,又去搞浏览器扩展程序,导致前面的会忘掉。

得像个办法,抓总的整体的,放细节的。还得定时复习,知道固化下来,就不那么容易忘记了。

相关推荐
kyriewen5 分钟前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马1 小时前
AI源码分析:拆解模型底层实现逻辑
前端
BillKu1 小时前
全局样式变量:CSS 自定义属性(--border-color)和SCSS 变量($border-color)的说明
javascript·css·scss
IT_陈寒1 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端
乘风gg1 小时前
DeepSeek V4.1 Flash 来了,明天中午 Flash 降价 60%
前端·ai编程·claude
默_笙2 小时前
❗ 给金鱼装记忆(上):从白板到笔记本,AI 的短期记忆生存指南
前端·javascript
酷酷的逗逗乐2 小时前
前端转 Agent 开发 · 第五节:Memory 会话记忆
前端·程序员
掘金挖土2 小时前
前端手摸手跑路之 AI 应用开发(二)
前端·后端
兜里只有三分钱~2 小时前
翻卡_3D 的仪式感,和三个让它穿帮的写法
javascript·css·3d
mayaairi3 小时前
Vue2 组件通讯(四):v-model、scoped样式、mixins与plugins
前端·javascript·vue.js