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 相关文章推荐
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
Jan 09 Javascript
用JavaScript页面不刷新时全选择,全删除(GridView)
Apr 14 Javascript
javascript使用onclick事件改变选中行的颜色
Dec 30 Javascript
JS实现向表格行添加新单元格的方法
Mar 30 Javascript
jQuery插件AjaxFileUpload实现ajax文件上传
May 05 Javascript
JavaScript事件学习小结(一)事件流
Jun 09 Javascript
ES6 Promise对象概念与用法分析
Apr 01 Javascript
JavaScript中一些特殊的字符运算
Aug 17 Javascript
微信小程序排坑指南详解
May 23 Javascript
Layer+Echarts构建弹出层折线图的方法
Sep 25 Javascript
js实现图片跟随鼠标移动效果
Oct 16 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
Nov 13 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与MYSQL中UTF8 中文排序示例代码
2014/10/23 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
PHP 将dataurl转成图片image方法总结
2016/10/14 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
2017/08/02 PHP
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
iScroll.js 使用方法参考
2016/05/16 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
Node.js制作简单聊天室
2017/01/12 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
彻底理解js面向对象之继承
2018/02/04 Javascript
详解Vue2.5+迁移至Typescript指南
2019/08/01 Javascript
weui上传多图片,压缩,base64编码的示例代码
2020/06/22 Javascript
Vue SPA 首屏优化方案
2021/02/26 Vue.js
[01:11]辉夜杯战队访谈宣传片—CDEC.Y
2015/12/26 DOTA
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
2019/08/12 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
python集合的创建、添加及删除操作示例
2019/10/08 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
史上最详细的Python打包成exe文件教程
2021/01/17 Python
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
考博自荐信
2013/10/25 职场文书
中专生自我鉴定范文
2014/02/02 职场文书
医学专业大学生职业生涯规划书
2014/10/25 职场文书
导游词之杭州西湖
2019/09/19 职场文书
导游词之临安白水涧
2019/11/05 职场文书
数据库连接池
2021/04/06 MySQL
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python