我正在使用React。我试图更改被点击的图像的样式。但是使用此函数将状态应用于所有元素。onClick事件应用于图像。当单击一个时,其他图像的边框应该将边框颜色更改为#a2a0ff。只有被点击的图像应该具有颜色#4D4AFF。
import React from "react";
import './SearchPower.css';
import { YMaps, Map, Placemark} from '@pbe/react-yandex-maps';
function App() {
// Определение геопозиции пользователя
var getLocationPromise = new Promise((resolve) => {
navigator.geolocation.getCurrentPosition(async function (position) {
resolve([position.coords.latitude, position.coords.longitude])
})
})
var [lat, setLat] = React.useState(0)
var [lng, setLng] = React.useState(0)
getLocationPromise.then((location) => {
setLat(location[0])
setLng(location[1])
})
if (lat == 0 && lng == 0) {
lat = 55.75
lng = 37.57 }
// Создание карты
var myMap = React.useMemo(
() => ({ center: [lat, lng], zoom: 9 })
);
// Работа с метками
const [imageHref, setImageHref] = React.useState("images/Marks/ZemMark.png");
const [ImgStyle, setImgStyle] = React.useState()
function changeGeoPosition(newLink) {
setImageHref(newLink);
setImgStyle("5px solid #4D4AFF")
}
return (
<div className="ContextSP">
<div className="DivMarks">
<img className="MarkLeftImage" src="images/Marks/ZemMark.png" onClick={function() {changeGeoPosition("images/Marks/ZemMark.png")}} style={{borderBottom: ImgStyle}}/>
<img className="MarkImage" src="images/Marks/Redcar1Mark.png" onClick={function() {changeGeoPosition("images/Marks/Redcar1Mark.png")}} style={{borderBottom: ImgStyle}}/>
<img className="MarkImage" src="images/Marks/Redcar2Mark.png" onClick={function() {changeGeoPosition("images/Marks/Redcar2Mark.png")}} style={{borderBottom: ImgStyle}}/>
<img className="MarkImage" src="images/Marks/GreencarMark.png" onClick={function() {changeGeoPosition("images/Marks/GreencarMark.png")}} style={{borderBottom: ImgStyle}}/>
<img className="MarkRightImage" src="images/Marks/YellowcarMark.png" onClick={function() {changeGeoPosition("images/Marks/YellowcarMark.png")}} style={{borderBottom: ImgStyle}}/>
</div>
<YMaps>
<Map style={{width: '100%', height: '100%', margin: '0 0 10px 0', border: '3px solid #4D4AFF'}} state={myMap}>
<div id="Prnt">
<Placemark geometry={[lat, lng]}
options={{
iconLayout: 'default#image',
iconImageHref: imageHref,
iconImageSize: [40, 40],
iconImageOffset: [0, 0],
iconOffset: [-5, -38]
}} id="myPosition"></Placemark>
</div>
</Map>
</YMaps>
</div>
)
}
export default App;
1条答案
按热度按时间9o685dep1#
你只有一个
ImgStyle
变量,它被应用于所有图像的样式,其值被设置为所有onclick
,所以它们当然总是具有相同的样式。要这样做,你需要5个独立的状态变量-每个图像一个。但我假设你实际上最多只需要一个图像的边框-刚刚点击的那个-在这种情况下,你根本不需要一个独立的状态变量。只需根据当前
imageHref
和图像的实际href计算样式:然后像这样对每个图像应用它(显示了一个,但应该很明显这如何适用于其他图像):
您可以通过创建一个
href
字符串数组并使用map
-ing来生成每个img
标记来进一步简化此操作。