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 相关文章推荐
How to Auto Include a Javascript File
Feb 02 Javascript
jQuery示例收集
Nov 05 Javascript
js中widow.open()方法使用详解
Jul 30 Javascript
node.js中的events.emitter.listeners方法使用说明
Dec 10 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
Oct 11 Javascript
利用HBuilder打包前端开发webapp为apk的方法
Nov 13 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
Feb 07 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
Apr 12 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
Aug 31 Javascript
Vue.directive 实现元素scroll逻辑复用
Nov 29 Javascript
JavaScript闭包原理与用法学习笔记
May 29 Javascript
Vue中插槽slot的使用方法与应用场景详析
Jun 08 Vue.js
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生成扇形比例图实例
2013/11/06 PHP
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
php实现微信企业转账功能
2018/10/02 PHP
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
jQuery中hover与mouseover和mouseout的区别分析
2015/12/24 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
js生成word中图片处理方法
2018/01/06 Javascript
JS实现调用本地摄像头功能示例
2018/05/18 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
2018/09/04 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
Vue formData实现图片上传
2019/08/20 Javascript
javascript实现异形滚动轮播
2019/11/28 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
详解Python中列表和元祖的使用方法
2015/04/25 Python
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
Python语言快速上手学习方法
2018/12/14 Python
python实现beta分布概率密度函数的方法
2019/07/08 Python
对Python 中矩阵或者数组相减的法则详解
2019/08/26 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
CSS 说明横向进度条最后显示文字的实现代码
2020/11/10 HTML / CSS
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
数据库什么时候应该被重组
2012/11/02 面试题
清扬洗发水广告词
2014/03/14 职场文书
实践单位评语
2014/04/26 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
推荐信范文大全
2015/03/27 职场文书
高一作文之暖冬
2019/11/09 职场文书
服务器SVN搭建图文安装过程
2022/06/21 Servers