- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当用户在我的 map 上单击添加的标记时,它会打开 map 上所有标记的弹出窗口
弹出窗口会针对在数据库加载的标记上单击的单个标记打开,但对于“setShowUserPopup”,它们会针对用户添加的每个标记打开,如照片所示(表单是弹出内容)
感谢您提前提供的任何帮助!
import React, { useState, useEffect } from "react";
import ReactMapGL, { Marker, Popup } from "react-map-gl";
import { listLogEntries } from "./API";
import LogEntryForm from "./LogEntryForm";
import { Grid, Card, Icon, Fab } from "@material-ui/core";
const BasicMap = () => {
// Markers loaded from database
const [logEntries, setLogEntries] = useState([]);
const [showPopup, setShowPopup] = useState({});
// Markers from user input
const [userMarkers, setUserMarkers] = useState([]);
const [showUserPopup, setShowUserPopup] = useState({});
// viewport is all the infomation about the default map state
const [viewport, setViewport] = useState({
width: "100vw",
height: "100vh",
latitude: 52.950001,
longitude: -1.15,
zoom: 6,
minZoom: 3
// maxZoom: 3
});
// Get entries from API
const getEntries = async () => {
const logEntries = await listLogEntries();
setLogEntries(logEntries);
};
useEffect(() => {
getEntries();
}, []);
const showAddMarkerPopup = event => {
const [longitude, latitude] = event.lngLat;
setUserMarkers([
...userMarkers,
{
id: userMarkers.length + 1,
lat: latitude,
long: longitude,
draggable: true
}
]);
};
useEffect(() => {
console.log("userMarkers", userMarkers);
}, [userMarkers]);
return (
<ReactMapGL
{...viewport}
mapStyle="mapbox://styles/veleter/ck7xdy1yo1bkj1ipmsbhe9c96"
mapboxApiAccessToken={process.env.REACT_APP_MAPBOX_TOKEN}
onViewportChange={setViewport}
onClick={showAddMarkerPopup}
>
{/* DATABASE LOADED MARKERS */}
{logEntries.map(entry => (
<React.Fragment key={entry._id}>
<Marker latitude={entry.latitude} longitude={entry.longitude}>
<div
onClick={() =>
setShowPopup({
...showPopup,
[entry._id]: true
})
}
>
<svg
className="marker yellow"
style={{
height: `${6 * viewport.zoom}px`,
width: `${6 * viewport.zoom}px`
}}
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 512 512"
>
<g>
<g>
<path
d="M256,0C153.755,0,70.573,83.182,70.573,185.426c0,126.888,165.939,313.167,173.004,321.035
c6.636,7.391,18.222,7.378,24.846,0c7.065-7.868,173.004-194.147,173.004-321.035C441.425,83.182,358.244,0,256,0z M256,278.719
c-51.442,0-93.292-41.851-93.292-93.293S204.559,92.134,256,92.134s93.291,41.851,93.291,93.293S307.441,278.719,256,278.719z"
/>
</g>
</g>
</svg>
</div>
</Marker>
{showPopup[entry._id] ? (
<Popup
latitude={entry.latitude}
longitude={entry.longitude}
closeButton={true}
closeOnClick={false}
dynamicPosition={true}
onClose={() =>
setShowPopup({
...showPopup,
[entry._id]: false
})
}
anchor="top"
>
<div className="popup">
{/* <h3>{entry.title}</h3>
<p>{entry.comments}</p>
<p>
<b>Longitude: </b>
{entry.longitude}
</p>
<p>
<b>Latitude: </b>
{entry.latitude}
</p>
<small>
Ticket Placed:{" "}
{new Date(entry.visitDate).toLocaleDateString()}
</small>
{entry.image && <img src={entry.image} alt={entry.title} />} */}
<Card elevation={3} className="p-4">
<div className="flex items-center">
<Fab
size="medium"
className="bg-light-error circle-44 box-shadow-none overflow-hidden"
>
<Icon className="text-error">star_outline</Icon>
</Fab>
<h5 className="font-medium text-error m-0 ml-3">
{entry.title}
</h5>
</div>
<div className="pt-4 flex items-center">
<h2 className="m-0 text-muted flex-grow"></h2>
<div className="ml-3 small-circle bg-error text-white"></div>
<span className="text-13">({entry.longitude})</span>
<span className="text-13">({entry.latitude})</span>
</div>
</Card>
</div>
</Popup>
) : null}
</React.Fragment>
))}
{/* USER ADDED MARKER */}
{userMarkers.map(userMarker => (
<React.Fragment key={userMarker._id}>
<Marker
latitude={userMarker.lat}
longitude={userMarker.long}
draggable
// onDragEnd={setUserMarkers}
>
<div
onClick={() =>
setShowUserPopup({
...showUserPopup,
[userMarker._id]: true
})
}
>
<div>
<svg
className="marker red"
style={{
height: `${6 * viewport.zoom}px`,
width: `${6 * viewport.zoom}px`
}}
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 512 512"
>
<g>
<g>
<path
d="M256,0C153.755,0,70.573,83.182,70.573,185.426c0,126.888,165.939,313.167,173.004,321.035
c6.636,7.391,18.222,7.378,24.846,0c7.065-7.868,173.004-194.147,173.004-321.035C441.425,83.182,358.244,0,256,0z M256,278.719
c-51.442,0-93.292-41.851-93.292-93.293S204.559,92.134,256,92.134s93.291,41.851,93.291,93.293S307.441,278.719,256,278.719z"
/>
</g>
</g>
</svg>
</div>
</div>
</Marker>
{showUserPopup[userMarker._id] ? (
<Popup
latitude={userMarker.lat}
longitude={userMarker.long}
closeButton={true}
closeOnClick={false}
dynamicPosition={true}
onClose={() =>
setShowUserPopup({
...showUserPopup,
[userMarker._id]: false
})
}
anchor="top"
>
<div className="popup">
<LogEntryForm />
</div>
</Popup>
) : null}
</React.Fragment>
))}
</ReactMapGL>
);
};
export default BasicMap;
最佳答案
错误来自于没有向市场传递准确的 ID。当您单击某个标记并将其设置为 true
时,您会对 map 上的所有标记执行此操作。
您需要做的是将 ID 传递给需要打开的元素(即模式),然后使用 onClick
事件定位该 ID。
onClick={e => {
setShowPopup(e.currentTarget.id);
}}
然后要显示所需的元素,您应该将事件
中的值与ID进行比较:
{userMarkersID === showUserPopup.id && (
<div>Whatever you wanna show</div>
)}
其中 userMarkersID
是 map 上每个标记的 ID。希望有帮助
关于javascript - Mapbox 标记弹出窗口不会单独打开/关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60997591/
刚刚通过 cocoapods 安装了 MapboxGL。我在我的 ViewController 中初始化它,就像给出的示例一样: @IBOutlet weak var mapViewWrapper:
有没有办法更改mapbox-gl-js图标图像的颜色? 取自https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/的代码不会将标记颜色
我正在重写来自 Mapbox.js 的路线规划 Web 应用程序至 Mapbox GL JS图书馆。 几乎所有功能都已实现,但由于 的滞后、不流畅的动画和普遍的缓慢,它几乎无法使用。 map 层 .
我的问题是,如何从 MapBox 服务获取指定路线的海拔剖面图。 在输入中,我们将路径/路线作为坐标数组(纬度、经度)。作为结果,我们想要获得坐标对的数组 - 高程。 如果高程数据的分辨率高于提供的路
如何检查 map 上是否显示了 Mapbox 栅格图层? 我的目标是停止加载动画。我知道我可以检查 map 本身是否准备就绪。 map.on('ready', someFunction) 除了针对特定
https://codepen.io/m12n/pen/XWNRZMg?editors=0010 mapboxgl.accessToken = "pk.eyJ1IjoiaW50ZWxsaWdlbm
我想在我的 map 上添加一个自定义标记。我正在使用 mapbox gl 脚本。 我发现与此主题相关的唯一文档是这个 https://www.mapbox.com/mapbox-gl-js/examp
我需要mapbox gl的某种Google map “空闲”事件。 当触发每个事件并且 map 停止放大/缩小拖动等并且每个图层都已加载时, map 处于空闲状态。 我必须使用此代码 map.on
有没有办法在离线设置中使用 Mapbox GL(询问 JS 和 native )?使用 MBTiles,您可以使用 MBTiles 文件或提取光栅图像。我想知道是否有任何类似的东西可以让 Mapbox
我有一个矩形,需要用正方形填充它。我找到中心线并想沿着该线放置方 block 。但是有没有简单的方法可以在 mapboxgl 中与 turfjs 等其他库一起绘制正方形?就像设置正方形的中心和边长并获
我对 MapBox 中的标记有疑问。我有多个标记,我想对其进行聚类。我使用 MapBox SDK for android。请帮我。非常感谢。 我在 Google Service Map Android
我建立了一个新的 react-native 项目并使用 yarn add @react-native-mapbox-gl/maps 添加了 Mapbox。 这个 Notice, that if you
我建立了一个新的 react-native 项目并使用 yarn add @react-native-mapbox-gl/maps 添加了 Mapbox。 这个 Notice, that if you
是否可以获取对应于 Mapbox 缩放级别的仪表列表?就像下面从 Bing map 中列出的一样:here 最佳答案 是的,就在 Mapbox 文档中: https://docs.mapbox.com
由于 Mapbox GL 文档没有讨论任何关于向 LngLat 坐标添加简单标记的内容,而且实际上只有关于如何添加自定义标记的文档,我希望有人能告诉我您应该如何获取 Mapbox-gl.js实际上为传
我有一个图层将 geojson 源中的点要素渲染为圆圈。以下是其中一项功能的示例: { type: 'Feature', properties: { color: 'red',
如何使用嵌套值以使用 case == 运算符?就像是: this.map.setPaintProperty("somelayer", "fill-color", ["case",
我正在使用 mapbox.js 制作带有地点的 map 。我只是想让 map 返回点击的正确坐标,我使用以下代码成功管理: map.on('click', function(e) { var
我在 style.load 事件上重绘图层并移除图层 map.on('style.load', function() { loadByBounds(tempBou
我正在努力实现更好的文本大小调整,相信通过插值,我也许能够将我当前的文本标签更新为更高效的格式。目前我们正在创建“静态文本”,本质上我们获得了特定缩放级别的理想文本大小,然后在每个缩放级别使用停止缩放
我是一名优秀的程序员,十分优秀!