请教一下大佬们,按照官方的例子(官方只有 react 的例子),遇到了window is not defined报错,然后百度发现了一个相同的用户
https://juejin.cn/post/7229984415329108024
但是, 我按照他的方法接入是不报错了, 但是一直也没有正常显示出来
===================updated=============
好像我把他的amapLoaded变量判断去掉同时给 div 设置一个宽高,就可以展示了
代码如下
import { useState, useEffect } from 'react';function MapComponent() { const [amapLoaded, setAmapLoaded] = useState(false) useEffect(() => { if (typeof window !== "undefined") { import('@amap/amap-jsapi-loader').then(AMapLoader => { AMapLoader.load({ key: '282cd9041593e8c30e5df2e2fcd17984', version: '2.0', }).then(() => { setAmapLoaded(true) this.map = new AMap.Map('container', { // 设置地图容器id viewMode: '3D', // 是否为3D地图模式 zoom: 5, // 初始化地图级别 center: [105.602725, 22.076636], // 初始化地图中心点位置 }); }) }) } }, []) return ( <> { <div id="container" className="map-container" style={{height: "600px", width: "880px"}}/>} </> );}export default MapComponent;
但是页面有一个报错。
为啥会报这个错,为啥还能展示
react hooks
已经不用this
了,换成useRef
了。
import { useRef, useState, useEffect } from 'react';function MapComponent() { const mapRef = useRef(null) const [amapLoaded, setAmapLoaded] = useState(false) useEffect(() => { if (typeof window !== "undefined") { import('@amap/amap-jsapi-loader').then(AMapLoader => { AMapLoader.load({ key: '282cd9041593e8c30e5df2e2fcd17984', version: '2.0', }).then(() => { setAmapLoaded(true) mapRef.current = new AMap.Map('container', { // 设置地图容器id viewMode: '3D', // 是否为3D地图模式 zoom: 5, // 初始化地图级别 center: [105.602725, 22.076636], // 初始化地图中心点位置 }); }) }) } }, []) return ( <> { <div id="container" className="map-container" style={{height: "600px", width: "880px"}}/>} </> );}export default MapComponent;
看起来你在使用Next.js接入高德地图时遇到了一些问题。首先,让我们解决你提到的“window is not defined”错误。
这个错误通常出现在Next.js的服务器端渲染(SSR)过程中,因为在服务器环境中没有window
对象。当Next.js尝试在服务器上渲染组件时,它会尝试访问window
对象,从而导致这个错误。
为了解决这个问题,你需要确保高德地图的初始化代码只在客户端执行,而不是在服务器上执行。你可以通过使用typeof window !== 'undefined'
来检查window
对象是否存在,从而确保代码只在客户端执行。
你的代码中已经包含了这个检查,但是在setAmapLoaded(true)
之后,你试图通过this.map
来访问地图实例。在函数组件中,你应该使用useRef
来创建一个可访问的引用,而不是使用this
。
下面是你的代码的修改版,它解决了“window is not defined”错误,并使用了useRef
来创建地图实例的引用:
import { useState, useEffect, useRef } from 'react';function MapComponent() { const [amapLoaded, setAmapLoaded] = useState(false); const mapRef = useRef(null); useEffect(() => { if (typeof window !== 'undefined') { import('@amap/amap-jsapi-loader').then(AMapLoader => { AMapLoader.load({ key: '282cd9041593e8c30e5df2e2fcd17984', version: '2.0', }).then(() => { setAmapLoaded(true); if (mapRef.current) { const map = new AMap.Map(mapRef.current, { viewMode: '3D', zoom: 5, center: [105.602725, 22.076636], }); } }); }); } }, []); return ( <> <div id="container" className="map-container" style={{ height: '600px', width: '880px' }} ref={mapRef} /> </> );}export default MapComponent;
接下来,关于你提到的页面报错问题,你没有提供足够的错误信息来确定问题的具体原因。不过,从你给出的截图来看,报错信息似乎与高德地图的API有关。
确保你的高德地图API密钥是正确的,并且没有被限制使用。另外,检查你的网络请求是否受到任何限制或阻塞,这可能导致高德地图的API无法正确加载。
如果问题仍然存在,你可以尝试在浏览器的开发者工具中查看更详细的错误信息,这将有助于进一步诊断问题。
希望这些解决方案能帮到你!如果你还有其他问题或需要进一步的帮助,请随时提问。
菜鸡简历筛不过,帮朋友记录一下 面试官人很好,上来介绍题型,会说接下来要问什么部分的内容,不会的会慢慢提示啥的,手写题也会讲清楚 进程和线程的区别 http和https的区别 为什么要用udp http和https属于哪一层 多态的作用 什么是死锁,发生的原因有哪些 js的严格模式是什么 事件冒泡和事件捕获 什么是闭包,闭包有哪些作用 vue的组件通信方式有哪些 keep-alive有什么作用 v
记录下一个算法题, A=[1,2,3,4,5,6,7], B=[1,4,5,6,7,8,9], 求[ [A独有的元素],[B独有的元素] ] 。一开始我想构建公共数组比较,但是时间复杂度太大 所以 let setA =new Set(A) let setB =new Set(B), let resA=[],resB=[], A.forEach(val=>{ if(!setA.has(val)){
高德的前端开发面试,面试过程非常详细, 你认为一个五年的前端工程师应该具备哪些能力?你在哪些方面表现得比较好或不足? 请谈谈你使用过的meta标签。 async和defer的作用是什么? this关键字有哪几种指向? 给出一段代码,求输出结果: var length = 5; function a() { console.log(this.length); function b(
自我介绍 如何学习前端,为什么学前端 具体的一个项目介绍 BFC HTTP状态码 盒子模型 跨域实现方法 浏览器本地缓存机制 Vue生命周期,父子组件生命周期 Vue组件间通信 Vue设计原理 React了解吗 代码题:1.数组扁平化+去重 2.查找重复最多的字母及长度 3.对象数组转为树结构 对以后工作的规划 反问:什么时候出结果 实习内容 Ps:总体问得真的挺基础的,面试官也很友善,可惜自己太
面试官很和蔼,全程很舒服,很赞,话不多说上干货 1.自我介绍 2.项目 3.实习工作大概内容 4.BFC 5.CSS实现一个三角形 6.Vue2和3的区别 7.跨域实现方法 8.代码题:数组扁平+去重 9.代码题:数组转为树结构 10.代码题:查找出现最多的字符以及出现字数 11.浏览器缓存机制 12.vue和react的区别 13.父子组件传参方法 14.父子组件生命周期的执行 15.nextt
1. 自我介绍 2. 除了Java,之前学过什么(C++、Linux) 3. 表中十个字段,你主键用自增ID还是UUID,为什么(我回答了自增和UUID的优缺点) 4. 为什么自增ID更快一些,UUID不快吗,它在B+树里面存储是有序的吗(我回答是有序的,然后从索引长度上说UUID更慢一些) 5. 查询数据时,到了B+树的叶子节点,之后的查找数据是如何做(面试官想问到一个数据页上之后的查询过程,但