彻底搞懂并解决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 浮点数运算 精度问题
Oct 06 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
May 30 Javascript
JavaScript 对象深入学习总结(经典)
Sep 29 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
Oct 23 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
Nov 02 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
May 21 Javascript
浅谈vue引入css,less遇到的坑和解决方法
Jan 20 Javascript
vue开发环境配置跨域的方法步骤
Jan 16 Javascript
浅谈Node新版本13.2.0正式支持ES Modules特性
Nov 25 Javascript
es6函数之尾调用优化实例分析
Apr 25 Javascript
解决vue下载后台传过来的乱码流的问题
Dec 05 Vue.js
VUE中的v-if与v-show区别介绍
Mar 13 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 smarty函数扩展
2010/03/15 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
PHP中非常有用却鲜有人知的函数集锦
2019/08/17 PHP
PHP rsa加密解密算法原理解析
2020/12/09 PHP
使用js简单实现了tree树菜单
2013/11/20 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
2016/05/25 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
jQuery实现通过方向键控制div块上下左右移动的方法【测试可用】
2018/04/26 jQuery
以v-model与promise两种方式实现vue弹窗组件
2018/05/21 Javascript
详解mpvue开发小程序小总结
2018/07/25 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
python中根据字符串调用函数的实现方法
2016/06/12 Python
不要用强制方法杀掉python线程
2017/02/26 Python
python递归法解决棋盘分割问题
2019/07/17 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
jupyter notebook实现显示行号
2020/04/13 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
2020/06/14 Python
如何使用Pytorch搭建模型
2020/10/26 Python
html5实现输入框fixed定位在屏幕最底部兼容性
2020/07/03 HTML / CSS
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
土耳其新趋势女装购物网站:Addax
2020/01/07 全球购物
阿里巴巴Oracle DBA笔试题答案-备份恢复类
2013/11/20 面试题
餐饮业的创业计划书范文
2013/12/26 职场文书
上班上网检讨书
2014/01/29 职场文书
团日活动总结报告
2014/06/25 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
留学推荐信英文范文
2015/03/26 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
投诉书范文
2015/07/02 职场文书
民政局2016年“六一”儿童节慰问活动总结
2016/04/06 职场文书