首頁  >  問答  >  主體

useState鉤子對所有元件的狀態進行了更改,而非僅限於預期的一個元件

我正在使用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;
P粉590428357P粉590428357401 天前536

全部回覆(1)我來回復

  • P粉787806024

    P粉7878060242023-09-15 14:37:24

    您只有一個名為ImgStyle的變量,它應用於所有圖像的樣式,並且其值設置為所有onclick事件,所以它們的樣式總是相同的。

    要以這種方式做到這一點,您需要5個單獨的狀態變數 - 每個圖像一個。但我假設您實際上只想在最多一個圖像上顯示邊框 - 剛剛點擊的圖像 - 在這種情況下,您根本不需要單獨的狀態變數。只需根據當前的imageHref和圖像的實際href計算樣式:

    function hasBorder(href) {
      return href === imageHref;
    }

    然後為每個圖像應用它(下面僅顯示一個示例,但應該很明顯如何應用於其他圖像):

    <img className="MarkLeftImage" src="images/Marks/ZemMark.png" onClick={function() {changeGeoPosition("images/Marks/ZemMark.png")}} style={hasBorder("images/Marks/ZemMark.png") ? {borderBottom: "5px solid #4D4AFF" } : {}}/>

    您也可以透過建立一個href字串數組,並透過map函數遍歷產生每個img標籤來進一步簡化此過程。

    回覆
    0
  • 取消回覆