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 相关文章推荐
用 Javascript 验证表单(form)中的单选(radio)值
Sep 08 Javascript
Jquery 学习笔记(一)
Oct 13 Javascript
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
Oct 29 Javascript
JQuery select标签操作代码段
May 16 Javascript
JavaScript中Cookie操作实例
Jan 09 Javascript
jQuery实现表格颜色交替显示的方法
Mar 09 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
Dec 25 Javascript
JavaScript cookie详解及简单实例应用
Dec 31 Javascript
JavaScript数据结构之二叉树的删除算法示例
Apr 13 Javascript
BootStrap给table表格的每一行添加一个按钮事件
Sep 07 Javascript
通过webpack引入第三方库的方法
Jul 20 Javascript
原生js实现滑块区间组件
Jan 20 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中利用explode函数分割字符串到数组
2014/02/08 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
2011/11/30 Javascript
JS文本框追加多个下拉框的值的简单实例
2013/07/12 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
微信小程序 Flex布局详解
2016/10/09 Javascript
获取JavaScript异步函数的返回值
2016/12/21 Javascript
js 获取json数组里面数组的长度实例
2017/10/31 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
python调用windows api锁定计算机示例
2014/04/17 Python
用Python编写web API的教程
2015/04/30 Python
Python提取网页中超链接的方法
2016/09/18 Python
python实现AES加密与解密
2019/03/28 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
解决Python在导入文件时的FileNotFoundError问题
2020/04/10 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
2020/05/26 Python
python利用pytesseract 实现本地识别图片文字
2020/12/14 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
卫生安全检查制度
2014/02/04 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
医生见习报告范文
2014/11/03 职场文书
2015年妇联工作总结范文
2015/04/22 职场文书
2016年清明节寄语
2015/12/04 职场文书
Python3 多线程(连接池)操作MySQL插入数据
2021/06/09 Python
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android