当前位置: 首页 > article >正文

Vue3侦听器监听数据变化早于mapContext初始化的问题

目录

  • 1 问题描述
  • 2 引发原因
  • 3 解决方法

1 问题描述

采用 uni-app 开发包含地图功能的小程序,有时需要使用侦听器 watch 监听地图组件的某个属性,当其变化时,需要操作地图上下文 mapContext,例如在地图上显示一些标记点。我把 mapContext 的初始化放在了 onMounted 生命周期函数中,实际运行后发现,在真机中监听到组件属性值发生变化后,调用 mapContext.addMarkers() 报错,打印 mapContext 发现为 null

2 引发原因

watch 监听到组件属性值发生变化时,mapContext 尚未初始化完成。

3 解决方法

借助 Promise 实现每次调用 mapContext 前都确保 mapContext 已初始化完成。

<script setup>
// 地图上下文
let mapContext = null

onMounted(() => {
  // 获取地图上下文
  const query = uni.createSelectorQuery().in(instance.proxy)
  query
    .select('#customMap')
    .context(({ context }) => {
      // console.log('地图上下文', context)
      mapContext = context
    })
    .exec()
})

/**
 * 确保地图上下文初始化完成
 */
const ensureMapContext = () => {
  return new Promise((resolve, reject) => {
    if (mapContext) {
      resolve(mapContext)
    } else {
      // 如果未初始化完成,则设置一个轮询
      const checkInterval = setInterval(() => {
        if (mapContext) {
          clearInterval(checkInterval)
          resolve(mapContext)
        }
      }, 100) // 每隔100ms检查一次

      // 设置一个超时,防止无限等待
      setTimeout(() => {
        if (!mapContext) {
          clearInterval(checkInterval)
          reject(new Error('地图上下文初始化超时'))
        }
      }, 3000) // 超时3秒
    }
  })
}

const props = defineProps({
  a: {
	type: Number,
	default: 0
  }
})

watch(
  () => props.a,
  (newValue) => {
    ensureMapContext().then(mapContext => {
      mapContext.moveToLocation()
    }).catch(err => {
      console.log('ensureMapContext error', err)
    })
  }
)
</script>

http://www.kler.cn/news/368159.html

相关文章:

  • 实现一个完整FPGA项目的流程
  • 飞书文档解除复制限制
  • Telephony中ITelephony的AIDL调用关系
  • C语言习题~day33
  • vivado 配置
  • 传输层UDP
  • (二十二)、k8s 中的关键概念
  • 动态规划 —— 斐波那契数列模型-解码方法
  • StringBuilder
  • 信息学奥赛复赛复习18-CSP-J2023-01小苹果-向上取整、向下取整、模拟算法
  • WHAT - Excel 文件上传解析与编码
  • 大语言模型使用和测评
  • 【C++修炼进程之练气】初识《类与对象 超详细》❤️
  • 【算法】Bellman-Ford单源最短路径算法(附动图)
  • 【LeetCode:263. 丑数 + 数学】
  • 【已解决,含泪总结】非root权限在服务器上配置python和torch环境,代码最终成功训练(一)
  • 设计模式——过滤器模式
  • 脚本-把B站缓存m4s文件转换成mp4格式
  • vue通过JSON文件生成KML文件源码
  • There is no screen to be resumed matching xxx【解决方案、screen、原因分析】
  • 《2024中国泛娱乐出海洞察报告》解析,垂直且多元化方向发展!
  • linux驱动—注册驱动分析
  • 使用Python计算相对强弱指数(RSI)进阶
  • HarmonyOS NEXT 应用开发实战(八、知乎日报List列表下拉刷新及上滑加载更多分页的实现)
  • Vue引入高德地图自定义信息窗体绑定点击事件无效解决方案
  • anaconda 创建环境失败 解决指南