以一定间隔渲染标记

问题描述

就我之前的question而言, 我正在以特定的时间间隔查看地图上的渲染标记,例如 10 秒或 20 秒。
下面是代码...

{
                setInterval(() => {
                    this.tmcount += 1;
                    console.log(this.tmcount);
                    console.log(this.state.geoData[this.tmcount]);
                    return (

                                <Marker key={this.tmcount} position={[this.state.geoData[this.tmcount].lat,this.state.geoData[this.tmcount].lng]}>
                                    <Popup>
                                        {this.tmcount} Hi!!!
                                        </Popup>
                                </Marker>
                            )
                },1000)
            }

我用上面的方法试过,但没有渲染..

解决方法

您的问题需要大量工作。我不知道这个 setInterval 在哪里运行,或者你的实际地图组件在哪里。话虽如此,您需要以不同的方式思考这一点。您希望您的地图定期更新,这意味着您需要有一些状态变量来跟踪正在更新的内容,并且地图应该做出相应的响应。让我们设置一个组件,它在其状态中有一个标记数组,以及一个在任何给定时间呈现该数组中内容的地图:

const MapComponent = () => {

  const [markers,setMarkers] = useState([]) // start with nothing

  return (

    <MapContainer center={center} zoom={zoom}>
      {markers.map((marker,index) => {
        const key = {index} // bad idea here
        const {lat,lng} = marker
        return <Marker key ={} position={} />
      })}
    </MapContainer>

  )

}

最初,您将没有标记,因为您的状态变量是一个空数组。但是您的组件希望如果有标记,则它们将在该数组中的每个条目上具有 .lat.lng 属性。现在,假设您有一些数据源,它是一个包含位置信息的对象数组,您可以设置一个 useEffect 以使用该数据集中的新条目逐步更新您的状态变量:

const [markers,setMarkers] = useState([])

useEffect(() => {

  const interval = setInterval(() => {

     // clone state variable
     const updatedMarkers = [...markers] 
     // add next marker entry from source dataset
     updatedMarkers.push(geoData[markers.length]) 
     // setMarkers(updatedMarkers)

  },1000) // 1 second interval

  return () => { clearInterval(interval) } // clean up interval on unmount

},[])

return ( ... )

所以现在,在组件安装时,设置了一个计时器,以使用源数据中的下一个条目每秒更新状态。地图将做出同样的反应,并每秒添加下一个标记。我还没有测试过这个,但希望它足以让你知道该怎么做。