reactjs 当选择值改变时如何重新呈现我组件?

3b6akqbq  于 2023-01-25  发布在  React
关注(0)|答案(1)|浏览(99)

现在,我有一个Map组件,它基于从选择菜单组件中选择的值绘制折线数据。我遇到的问题是,当我将值更改为选择菜单中的其他选项并单击按钮播放动画时(请注意,按钮播放并暂停,因此需要单击,直到再次播放新的按钮)再次,它似乎仍然有以前的数据存储在其中,所以将绘制一条折线为以前的选项选择,然后一条折线为新的数据选择。在那里,因为我想它,以便当选择菜单值被更改时,数据被清除,只存储当前选定的,然后将只绘制选定的值。我似乎无法弄清楚它已经在这一段时间了,现在将感谢一些帮助。我希望replayMap重新呈现时,选择值的变化
我已经创建了一个沙盒来运行程序。可能有一些CSS的Map问题似乎补丁不知道为什么这是因为它对我的应用程序。我会很感激,如果任何人可以解决我的问题提到的选择菜单
链接到代码:https://codesandbox.io/s/distracted-sun-jwk3dg?file=/src/ReplayMap.js

guicsvcw

guicsvcw1#

如果你想渲染后,你可以选择添加关键字,你的组件如下。

import React, { useContext, useState, useEffect, useRef } from "react";

import {
  MapContainer,
  TileLayer,
  Popup,
  Polyline,
  Marker
} from "react-leaflet";
import MovingMarker from "./MovingMarker";
import ActivityList from "./ActivityList";

let setPositionInterval;

function ReplayMap(props) {
  const [mapRef, setMapRef] = useState(1); // added this line for trigger counter
  const [nextPosition, setNextPosition] = useState();
  const currentIdxRef = useRef(0);
  const duration = 0.2 * 1000; // 1 second is 1000ms

  useEffect(() => {
    if (props.playStatus) {
      setPositionInterval = setInterval(() => {
        currentIdxRef.current < props.activityData.length &&
          setNextPosition(props.activityData[currentIdxRef.current]);
        setMapRef(mapRef++); // added this line if position change your counter increse and force re-render your component.
        currentIdxRef.current = currentIdxRef.current + 1;
      }, duration);

      return () => {
        clearInterval(setPositionInterval);
      };
    }
  }, [props.playStatus]);

  //console.log("Props = ", props.activityData);
  return (
    <div>
      <MapContainer
        center={[-8.798064, 115.222211]}
        zoom={15}
        scrollWheelZoom={false}
        style={{ width: "400px", height: "400px" }}
        key={mapRef.toString()}
      >
        <TileLayer
          attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
          url={"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"}
        />
        {props.playStatus && (
          <MovingMarker
            nextPosition={nextPosition ? nextPosition : props.activityData[0]}
            duration={duration}
            playStatus={props.playStatus}
          />
        )}
      </MapContainer>
    </div>
  );
}

export default ReplayMap;

相关问题