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 相关文章推荐
基于jquery的超简单上下翻
Apr 20 Javascript
实现web打印的各种方法介绍及实现代码
Jan 09 Javascript
浅析JQuery获取和设置Select选项的常用方法总结
Jul 04 Javascript
js动态控制table的tr、td增加及删除的具体实现
Apr 30 Javascript
javascript实现获取字符串hash值
May 10 Javascript
Javascript使用post方法提交数据实例
Aug 03 Javascript
深入理解Java线程编程中的阻塞队列容器
Dec 07 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
May 24 Javascript
移动端日期插件Mobiscroll.js使用详解
Dec 19 Javascript
基于jquery日历价格、库存等设置插件
Jul 05 jQuery
React中获取数据的3种方法及优缺点
Feb 18 Javascript
vue实现树状表格效果
Dec 29 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
php5 non-thread-safe和thread-safe这两个版本的区别分析
2010/03/13 PHP
PHP 网络开发详解之远程文件包含漏洞
2010/04/25 PHP
理解php Hash函数,增强密码安全
2011/02/25 PHP
PHP全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
基于PHP CURL获取邮箱地址的详解
2013/06/03 PHP
PHP进阶学习之命名空间基本用法分析
2019/06/18 PHP
基于jQuery的360图片展示实现代码
2012/06/14 Javascript
jquery无刷新验证邮箱地址实现实例
2014/02/19 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
EasyUI的doCellTip实现鼠标放到单元格上提示单元格内容
2016/08/24 Javascript
Bootstrap导航条的使用和理解3
2016/12/14 Javascript
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
2017/09/06 NodeJs
基于AngularJS的简单使用详解
2017/09/10 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
JavaScript 五大常见函数
2018/03/23 Javascript
vue-cli安装使用流程步骤详解
2018/11/08 Javascript
JS Thunk 函数的含义和用法实例总结
2020/04/08 Javascript
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
解决vue+webpack项目接口跨域出现的问题
2020/08/10 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
python批量替换页眉页脚实例代码
2018/01/22 Python
Python的Lambda函数用法详解
2019/09/03 Python
python写一个随机点名软件的实例
2019/11/28 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
如何删除一个表里面的重复行
2013/07/13 面试题
企业爱岗敬业演讲稿
2014/09/04 职场文书
学校感恩节活动策划方案
2014/10/06 职场文书
初中生散播谣言检讨书
2014/11/17 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL
如何在python中实现ECDSA你知道吗
2021/11/23 Python
我的收音机情缘
2022/04/05 无线电
Python 装饰器(decorator)常用的创建方式及解析
2022/04/24 Python