Tengo una función en la que obtiene los datos meteorológicos para la ubicación actual cuando se hace clic en el botón. Quiero obtener estos datos del componente Ubicación en las páginas/index.tsx donde tengo otros componentes que muestran esos datos.
Esta es mi estructura de componentes:
App --Layout --Header --Location (here i fetch the data on click) --Home (state) --Display 1 --SubDisplay 1 --Display 2¿Tengo que pasar los datos a través de todos los componentes a la página de índice? Podría ser:
¿Es esta la mejor manera de manejar esto?
Debido a la naturaleza de React con respecto al flujo de datos, solo puede pasar props del componente principal a sus hijos, esto se conoce como enlace de datos unidireccional o flujo de datos unidireccional. Según la estructura de sus componentes, para lograr lo que desea hacer, necesitaría usar Context API o algo así como redux para centralizar sus datos en un solo lugar (o simplemente elevar los estados). Sin embargo, puede probar esta "solución alternativa" para que no necesite modificar la estructura de su proyecto:
Dado que su estado está en la página de inicio/índice, puede definir una función en este componente que recibirá como parámetro los datos obtenidos en el componente Location y establecer el estado con estos datos, por supuesto, deberá pasar esta función a través de props . al componente Layout para que pueda pasarlo a Header y Header a Location (perforación de apoyo), ejemplo:
const Home = () => { const [data, setData] = useState([]); const handleData = (data) => { setData(data); } return ( <Layout handleData={handleData}> The rest of your components... </Layout> ) }Luego, como dije, pase esa función de esta manera: Diseño - Encabezado - Ubicación.
En Location :
const Location = ({ handleData }) => { const handleClick = () => { // Fetch your data on click event and pass it as parameter to handleData function handleData(fetchedData); } // The rest of your component... }Espero que esto te ayude.
Soluciones sugeridas basadas en una mayor complejidad
Código de muestra de estado de elevación (más fácil que otro)
const [weatherData,setWeatherData]=useState(); const shippingFunction = function(data) { setWeatherData(data);}Componente de ubicación
Componente de diseño