Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

153
Visualizações
Prevención de una representación excesiva al usar mapbox y reaccionar al contexto

Tengo una aplicación que usa un mapa de mapbox y estoy tratando de permitir un ajuste de la ventana gráfica desde otro componente de tarjeta separado. La forma en que hice esto fue creando un contexto de ventana gráfica y pasando la ventana gráfica y la función que la establece tanto al mapa como al componente de la tarjeta.

Esto funciona, pero tengo un problema con la reproducción. Cada vez que el usuario se desplaza por el mapa, la ventana gráfica cambia constantemente y, por lo tanto, todo lo que se encuentra dentro del Proveedor de ventana gráfica se vuelve a representar constantemente. A continuación se muestra una versión simplificada del código.

aplicación

 <ViewportProvider> *Container that holds both the map and the sidebar that renders the card components* </ViewportProvider>

ViewportProvider

 import React from "react"; const INITIAL_STATE = { longitude: 15, latitude: 25, zoom: 1 }; export const ViewportContext = React.createContext(); export const ViewportProvider = (props) => { const [viewport, setViewport] = React.useState(INITIAL_STATE); return ( <ViewportContext.Provider value={{ viewport, setViewport, }} {...props} /> ); }

Mapa

 import React, { useContext } from "react"; import ReactMapGL from "react-map-gl"; import { ViewportContext } from "./ViewportProvider"; const { viewport, setViewport } = useContext(ViewportContext); <Map onViewportChange={nextViewport => setViewport(nextViewport)} {...viewport}/>

Tarjeta

 const {setViewport} = useContext(ViewportContext) <Card onClick={setViewport(...newValue)}/>

¿Cómo puedo detener la reproducción excesiva cuando el usuario se mueve por el mapa sin perder la capacidad de que el usuario ajuste la ventana gráfica desde el componente de la tarjeta?

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Al poner viewport y setViewport en el mismo contexto, está obligando a la barra lateral a volver a renderizarse cada vez que cambia el viewport, porque usa useContext(ViewportContext) , aunque solo usa la parte setViewport del contexto. Hay algunas opciones:

  • Reduzca el impacto en el rendimiento de volver a renderizar simplemente moviendo useContext(ViewportContext) a un subcomponente, de modo que solo el subcomponente, no toda la barra lateral, se renderice cada vez que se actualice la ventana gráfica.
  • Si solo necesita actualizaciones unidireccionales (el botón de la barra lateral puede configurar la ventana gráfica del mapa, pero ningún otro componente necesita saber cuándo el usuario se mueve por el mapa), puede eliminar la llamada setViewport del mapa.
  • Coloque viewport y setViewport en contextos separados. Esto significaría dos llamadas createContext() , pero aún mantendría un solo componente ViewportProvider que representa ambos proveedores, por ejemplo, const [viewport, setViewport] = useState(); return <Context1.Provider value={viewport}><Context2.Provider value={setViewport}> ... . Luego, su barra lateral puede useContext solo para el contexto que necesita, y no se volverá a representar cuando el otro cambie.
  • Use algo como useContextSelector para reemplazar const {setViewport} = useContext(ViewportContext) con const setViewport = useContextSelector(ViewportContext, (ctx) => ctx.setViewport) .
  • Si está considerando cambios arquitectónicos más amplios, las bibliotecas como React Redux o Recoil podrían proporcionar diseños alternativos que evitarían este problema.

(Por cierto, en su código tal como está escrito, le recomendaría envolver el value que pasa a ViewportContext.Provider en un useMemo(() => ({viewport, setViewport}), [viewport, setViewport]) , para que no desencadena una actualización cuando ViewportProvider se vuelve a representar si la ventana gráfica no ha cambiado).

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda