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 相关文章推荐
node在两个div之间移动,用ztree实现
Mar 06 Javascript
javascript按位非运算符的使用方法
Nov 14 Javascript
jQuery响应鼠标事件并隐藏与显示input默认值
Aug 24 Javascript
JS JQUERY实现滚动条自动滚到底的方法
Jan 09 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
Jul 01 Javascript
jQuery Dialog 取消右上角删除按钮事件
Sep 07 Javascript
node.js爬虫爬取拉勾网职位信息
Mar 14 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
May 11 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
Apr 21 Javascript
解决betterScroll在vue中存在图片时,出现拉不动的问题
Sep 27 Javascript
深入了解JavaScript代码覆盖
Jun 13 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
Aug 06 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 中的类
2006/10/09 PHP
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
php随机获取金山词霸每日一句的方法
2015/07/09 PHP
简单概括PHP的字符串中单引号与双引号的区别
2016/05/07 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
验证javascript中Object和Function的关系的三段简单代码
2010/06/27 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
JavaScript 高级篇之函数 (四)
2012/04/07 Javascript
jQuery.buildFragment使用方法及思路分析
2013/01/07 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
javascript中判断json的方法总结
2015/08/27 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
详谈Object.defineProperty 及实现数据双向绑定
2020/07/18 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
Python装饰器decorator用法实例
2014/11/10 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
基于Django框架利用Ajax实现点赞功能实例代码
2018/08/19 Python
Python实现定时监测网站运行状态的示例代码
2020/09/30 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
Python os库常用操作代码汇总
2020/11/03 Python
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
Origins悦木之源英国官网:雅诗兰黛集团高端植物护肤品牌
2017/11/06 全球购物
Tod’s英国官方网站:意大利奢华手工制作手袋和鞋履
2019/03/15 全球购物
String这个类型的class为何定义成final?
2012/11/13 面试题
金融专业应届生求职信
2013/11/02 职场文书
文秘大学生求职信
2014/02/25 职场文书
《故都的秋》教学反思
2014/04/15 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
党支部培养考察意见
2015/06/02 职场文书
追悼会家属答谢词
2015/09/29 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
如何更改Win11声音输出设备?Win11声音输出设备四种更改方法
2022/04/08 数码科技