高德地图弹窗AMap.InfoWindow()如何使用react组件作为content

问题介绍

AMap.InfoWindow()用于在地图上弹出详细信息展示窗体。其参数Options中的content属性接受类型为String/HTMLElement,无法直接渲染React组件。你可以查看高德地图API官方文档了解更多信息

解决思路

react-amap是一个基于React封装的高德地图组件库,提供了一种插槽式API,允许将React组件作为InfoWindow的内容。让我们深入了解作者是如何实现的。通过查看github源码,我们可以发现作者是如何创建一个HTML元素作为content,并将React组件渲染到这个div中:

js 复制代码
setChild(props: IWProps) {
    const child = props.children
    if (this.infoDOM && child) {
      render(<div>{child}</div>, this.infoDOM)  // infoDOM: HTMLElement
    } else {
      if (props.children) {
        console.warn('因为你设置 isCustom 为 true,InfoWindow 的 Children 被忽略')
      }
    }
  }

在 React 18 中,render 函数被 createRoot 函数替换,我们直接来看看一个react项目的入口是如何实现渲染的

html 复制代码
//index.html
<!doctype html>
<html lang="en">
  <head>
  ...
  </head>
  <body>
    <div id="root"></div>
    <script type="module" src="/src/main.tsx"></script>
  </body>
</html>
js 复制代码
//main.ts
import ReactDOM from 'react-dom/client'
import App from './App.tsx'

ReactDOM.createRoot(document.getElementById('root')!).render(
  <App />
)

上述代码显示,首先在index.html中创建了一个根节点,然后在main.ts中使用createRoot创建React根元素,最后调用render方法进行渲染。

解决步骤

参考上面的代码,想要在高德地图的InfoWindow中渲染React组件,可以按以下步骤进行:

  1. 创建一个HTML元素:
js 复制代码
const window = document.createElement('div')
  1. 使用ReactDOM.createRoot将React组件渲染到HTML元素中:
js 复制代码
ReactDOM.createRoot(window).render(<YourComponent />)
  1. 使用AMap.InfoWindow(),将之前创建的HTML元素作为content:
js 复制代码
const Window = new AMap.InfoWindow({
  isCustom: true, // 使用自定义窗体
  content: window
})

效果对比

如果我们直接使用React组件效果如下:

js 复制代码
const Window = new AMap.InfoWindow({
  isCustom: true, // 使用自定义窗体
  content: <InfoWindow />
})

而使用上文提供的方法的效果如下:

相关推荐
LaughingZhu13 小时前
智能体经典范式构建:ReAct、Plan-and-Solve 与 Reflection
前端·react.js·前端框架
飞天狗14 小时前
长列表滚动卡顿怎么破:虚拟列表选型 + react-virtuoso 实战调优指南
react.js·性能优化
binbin_5217 小时前
React 井字棋教程:用一个小游戏理解组件和状态
前端·react.js·前端框架
张元清18 小时前
React useObjectUrl Hook:预览文件与 Blob,不留内存泄漏(2026)
javascript·react.js
真的想不出名儿1 天前
Md编辑器整合-react
前端·react.js·编辑器
牛仔只喝牛奶2 天前
多端跨端技术选型:小程序 + H5 + App 的两栈拆分落地
react native·react.js
wear工程师2 天前
setState 到底是不是异步的?这题从 React 16 问到 18,标准答案早就变了
react.js·面试
wanghowie2 天前
LangGraph4j 落地(二)— ReAct 多步工具与 trace 扩展
前端·react.js·前端框架
csj502 天前
前端基础之《React(11)—state声明式》
前端·react.js
张元清2 天前
React useLocalStorage Hook:SSR 安全的持久化状态(2026)
javascript·react.js