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 相关文章推荐
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
Feb 27 Javascript
js数组的操作详解
Mar 27 Javascript
Jquery方式获取iframe页面中的 Dom元素
May 07 Javascript
每天一篇javascript学习小结(String对象)
Nov 18 Javascript
Webwork 实现文件上传下载代码详解
Feb 02 Javascript
JavaScript事件代理和委托详解
Apr 08 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
Dec 08 Javascript
js Canvas实现的日历时钟案例分享
Dec 25 Javascript
激动人心的 Angular HttpClient的源码解析
Jul 10 Javascript
Vue computed计算属性的使用方法
Jul 14 Javascript
浅析Vue 和微信小程序的区别、比较
Aug 03 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
Feb 10 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输出多个元素的排列或组合的方法
2017/03/14 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
实现PHP中session存储及删除变量
2018/10/15 PHP
10个实用的脚本代码工具
2010/05/04 Javascript
jquery里的each使用方法详解
2010/12/22 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
jquery控制select的text/value值为选中状态
2014/06/03 Javascript
DOM 高级编程
2015/05/06 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
js实现的Easy Tabs选项卡用法实例
2015/09/06 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
2016/04/19 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
angularjs下ng-repeat点击元素改变样式的实现方法
2018/09/12 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
python抓取网页中的图片示例
2014/02/28 Python
Python守护进程和脚本单例运行详解
2017/01/06 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
计算机专业个人求职信范例
2013/09/23 职场文书
数学国培研修感言
2014/02/13 职场文书
终止劳动合同协议书
2014/04/14 职场文书
水电维修专业推荐信
2014/09/06 职场文书
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
中秋节慰问信
2015/02/15 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书