Vue:使用v-for渲染<img>中v-bind:src绑定的几种方式实践

一、最保熟的方式:图片放public

1、文件目录结构,图像放在public下的images里面
在这里插入图片描述
2、js中定义一个v-for数组

const imgs = [                //js代码,数组内包含public文件内图片代码,用来v-for
{src:"images/image1.png"},       //绝对路径
{src:"./images/image2.png"},       
];    

3、html里开始v-for

<img v-for="im of imgs" :src="im.src">        

此方法保熟的点在于部署到服务器,也是正常显示的,即使没有部署到服务器的根目录。

二、其他不保熟的方法,及出问题的点:

1、im.src处不写相对路径,而是写绝对路径

分析:
(1)、如果在imgs数组中的src处 直接 填写路径,那么:src="im.src"此处的src接收到的是个 字符串 ,而不是路径,所以无法解析相对路径;
问题:
(1)、如果是部署在根(即服务器绝对路径与本地的绝对路径一致),使用绝对路径可以正常显示,但是如果服务器的根与本地的根目录不一致,那么将无法正常显示。

2、使用require() 方法(需要webpack)

分析:
没试过…使用webpack的同学自己去试试吧

3、new URL(imagePath, import.meta.url).href(需要vite)

静态资源处理:new URL(url, import.meta.url)
分析:
在生产构建时,Vite 只会转换静态url字符串,所以当url为变量时,是不给转换的;

// Vite 不会转换这个
const imgUrl = new URL(imagePath, import.meta.url).href   //js代码

问题:
部署到服务器后,不一定能正确显示(当根目录不一致时)

三、public目录

如果你有下列这些资源:

  • 不会被源码引用(例如 robots.txt)
  • 必须保持原有文件名(没有经过 hash)
  • 或者你压根不想引入该资源,只是想得到其URL。

那么你可以将该资源放在指定的 public 目录中,它应位于你的项目根目录。该目录中的资源在开发时能直接通过 / 根路径访问到,并且打包时会被完整复制到目标目录的根目录下。
请注意:

  • 引入 public 中的资源永远应该使用根绝对路径 。
  • public 中的资源不应该被 JavaScript 文件引用。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="./css/inputnumber.css" /> <link rel="stylesheet" href="./css/index.css" /> <script src="https://unpkg.com/vue@3"></script> <title>购物车</title> </head> <body> <div class="app-container" id="app"> <!-- 顶部banner --> <div class="banner-box"><img src="./img/fruit.jpg" alt="Fruit"></div> <!-- 面包屑 --> <div class="breadcrumb"> <span>🏠</span> / <span>购物车</span> </div> <!-- 购物车主体 --> <!-- v-if v-else 条件渲染,如果没有数据则显示空车 --> <div v-if="fruitList.length > 0" class="main"> <div class="table"> <!-- 头部 --> <div class="thead"> <div class="tr"> <div class="th">选中</div> <div class="th th-pic">图片</div> <div class="th">单价</div> <div class="th num-th">个数</div> <div class="th">小计</div> <div class="th">操作</div> </div> </div> <!-- 身体 --> <!-- v-for 循环遍历渲染数组 --> <div v-for="(item, index) in fruitList" :key="item.id" class="tbody"> <!-- v-bind 绑定 class 设置条件--> <div class="tr" :class="{ active: item.isChecked }"> <!-- v-model 绑定属性 --> <div class="td"><input type="checkbox" v-model="item.isChecked" /></div> <!-- v-bind 绑定 src --> <div class="td"><img :src="item.icon" alt="" /></div> <div class="td">{{ item.price }}</div> <div class="td"> <div class="my-input-number"> <!-- @click 点击事件实现数量加减 --> <!-- :disabled 是一个动态属性绑定,它允许你根据表达式的结果动态地设置 HTML 元素的 disabled 属性 --> <button :disabled="item.num <= 1" class="decrease" @click="item.num--"> - </button> <span class="my-input__inner">{{ item.num }}</span>
最新发布
03-26
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值