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 数值项目的格式化函数代码
May 14 Javascript
javascript 获取函数形参个数
Jul 31 Javascript
分享一则JavaScript滚动条插件源码
Mar 03 Javascript
jquery实现数字输入框
Feb 22 Javascript
js常用的继承--组合式继承
Mar 06 Javascript
jsonp跨域请求实现示例
Mar 13 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
Jul 28 Javascript
js 计数排序的实现示例(升级版)
Jan 12 Javascript
JS控制下拉列表左右选择实例代码
May 08 Javascript
微信小程序实现首页弹出广告
Dec 03 Javascript
绘制微信小程序验证码功能的实例代码
Jan 05 Javascript
通过滑动翻页效果实现和移动端click事件问题
Jan 26 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
smarty表格换行实例
2014/12/15 PHP
Symfony2实现在doctrine中内置数据的方法
2016/02/05 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
Jquery图片滚动与幻灯片的实例代码
2013/04/08 Javascript
jquery可见性过滤选择器使用示例
2013/06/24 Javascript
Jquery的hover方法让鼠标经过li时背景变色
2013/09/06 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
java中String类型变量的赋值问题介绍
2016/03/23 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
2016/11/10 Javascript
canvas绘制的直线动画
2017/01/23 Javascript
AngularJs 常用的过滤器
2017/05/15 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
2017/07/28 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
JS函数基本定义与用法示例
2020/01/15 Javascript
Python的函数嵌套的使用方法
2014/01/24 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
python实现扫雷小游戏
2020/04/24 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
python 深度学习中的4种激活函数
2020/09/18 Python
python使用matplotlib绘制折线图的示例代码
2020/09/22 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
IE矩阵Matrix滤镜旋转与缩放及如何结合transform
2012/11/29 HTML / CSS
以太网Ethernet IEEE802.3
2013/08/05 面试题
学生生病请假条范文
2014/02/16 职场文书
小区消防演习方案
2014/02/21 职场文书
医院院务公开实施方案
2014/05/03 职场文书
构建和谐校园倡议书
2015/01/19 职场文书
商超业务员岗位职责
2015/02/13 职场文书
公务员爱岗敬业心得体会
2016/01/25 职场文书
DIY胆机必读:各国电子管评价
2022/04/06 无线电
vmware虚拟机打不开vmx文件怎么办 ?vmware虚拟机vmx文件打开方法
2022/04/08 数码科技