【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 的响应式系统相协调,确保数据变化后视图能够正确更新。

总结

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

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

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

相关推荐
爱问问题的小李5 小时前
ue 动态 Key 导致组件无限重置与 API 重复提交
前端·javascript·vue.js
码云数智-大飞5 小时前
从回调地狱到Promise:JavaScript异步编程的演进之路
开发语言·javascript·ecmascript
m0_748229996 小时前
PHP+Vue打造实时聊天室
开发语言·vue.js·php
子兮曰6 小时前
深入Vue 3响应式系统:为什么嵌套对象修改后界面不更新?
前端·javascript·vue.js
CHU7290356 小时前
直播商城APP前端功能全景解析:打造沉浸式互动购物新体验
java·前端·小程序
枫叶丹46 小时前
【Qt开发】Qt界面优化(一)-> Qt样式表(QSS) 背景介绍
开发语言·前端·qt·系统架构
子兮曰12 小时前
OpenClaw入门:从零开始搭建你的私有化AI助手
前端·架构·github
吴仰晖12 小时前
使用github copliot chat的源码学习之Chromium Compositor
前端
1024小神12 小时前
github发布pages的几种状态记录
前端
不像程序员的程序媛14 小时前
Nginx日志切分
服务器·前端·nginx