v-for加载本地图片 解决渲染本地静态图片问题
在element ui plus
使用跑马灯组件,想用v-for
渲染本地静态图片无法显示,主要问题是本地图片拿不到路径,无法显示。
首先找到的解决方案是用require
引入图片路径,data
中使用键值对的方式存储图片路径,使用v-for
遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <template> <div class="swiper"> <el-carousel :interval="4000" type="card" height="300px" pause-on-hover arrow="always"> <el-carousel-item v-for="item in carouseData" :key="item"> <img :src="item.url" alt=""> </el-carousel-item> </el-carousel> </div> </template>
<script setup> data() { return { //定义跑马灯的图片路径 carouseData: [ { url: require("../assets/img/sw01.jpg") }, { url: require("../assets/img/sw02.jpg") }, { url: require("../assets/img/sw03.jpg") } ], }; }, </script>
|
运行项目后,图片根本不显示,也拿不到图片路径。
后来得知,在我们用 vue2+ webpack
的时候,加载图片资源是使用require
的,而在vue3+vite
使用这种方式是不行的,vite
中没有 require
会报错。
那么就要找到vue3
中获取本地图片路径的方法,再用v-for
遍历图片数组。
首先,将资源引入为 URL
再定义一个方法使用new URL(url, import.meta.url)
1 2 3 4 5 6
| //使用 getImgUrl 方法根据图片名获取图片路径 <img class="img" :src="getImgUrl(item.url)" alt=""> // 定义获取图片路径的方法,使用 new URL() 构造函数生成图片的绝对路径 const getImgUrl = (name) => { return new URL(`../../assets/image/${name}`, import.meta.url).href }
|
这样就完美地拿到了本地图片路径啦,接着用v-for
遍历就可以渲染出来了。
完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <template> <!-- 走马灯容器 --> <div class="swiper"> <!-- Element UI 的走马灯组件,设置图片轮播 --> <el-carousel :interval="4000" type="card" height="300px" pause-on-hover arrow="always"> <!-- 轮播项,遍历 carouseData 数组中的数据生成轮播图片 --> <el-carousel-item v-for="item in carouseData" :key="item"> <!-- 轮播图片,使用 getImgUrl 方法根据图片名获取图片路径 --> <img class="img" :src="getImgUrl(item.url)" alt=""> </el-carousel-item> </el-carousel> </div> </template>
<script setup> // 定义获取图片路径的方法,使用 new URL() 构造函数生成图片的绝对路径 const getImgUrl = (name) => { return new URL(`../../assets/image/${name}`, import.meta.url).href } // 走马灯需要轮播的数据,是一个包含图片名的数组 const carouseData = [ { url: "sw01.jpg" }, { url: "sw02.jpg" }, { url: "sw03.jpg" }, ] </script>
|
详细解释一下:
上述代码中的 v-for
指令遍历了一个名为 carouseData
的数组,数组中每个元素都是一个包含一个 url
属性的对象,该属性对应着图片的文件名(例如 sw01.jpg
)。在每次循环迭代中,v-for
指令会将数组中的元素与对应的模板进行渲染,并将 url
属性的值传递给 getImgUrl
函数作为参数,以生成图片的完整路径。因此,通过 v-for
指令迭代 carouseData
数组并结合 getImgUrl
函数的处理,最终生成了一个轮播图的组件,显示了数组中包含的三张图片。
在 官方文档 中也提到了这种解决方法噢。