美文网首页前端开发那些事儿
解决qiankun微前端加载腾讯地图JSONP跨域问题

解决qiankun微前端加载腾讯地图JSONP跨域问题

作者: small_zeo | 来源:发表于2021-07-09 14:38 被阅读0次

qiankun微前端框架加载腾讯地图会报jsonp请求跨域的问题,官网给的解决方案如下图所示:


image.png

然而并不能解决实际项目遇到的场景,qiankun框架加载腾讯地图api,腾讯地图本身会动态加载一些JSONP请求的js,从而导致JSONP跨域错误,加载不了地图,就很麻烦,算是qiankun框架的天生bug吧?于是我使用了曲线救国的方法来解决这个问题。
新建了一个腾讯地图的项目,使用iframe嵌套腾讯地图,使用postMessage互相通信。

image.png

1. 子应用:

这个子应用我是使用vue3来开发的,该子应用和iframe的通信方式如下:

        onMounted(async () => {
            window.addEventListener('message', (res) => {
                if (res && res.data && res.data.params && res.data.params.data) {
                    let arr = res.data.params.data.map(item => {
                        return item.title
                    })
                    state.AdForm.adPositionShop = arr.join(',')
                }
            }) 
        })

2. 腾讯地图核心的代码

因为使用到腾讯地图WebService API 的关键词输入提示的接口,需要使用jsonp请求来获取数据,这里使用vue-jsonp来发送jsonp请求。


image.png
<template>
 <div id="app">
   <div class="mapSearch">
     <el-select style="width: 300px;" @change="handleChange" v-model="keyword" multiple
         filterable remote reserve-keyword  placeholder="请输入门店"
         :remote-method="remoteMethod"
         :loading="loading">
       <el-option  v-for="item in options"  :key="item.id" :label="item.title" :value="item.id"></el-option>
     </el-select>
   </div>
   <div id="Map"></div>
 </div>
</template>
<script>
import { jsonp } from 'vue-jsonp'
export default {
  name: 'App',
  data () {
    return {
      keyword: '',
      loading: false,
      options: []
    }
  },
  methods: {
    handleChange (val) {
      window.parent.postMessage({
        cmd: 'returnHeight',
        params: {
          success: true,
          data: val
        }
      }, '*');
    },
    remoteMethod(query) {
      if (query !== '') {
        this.loading = true;
        this.getResult(query)
      } else {
        this.options = [];
      }
    },
    initMap() {
      let center = new TMap.LatLng(30.269765,120.155342);
      //初始化地图
      new TMap.Map("Map", {
        rotation: 20, //设置地图旋转角度
        pitch:30,  //设置俯仰角度(0~45)
        zoom:12, //设置地图缩放级别
        center: center //设置地图中心点坐标
      });
    },
    getResult (query) {
      this.loading = true
      jsonp('https://apis.map.qq.com/ws/place/v1/suggestion', {
        region: "杭州",
        keyword: query,
        key: "CCWBZ-LZD6S-67COM-6GWDO-*****-*****", //  创建应用的key 
        output: 'jsonp'
      }).then(res => {
        this.loading = false 
        this.options = res.data
      })
    }
  },
  mounted () {
    this.initMap()
  }
}
</script>

效果

image.png

总结

涉及到的知识点有:

  1. vue调取腾讯webService API
    参考文章
  2. vue页面与iframe页面通信方法
    参考文章

相关文章

  • 解决qiankun微前端加载腾讯地图JSONP跨域问题

    qiankun微前端框架加载腾讯地图会报jsonp请求跨域的问题,官网给的解决方案如下图所示: 然而并不能解决实际...

  • 跨域访问

    参考文献:jsonp解决跨域问题 . cors解决跨域问题 . (java+前端小白)第一次碰到跨域问题,小伙伴们...

  • 解决ajax跨域问题

    Jsonp解决ajax跨域问题 CORS解决ajax跨域问题

  • ajax跨域请求

    ajax跨域请求(jsonp) 利用JSONP解决AJAX跨域问题的原理与jQuery解决方案JSONP jQue...

  • 跨域

    博客 说说跨域那些事儿 不要再问我跨域的问题了 前端常见跨域解决方案(全) 同源策略 JSONP(填充式JSON)...

  • Jsonp解决跨域1

    Jsonp解决跨域1 1、jsonp如何解决跨域 前后端都需要改动 (1)前端:index.html代码如下: d...

  • PHP后台代码解决跨域问题

    PHP后台代码解决跨域问题 在前端里面,解决跨域的时候总显得那么的恶心,什么jsonp啊,ajax啊,CORS啊什...

  • 结合Promise 封装JSONP方法

    jsonp jsonp是一种前端开发中跨域的解决方案。利用了script 标签可以跨域请求的特性。实现步骤: 1....

  • vue项目解决axios jsonp请求

    众所周知,jsonp一般是解决前端跨域的渠道之一,先从浅入深讲解过渡的历史。 ajax模式请求下的jsonp跨域 ...

  • 跨域

    ??JSONP只能解决GET请求跨域,不能解决POST请求跨域问题,XHR2可以解决GET,POST方式的请求跨域...

网友评论

    本文标题:解决qiankun微前端加载腾讯地图JSONP跨域问题

    本文链接:https://www.haomeiwen.com/subject/smjfpltx.html