Vue动态加载图片在跨域时无法显示的问题及解决方法


Posted in Javascript onMarch 10, 2020

写在前面

小记,就简单写了 。问题:VUE开发时因为要访问后端的接口所以要配置请求转发,如果直接转发全部请求,那么VUE动态绑定的src也会转发到后端,因为图片在前端,所以会收到404 NOT FOUND的报错。

常规的请求转发

在vue-cli3内,直接编辑vue.config.js,如下:

let proxyObj={};
proxyObj['/']={
  ws:false,
  target:'http://localhost:8023',//后端地址
  changeOrigin:true,
  pathRewrite:{
    '^/':''
  }
};
module.exports={
  devServer:{
    host:'localhost',
    port:8080,
    proxy:proxyObj
  }
};

代码很简单,就不解释了,这段代码就是把所有请求都转发到了后端。

常规的src动态绑定

如下:

// position.duiduorob为data内定义的字段
<img :src="require(`@/assets/image/dianhan${position.duiduorob}.png`)" >

值得注意的是,需要用require(``)这样的方法,如果直接填写图片地址如:

<img :src="'../../assets/image/dianhan'+position.duiduorob+'.png'">

浏览器内会找不到该图片。原因:通常在编译运行后,图片会被webpack统一打包到localhost:8080/static/img/[文件名].png,因为是上述过程动态加载的,所以url-loader无法解析图片地址,所以导致上述方法中的图片无法在浏览器内显示。解决方法就是通过require(``)这样的方法将图片作为模块被加载。

跨域请求转发时找不到图片

前面也说了,就是因为转发了全部请求,所以上述require(``)过后,浏览器去后端找图片了,导致找不到。
解决思路:只转发要访问后端接口的请求,其它不变。
所以其实就是过滤一下,添加一个条件。如下:要访问后端的请求在url上加一个/api即可

let proxyObj={};
proxyObj['/api']={ //url前部加上'/api'
  ws:false,
  target:'http://localhost:8023',//后端地址
  changeOrigin:true,
  pathRewrite:{
    '^/api':'' //到了后端去掉/api
  }
};
module.exports={
  devServer:{
    host:'localhost',
    port:8080,
    proxy:proxyObj
  }
};

所以在其他部分全部不变的情况下,只需在你封装的http请求方法内给url参数前加一个'/api'前缀,如下:

export const getRequst=(url,params)=>{
  return axios({
    method:'get',
    url:'/api'+ url,//原来为 url:url,
    data:params,
  })
};

这下访问后端的请求全部在url上套上了'/api',而其它请求也不会被转发到后端了。

知识点补充:vue中解决跨域问题

方法1.后台更改header

header('Access-Control-Allow-Origin:*');//允许所有来源访问 
header('Access-Control-Allow-Method:POST,GET');//允许访问的方式

方法2.使用JQuery提供的jsonp

methods: { 
 getData () { 
  var self = this 
  $.ajax({ 
   url: 'http://f.apiplus.cn/bj11x5.json', 
   type: 'GET', 
   dataType: 'JSONP', 
   success: function (res) { 
    self.data = res.data.slice(0, 3) 
    self.opencode = res.data[0].opencode.split(',') 
   } 
  }) 
 } 
}

方法3.使用http-proxy-middleware 代理解决(项目使用vue-cli脚手架搭建)

例如请求的url:“http://f.apiplus.cn/bj11x5.json”

1、打开config/index.js,在proxyTable中添写如下代码:

proxyTable: { 
 '/api': { //使用"/api"来代替"http://f.apiplus.c" 
  target: 'http://f.apiplus.cn', //源地址 
  changeOrigin: true, //改变源 
  pathRewrite: { 
   '^/api': 'http://f.apiplus.cn' //路径重写 
   } 
 } 
}

2、使用axios请求数据时直接使用“/api”:

getData () { 
 axios.get('/api/bj11x5.json', function (res) { 
  console.log(res) 
 })

通过这中方法去解决跨域,打包部署时还按这种方法会出问题。解决方法如下:

let serverUrl = '/api/' //本地调试时 
// let serverUrl = 'http://f.apiplus.cn/' //打包部署上线时 
export default { 
 dataUrl: serverUrl + 'bj11x5.json' 
}

附:

方法二引入jq

1.下载依赖

cnpm install jquery --save-dev

2.在webpack.base.conf.js文件中加入

plugins: [
  new webpack.ProvidePlugin({
    $: "jquery",
    jQuery: "jquery"
  })
 ],

3.在需要的temple里引入也可以在main.js里全局引入

import $ from 'jquery'

eg:

<template>
 <div class="source">
   source{{data}}
 </div>
</template>
<script>
import $ from 'jquery'
 export default({
  name:"source",
  data(){
   return{
    data:""
   }
  },
  created(){
   this.getData()
  },
  methods:{
   getData () {
    var self = this
    $.ajax({
     url: '你要请求的url',
     type: 'GET',
     dataType: 'JSONP',
     success: function (res) {
      self.data = res.result
     }
    })
   }
  }
 })
</script>
<style>
</style>

总结

到此这篇关于Vue动态加载图片在跨域时无法显示的问题及解决方法的文章就介绍到这了,更多相关vue动态加载图片跨域无法显示内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascrip关于继承的小例子
May 10 Javascript
js编写贪吃蛇的小游戏
Aug 24 Javascript
分享jQuery插件的学习笔记
Jan 14 Javascript
Javascript字符串拼接小技巧(推荐)
Jun 02 Javascript
js实现随机抽选效果、随机抽选红色球效果
Jan 13 Javascript
Jquery中attr与prop的区别详解
May 27 jQuery
Angularjs上传图片实例详解
Aug 06 Javascript
angular第三方包开发整理(小结)
Apr 19 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
Apr 23 Javascript
基于JS实现视频上传显示进度条
May 12 Javascript
基于JS实现计算24点算法代码实例解析
Jul 23 Javascript
javascript操作向表格中动态加载数据
Aug 27 Javascript
Vue项目打包压缩的实现(让页面更快响应)
Mar 10 #Javascript
vue实现瀑布流组件滑动加载更多
Mar 10 #Javascript
JavaScript代理模式原理与用法实例详解
Mar 10 #Javascript
JavaScript命令模式原理与用法实例详解
Mar 10 #Javascript
JavaScript实现指定数量的并发限制的示例代码
Mar 10 #Javascript
vue中的使用token的方法示例
Mar 10 #Javascript
vue瀑布流组件实现上拉加载更多
Mar 10 #Javascript
You might like
自己在做项目过程中学到的PHP知识收集
2012/08/20 PHP
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
PHP读取RSS(Feed)简单实例
2014/06/12 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
PHP微信分享开发详解
2017/01/14 PHP
php实现多站点共用session实现单点登录的方法详解
2019/09/18 PHP
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
Python的Flask框架中实现分页功能的教程
2015/04/20 Python
剖析Python的Twisted框架的核心特性
2016/05/25 Python
Linux下python3.7.0安装教程
2018/07/30 Python
matplotlib实现区域颜色填充
2019/03/18 Python
python plotly绘制直方图实例详解
2019/07/22 Python
python让函数不返回结果的方法
2020/06/22 Python
解决导入django_filters不成功问题No module named 'django_filter'
2020/07/15 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
Python扫描端口的实现
2021/01/25 Python
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
PHP笔试题
2012/02/22 面试题
为什么要有struct关键字
2012/05/08 面试题
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
室内设计专业个人的自我评价
2013/12/18 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
项目建议书
2015/02/04 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
Python基础之pandas数据合并
2021/04/27 Python
Python-OpenCV实现图像缺陷检测的实例
2021/06/11 Python
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python