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 相关文章推荐
getElementById在任意一款浏览器中都可以用吗的疑问回复
May 13 Javascript
JQuery优缺点分析说明
Jun 09 Javascript
javascript 词法作用域和闭包分析说明
Aug 12 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
Dec 14 Javascript
JavaScript的模块化开发框架Sea.js上手指南
May 12 Javascript
node.js实现快速截图
Aug 27 Javascript
Javascript之面向对象--方法
Dec 02 Javascript
10道典型的JavaScript面试题
Mar 22 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
Apr 01 Javascript
JS使用贪心算法解决找零问题示例
Nov 27 Javascript
vue2.0+koa2+mongodb实现注册登录
Apr 10 Javascript
vue 配置多页面应用的示例代码
Oct 22 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读取msn上的用户信息类
2008/12/05 PHP
php UTF8 文件的签名问题
2009/10/30 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
DEFER怎么用?
2006/07/01 Javascript
轻量级 JS ToolTip提示效果
2010/07/20 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
JavaScript节点及列表操作实例小结
2015/08/05 Javascript
javascript中new关键字详解
2015/12/14 Javascript
微信js-sdk地理位置接口用法示例
2016/10/12 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
2017/05/08 jQuery
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
2018/08/17 Javascript
微信小程序图表插件wx-charts用法实例详解
2019/05/20 Javascript
详解在React-Native中持久化redux数据
2019/05/22 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
通过实例了解Nodejs模块系统及require机制
2020/07/16 NodeJs
使用python解析xml成对应的html示例分享
2014/04/02 Python
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
在python中实现调用可执行文件.exe的3种方法
2019/07/07 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
怎么快速自学python
2020/06/22 Python
Python爬取网页信息的示例
2020/09/24 Python
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
职工运动会感言
2014/02/07 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
Python 制作自动化翻译工具
2021/04/25 Python
学会Python数据可视化必须尝试这7个库
2021/06/16 Python
Android在Sqlite3中的应用及多线程使用数据库的建议
2022/04/24 Java/Android