#javascript #reactjs #react-hooks
#javascript #reactjs #реагирующие хуки
Вопрос:
Я пытаюсь создать карту, на которой будут отображаться вискокурни в виде значков на карте. При нажатии на один из маркеров винокурни состояние обновляется, чтобы содержать объект с этими данными винокурни, поэтому всплывающее окно может отображаться с соответствующей информацией. У меня есть эффект наведения, который я хочу сохранять после нажатия до тех пор, пока состояние удерживает объект.
У меня есть следующий троичный оператор, который должен добавить ‘clicked’, когда selectedDistillery является правдивым, но класс не применяется. className={`marker-btn ${selectedDistillery ? 'clicked' : ''}`}
Всплывающее окно отображается нормально при нажатии, поэтому я не совсем уверен, в чем проблема.
Вот весь компонент
import 'mapbox-gl/dist/mapbox-gl.css';
import './App.css';
import React, { useState, useEffect } from 'react'
import ReactMapGl, { Marker, Popup } from "react-map-gl";
import * as distilleries from "./data/dist-locations.json";
const App = () => {
const [viewport, setViewport] = useState({
latitude: 56.770720743612365,
longitude: -4.2724397531559655,
width: "90vw",
height: "90vh",
zoom: 6,
});
const [selectedDistillery, setSelectedDistillery] = useState(null);
useEffect(() => {
const listener = (e) => {
if(e.key === 'Escape'){
setSelectedDistillery(null);
}
}
window.addEventListener('keydown', listener);
return () => {
window.removeEventListener('keydown', listener);
}
}, [])
console.log(selectedDistillery);
return (
<div className="main-container">
<div className="map-container">
<ReactMapGl
{...viewport}
mapboxApiAccessToken={process.env.REACT_APP_API_KEY}
onViewportChange={(viewport => { setViewport(viewport) })}
mapStyle="mapbox://styles/vdiad/ckkq0g4201s4r17peswejsg82"
>
{distilleries.features.map(distillery => {
return(
<Marker key={distillery.id} latitude={distillery.geometry.coordinates[1]} longitude={distillery.geometry.coordinates[0]} >
<button
className={`marker-btn ${selectedDistillery ? 'clicked' : ''}`}
onClick={()=>{
setSelectedDistillery(distillery);
}}
>
<img src="/barrel1.svg" alt="whisky barrel img" />
</button>
</ Marker>
)
})}
{selectedDistillery amp;amp; (
<div className="popup">
<Popup
latitude={selectedDistillery.geometry.coordinates[1]}
longitude={selectedDistillery.geometry.coordinates[0]}
onClose={()=>{setSelectedDistillery(null)}}
>
<h3>{selectedDistillery.properties.NAME}</h3>
<p>Founded in: </p>
<p>Region: </p>
</ Popup>
</div>
)}
</ReactMapGl>
</div>
</div>
)
}
export default App
Комментарии:
1. Разве вы не должны проверять выбранный ликеро-водочный завод по элементам списка? Нравится
selectedDistillery.id === distillery.id
2. Я не уверен, что компонент действительно повторно отображается, поскольку пустой массив передается в useEffect, по сути, сообщая ему «вот что нужно изменить, чтобы вы повторно отображали», и это никогда не меняется.
3. Использование троичного оператора выглядит нормально, возможно, проблема связана с react-map-gl