彻底搞懂并解决vue-cli4中图片显示的问题实现


Posted in Javascript onAugust 31, 2020

在基于 vue-cli 实际开发过程中,很多小伙伴都会遇到关于图片显示的困扰,不管怎么设置,图片就是显示不出来,今天我们来详细说说这个问题。

图片无法显示,绝大部门的情况是图片路径问题,要搞懂路径问题,分别有相对路径与绝对路径

实际开发中使用图片最多的场景有以下三种:

1、手动引入

<template>
    <img :src="imgurl" />
  </template>
  <script>
    import logo from '../img/logo.png'
    // 或
    const logo = require('../img/logo.png');
    export default{
      data(){
        return {
          imgurl:logo
        }
      }
    }
  </script>

使用require或import方式引入图片时,引入路径是相对于当前文件路径的,编译时webpack会介入并把路径处理成服务器绝路径

2、相对路径

<img src="../img/logo.png" />

vue-cli 中使用相对路径时,webpack会自动介入,上面的代码在编译时自动变成

<img src="require('../img/logo.png')"

最终在页面的显示效果与以上手动引入方式一致

3、绝对路径

<img src="/img/logo.png" />

使用绝对路径,首先要了解服务器根目录在哪,大家都知道,在 vue-cli 的项目本身自带一个服务器的,基于 webpack-dev-server 模块,根目录为 public 文件夹,所以,使用 绝对路径 的方式展示图片,必须把图片放到 public 文件夹,这也是最简单的一种方式,这种方式webpack不会介入,所以最终显示效果与引入时的代码一致,代码如下:

彻底搞懂并解决vue-cli4中图片显示的问题实现

彻底搞懂并解决vue-cli4中图片显示的问题实现

最终显示效果

彻底搞懂并解决vue-cli4中图片显示的问题实现

4、数据中的图片

<template>
    <ul>
      <li><img :src="item.imgurl" v-for="item in goodslist" /></li>
    </ul>
  </template>
  <script>
    export default{
      data(){
        return {
          goodslist:[{name:'goods1',imgurl:'../img/goods1.png'},{name:'goods2',imgurl:'../img/goods2.png'},{name:'goods3',imgurl:'../img/goods3.png'},
          ]
        }
      }
    }
  </script>

这种情况应该是最常见的(ajax请求数据回来,然后遍历写入到页面结构中),这个时候绑定到 src 属性的是一个变量,无法直接手动 importrequire ,如果直接使用 imgurl 属性中的路径, webpack不会介入处理 ,所以以上代码是无法正常显示图片的,解决方法如下:

方法1:遍历数据,使用前先手动 require

在前端,模块的引入默认是不支持动态引入的(即不支持:require(变量)),如下

this.goodslist = this.goodslist.map(item=>{
    // 虽然路径是正确的,但以下方式引入会报`Cannot find module '../assets/logo.png'`
    // item.imgurl = require(item.imgurl);

    // 正确的方式为
    item.imgurl = require('../img'+item.imgurl.replace('../img',''))
    return item;
  })

有小伙伴可能会觉得奇怪,为什么这样做就可以了,Webpack 在处理动态名称模块名的时候,会直接将能识别的静态路径和路径下的所有子文件都作为模块处理,如: require('../img'+imgName) ,能识别到 ../img 目录,并将该目录下所有文件当做模块处理,做成一个Map映射以便后面进行匹配,所以能识别到对应的文件,其原理是 require.context ,属性如下:

require.context(directory,useSubdirectories,regExp)

  • directory {String} -读取文件的路径(一般为一个目录)
  • useSubdirectories {Boolean} -是否遍历文件的子目录,默认false
  • regExp {RegExp} -匹配文件的正则,默认匹配所有文件

方法返回一个函数(假设为fn),传入图片路径(不包含directory的路径)可得到处理过的图片对应路径(如:fn('./goods1.png'),) ,上面的代码等效于

this.goodslist = this.goodslist.map(item=>{
    const fn = require.context('../img',false,/^\./);
    const file = item.replace('../img','.')
    item.imgurl = fn(file);
    return item;
  })

方法2:在数据库端直接使用绝对路径,并把所需图片放到 public 目录中

imgurl的格式为: '/img/goods1.png'

到此这篇关于彻底搞懂并解决vue-cli4中图片显示的问题实现的文章就介绍到这了,更多相关vue-cli4 图片显示 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JavaScript 继承详解(一)
Jul 13 Javascript
a标签click和href执行顺序探讨
Jun 23 Javascript
JavaScript中的eval()函数使用介绍
Dec 31 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
Dec 13 Javascript
JavaScript判断表单为空及获取焦点的方法
Feb 12 Javascript
BootStrap制作导航条实例代码
May 06 Javascript
微信小程序 本地存储及登录页面处理实例详解
Jan 11 Javascript
vue中v-model动态生成的实例详解
Oct 27 Javascript
vue.js实现点击后动态添加class及删除同级class的实现代码
Apr 04 Javascript
微信小程序倒计时功能实例代码
Jul 17 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
Nov 05 Javascript
vue动态合并单元格并添加小计合计功能示例
Nov 26 Vue.js
详解Node.JS模块 process
Aug 31 #Javascript
谈谈JavaScript令人迷惑的==与+
Aug 31 #Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
Aug 30 #Javascript
JS性能优化实现方法及优点进行
Aug 30 #Javascript
如何检测JavaScript中的死循环示例详解
Aug 30 #Javascript
JavaScript中CreateTextFile函数
Aug 30 #Javascript
详解vue组件之间的通信
Aug 30 #Javascript
You might like
php简单的会话类代码
2011/08/08 PHP
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
PHP加密解密类实例代码
2016/07/20 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
js字符编码函数区别分析
2008/06/05 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
基于jQuery的一个扩展form序列化到json对象
2010/12/09 Javascript
jQuery Tools tooltip使用说明
2012/07/14 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
JS实现百度搜索接口及链接功能实例代码
2018/02/02 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
详解js获取video任意时间的画面截图
2019/04/17 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
通过自学python能找到工作吗
2020/06/21 Python
Python实现数字的格式化输出
2020/08/01 Python
美国最大的旗帜经销商:Carrot-Top
2018/02/26 全球购物
Rag & Bone官网:瑞格布恩高级成衣
2018/04/19 全球购物
俄罗斯运动、健康和美容产品在线商店:Lactomin.ru
2020/07/23 全球购物
技术总监管理岗位职责
2014/03/09 职场文书
水电站项目建议书
2014/05/12 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
2014国庆黄金周超市促销活动方案
2014/09/21 职场文书
七一建党节慰问信
2015/02/14 职场文书
售后服务质量承诺书
2015/04/29 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL