如何在Vue组件渲染前完成Axios响应加载并给homePage.image赋值?
问题根源
- ref响应式值赋值错误:你用
ref()包裹的对象,修改内部属性必须先访问.value,直接写homePage.image是修改ref实例本身的属性,不会触发响应式更新,也不会修改存在ref里的实际数据,所以值一直是空字符串。 - axios是异步请求,请求返回的时机晚于组件首次渲染,就算赋值正确,首次渲染时也会先拿到初始的空值,请求完成后才会更新。
解决步骤
- 修正ref属性的赋值写法,在axios回调中通过
.value访问响应式对象 - 优化背景图样式写法,给url路径加引号,避免路径含特殊字符时样式解析失败
- 可选:给背景图加加载状态/默认占位,或者加v-if控制元素只有在图片路径赋值完成后再渲染,避免首次渲染出现空白背景。
修正后完整代码
<template> <section id="home" class="home"> <div class="image-container"> <!-- 加v-if确保有值才渲染,也可以去掉这个判断保留默认占位背景 --> <div v-if="homePage.image" class="home-image" :style="{'background-image': `url('${homePage.image}')`}" ></div> </div> </section> </template> <script setup> import {ref} from 'vue'; // 注意提前引入axios,原代码缺失该引入语句 import axios from 'axios'; const homePage = ref({ image: "" }); axios.get('/home') .then(res => { // 加.value访问ref包裹的实际对象 homePage.value.image = 'storage/' + 'rkiGXBj7KJSOtsR5jiYTvNOajnzo7MlRAoXOXe3V.jpg'; }) .catch(err => { console.log(err.response); }); </script>
如果必须要求组件首次渲染时就已经拿到图片路径,可以使用Vue3支持的顶层await特性,需要配合父组件的
<Suspense>组件使用,写法如下,该方案会阻塞组件渲染直到请求完成,普通场景不推荐使用,优先选择加占位图的方案:
<script setup> import {ref} from 'vue'; import axios from 'axios'; const homePage = ref({ image: "" }); // 顶层await会阻塞组件渲染,直到请求完成 await axios.get('/home') .then(res => { homePage.value.image = 'storage/' + 'rkiGXBj7KJSOtsR5jiYTvNOajnzo7MlRAoXOXe3V.jpg'; }) .catch(err => { console.log(err.response); }); </script>
内容的提问来源于stack exchange,提问作者Artur Müller Romanov
相关产品推荐
相关产品推荐

