同一页面使用多个高德的选址组件之间会相互影响

踩坑记录:同一页面使用多个高德选址组件的坑


问题简述

摘要:同一页面有多个选址组件,后续的选址会影响到前面的选址:

场景:页面有三个选址组件(A,B,C),A首先选择了“邢台”,B选择了“沙河”,此时A的地址也会变成“沙河”(此时A,B两个组件的地址都变成了“沙河”),然后C选择了“宁晋”,此时A,B,C的地址都会变成“宁晋”。

前提:之前的组件有值的情况才会别后续的组件所影响。

总结:同一页面的所有的选址组件都会以最后一个选址组件选择的地址为准,进行更换。


一、代码及效果展示

页面的代码

我当时的疑问:v-for循环的组件不是不会互相影响吗?

<div  
     v-for="(item, index) in dataList"
     :key="index">
    <MapChoice
      ref="chooseItem"
      :data="item"
      @changeShowArray="changeShowArray"
    />
</div>

问题出现部分的组件代码

getLocationMap() {
      this.dialogVisible = true;
      this.$nextTick(() => {
        const iframeWrap = this.$refs.iframeWrap;
        const iframe = iframeWrap.contentWindow;
        iframeWrap.onload = function () {
          iframe.postMessage("maps", "https://m.amap.com/picker/");
        };
        window.addEventListener(
          "message",
          (e) => {
            console.log("选择列表e", e);
            this.value = e.data.address;
            this.dialogVisible = false;
            console.log("选择地址", this.value);
          },
          false
        );
      });
    },

疑问:v-for循环的组件不是不会相互影响吗?

页面展示

在这里插入图片描述

第一个选址组件选择地址

可以看到,组件正常使用:
在这里插入图片描述

第二个选址组件选择地址

问题出现了:第二个选址组件在选址玩后,发现打印了两遍“选址列表e”,同时第一个选址组件的地址也变成了第二个组件选择的。
在这里插入图片描述

再用其中一个选址组件选择一个地址

发现打印了三遍“选择地址e”。
在这里插入图片描述

二、问题排查

通过加log日志打印,发现每次点击选择地址后 window.addEventListener 这个函数执行的次数为:1+n(n为之前选址组件选择的地址次数,注意:同一个组件多次点击按多次计算)
所以可以肯定问题是因为window.addEventListener 函数的多次执行导致的。于是将window.addEventListener 函数,改为了window.onmessage函数,之后发现选址组件之间就不会相互影响了。


总结

1,使用v-for循环子组件如果传入的值不一样,那就不会相互影响,如果出现类似于上面所述的问题,那一定是某个函数影响导致的。
2,window.addEventListener函数会多次执行,window.onmessage函数只会执行一次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值