彻底搞懂并解决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 相关文章推荐
js function定义函数的几种不错方法
Feb 27 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
Jul 31 Javascript
javascript常见操作汇总
Sep 03 Javascript
创建、调用JavaScript对象的方法集锦
Dec 24 Javascript
Javascript基础教程之JavaScript语法
Jan 18 Javascript
JavaScript中数组添加值和访问值常见问题
Feb 06 Javascript
canvas绘制爱心的几种方法总结(推荐)
Oct 31 Javascript
微信小程序实现两个页面传值的方法分析
Dec 11 Javascript
vue实现按需加载组件及异步组件功能
May 27 Javascript
gulp构建小程序的方法步骤
May 31 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
Aug 02 Javascript
JavaScript实现外溢动态爱心的效果的示例代码
Mar 21 Javascript
详解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的安全策略
2006/10/09 PHP
php中通过curl检测页面是否被百度收录
2013/09/27 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
2016/03/21 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
php 实现Hash表功能实例详解
2016/11/29 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
js中 关于undefined和null的区别介绍
2013/04/16 Javascript
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
javascript 实现map集合
2015/04/03 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
jQuery html表格排序插件tablesorter使用方法详解
2017/02/10 Javascript
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
2018/12/17 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
2019/09/29 Javascript
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
python flask 多对多表查询功能
2017/06/25 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
韩国乐天网上商城:Lotte iMall
2021/02/03 全球购物
C语言50道问题
2014/10/23 面试题
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
护理专科毕业推荐信
2013/11/10 职场文书
艺术学院毕业生自我评价
2014/03/02 职场文书
英语课前三分钟演讲稿
2014/08/19 职场文书
2014年企业工会工作总结
2014/11/12 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
交通安全教育主题班会
2015/08/12 职场文书
nginx安装以及配置的详细过程记录
2021/09/15 Servers
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript