高德地图弹窗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 />
})

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

相关推荐
用户298698530142 天前
React 前端将 Excel 工作表导出为图片的技术实践
javascript·react.js·excel
終不似少年遊*3 天前
【安全业务Agent】从场景到编排
python·react.js·ai·langchain·agent·安全架构·工作流
JavaPub-rodert4 天前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang
Highcharts.js4 天前
React 中原生支持使用 JSX 组件配置自定义表格 Highcharts Grid
前端·javascript·react.js·前端框架·jsx·highcharts·自定义表格
JudithHuang4 天前
React 嵌套路由与布局
前端·react.js·arcgis·react·react router
前端小D4 天前
React Native项目开发(iOS侧为例)
javascript·react native·react.js
志尊宝5 天前
AI原生前端开发(042):AI辅助的路由设计与优化
javascript·react.js·ai-native
znsoft6 天前
MaClaw(码卡龙)技术拆解:一个 Go + React 的可自进化智能体平台
开发语言·react.js·golang
濮水大叔6 天前
React/Next.js 生态里,有没有 CabloyJS 这样的全栈框架?
react.js·全栈·next.js
前端小D6 天前
React Native Android 项目搭建
android·react native·react.js