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 相关文章推荐
js 强制弹出窗口代码研究-又一款代码
Mar 20 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
Jun 20 Javascript
动态载入js提高网页打开速度的方法
Jul 04 Javascript
微信JS接口汇总及使用详解
Jan 09 Javascript
深入理解JavaScript中为什么string可以拥有方法
May 24 Javascript
jquery自动补齐功能插件flexselect用法示例
Aug 06 Javascript
canvas仿iwatch时钟效果
Mar 06 Javascript
Vue2.0 slot分发内容与props验证的方法
Dec 12 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
Jul 13 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
Sep 23 Javascript
es6函数之尾递归用法实例分析
Apr 25 Javascript
js实现购物车商品数量加减
Sep 21 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
实现“上一页”和“下一页按钮
2006/10/09 PHP
PHP获取表单textarea数据中的换行问题
2010/09/10 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
网页前台通过js非法字符过滤代码(骂人的话等等)
2010/05/26 Javascript
jQuery autocomplate 自扩展插件、自动完成示例代码
2011/03/28 Javascript
也说JavaScript中String类的replace函数
2011/09/22 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
js propertychange和oninput事件
2014/09/28 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
jQuery将表单序列化成一个Object对象的实例
2016/11/29 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
Vue-resource安装过程及使用方法解析
2020/07/21 Javascript
Vue 监听元素前后变化值实例
2020/07/29 Javascript
跟老齐学Python之Python文档
2014/10/10 Python
Python实现简单截取中文字符串的方法
2015/06/15 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
python批量获取html内body内容的实例
2019/01/02 Python
pycharm通过anaconda安装pyqt5的教程
2020/03/24 Python
python filecmp.dircmp实现递归比对两个目录的方法
2020/05/22 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
2020/05/25 Python
如何对python的字典进行排序
2020/06/19 Python
超酷炫 CSS3垂直手风琴菜单
2016/06/28 HTML / CSS
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
英国家用电器折扣网站:Electrical Discount UK
2018/09/17 全球购物
影视动画专业个人的自我评价
2013/12/31 职场文书
大学生求职工作的自我评价
2014/02/13 职场文书
小学毕业典礼主持词
2014/03/27 职场文书
土建施工员岗位职责
2015/04/11 职场文书
《槐乡的孩子》教学反思
2016/02/20 职场文书
《走遍天下书为侣》教学反思
2016/02/22 职场文书
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python