抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

起因:在想利用element ui来实现一个走马灯的轮播效果,利用v-for来遍历渲染图片和文字信息,但当使用自以为的src路径写法时候缺无法正常渲染

一:发现问题:

image-20230606203514643

image-20230606203550815

1
2
3
4
5
6
7
8
9
10
11
12
13
<el-carousel :interval="4000" type="card" height="500px">

<el-carousel-item v-for="item in batteryNameArr" :key="item.index">
<!-- <h3 class="medium">{{ item }}</h3> -->
<img :src="item.src" alt="">

<div class="btn">
<el-button type="primary" plain @click="goto(item.index)">查看电池信息</el-button>
<el-tag type="success">{{item.name}}</el-tag>
<el-button @click="other" type="primary" plain >寿命预测</el-button>
</div>
</el-carousel-item>
</el-carousel>
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
27
28
29
30
31
32
batteryNameArr: [
{
index: 0,
name: 'CH35',
src: '../assets/img/1.png',
},
{
index: 1,
name: 'CH23',
src: '../assets/img/2.png',
},
{
index: 2,
name: 'CH42',
src: '../assets/img/3.png',
},
{
index: 3,
name: 'CH30',
src: '../assets/img/4.png',
},
{
index: 4,
name: 'CH7',
src: '../assets/img/5.png',
},
{
index: 5,
name: 'CH15',
src: '../assets/img/6.png',
},
],

二:解决问题

1. 将本地图片上传图床,使用在线链接

一开始始终寻找不到解决问题的办法,无奈下直接将其上传至图床,不再使用本地图片资源,但觉得很笨,肯定有更好地办法

image-20230606203929115

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
27
28
29
30
31
32
33
34
35
36
37
38
batteryNameArr: [
{
index: 0,
name: 'CH35',
// src: '../assets/img/1.png',
src: 'https://awesomeboy.oss-cn-chengdu.aliyuncs.com/img/202306061953201.png',
},
{
index: 1,
name: 'CH23',
// src: '../assets/img/2.png',
src: 'https://awesomeboy.oss-cn-chengdu.aliyuncs.com/img/202306061953201.png',
},
{
index: 2,
name: 'CH42',
// src: '../assets/img/3.png',
src: 'https://awesomeboy.oss-cn-chengdu.aliyuncs.com/img/202306061953201.png',
},
{
index: 3,
name: 'CH30',
// src: '../assets/img/4.png',
src: 'https://awesomeboy.oss-cn-chengdu.aliyuncs.com/img/202306061953201.png',
},
{
index: 4,
name: 'CH7',
// src: '../assets/img/5.png',
src: 'https://awesomeboy.oss-cn-chengdu.aliyuncs.com/img/202306061953201.png',
},
{
index: 5,
name: 'CH15',
// src: '../assets/img/6.png',
src: 'https://awesomeboy.oss-cn-chengdu.aliyuncs.com/img/202306061953201.png',
},
],

2.使用require调用路径

src: require(‘../assets/img/2.png’)

image-20230606204148853

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
27
28
29
30
31
32
batteryNameArr: [
{
index: 0,
name: 'CH35',
src: require('../assets/img/1.png'),
},
{
index: 1,
name: 'CH23',
src: require('../assets/img/2.png'),
},
{
index: 2,
name: 'CH42',
src: require('../assets/img/3.png'),
},
{
index: 3,
name: 'CH30',
src: require('../assets/img/4.png'),
},
{
index: 4,
name: 'CH7',
src: require('../assets/img/5.png'),
},
{
index: 5,
name: 'CH15',
src: require('../assets/img/6.png'),
},
],

三:探究原因: 为什么vue中引入图片需要使用require

简单一句话因为动态添加src被当做静态资源处理了,没有进行编译,所以要加上require

1. 什么是静态资源,什么是动态资源?

静态资源就是直接存放在项目中的资源,这些资源不需要我们发送专门的请求进行获取。比如assets目录下面的图片,视频,音频,字体文件,css样式表等。

动态资源就是需要发送请求获取到的资源

2. 为什么动态添加的src会被当做静态资源处理?

先看这个代码图片被编译成的样子是什么样的

1
2
3
<el-carousel-item v-for="item in batteryNameArr" :key="item.index">
<img :src="item.src" alt="">
</el-carousel-item>
1
2
3
4
5
6
7
batteryNameArr: [
{
index: 0,
name: 'CH35',
src: '../assets/img/1.png',
},
],

image-20230606210650416

image-20230606210704502

该图片无法正常显示

利用require调用资源,编译后会变成这个样子,该图片是正常显示的。

1
2
3
4
5
6
7
8
batteryNameArr: [
{
index: 1,
name: 'CH23',
src: require('../assets/img/2.png'),
},
],

image-20230606210839752

在vue中动态添加的src最终会编译成一个静态的字符串地址。程序运行的时候,会按照这个地址去项目目录中引入资源。而 去项目目录中引入资源的这种方式,就是将该资源当成了静态资源

正因为动态的添加的src编译过后的地址,与图片资源编译过后的资源地址不一致, 导致无法正确的引入资源

使用静态的地址去引入一张图片,图片的路径和图片的名称已经发生了改变,并且编译后过后的静态地址是可以成功的引入资源的。这是因为,在默认情况下,src目录下面的所有文件都会被打包,src下面的图片也会被打包在新的文件夹下并生成新的文件名。编译过后的静态地址引入的是打包过后的图片地址,从而可以正确的引用资源

3. 为什么调用require就可以正常使用图片?

因为动态添加的src,编译过后的文件地址和被编译过后的资源文件地址不一致,从而无法正确引入资源。而使用require,返回的就是资源文件被编译后的文件地址,从而可以正确的引入资源

评论