El hook useEffect es una herramienta fundamental en React para manejar efectos secundarios en componentes funcionales. Los efectos secundarios son operaciones que pueden tener impactos fuera del ámbito directo de la función en la que se ejecutan, como la manipulación del DOM, la suscripción a servicios externos, la realización de peticiones HTTP, y la configuración de timers.
Fuente: React Hooks lifecycle method
El hook useEffect combina el comportamiento de los métodos del ciclo de vida componentDidMount y componentDidUpdate en componentes funcionales.
Calculator.tsx
, comente las variables locales menuItems y radioItems...
{/* Datos */ }
/*
let menuItems = [ ... ]
*/
/*
let radioItems = [ ... ]
*/
...
Calculator.tsx
, importe la interfaz Datumimport Datum from '../interfaces/Datum.tsx';
export default function Calculator({ setPlan, setResult }) {
...
}
Calculator.tsx
, agregue la desestructuración de arreglo (estado actual y función de actualización) para declarar los estados del componente. El valor predeterminado de ambos estado actual es [].export default function Calculator({ setPlan, setResult }) {
{/* Hooks: useState */ }
...
const [menuItems, setMenuItems] = React.useState<Array<Datum>>([]);
const [radioItems, setRadioItems] = React.useState<Array<Datum>>([]);
...
}
Calculator.tsx
, agregue el hook useState con las peticiones asincrónicas. En cuanto los datos sean recibidos y convertidos a JSON, se utilizarán las funciones de actualización de los estados.export default function Calculator({ setPlan, setResult }) {
{/* Hooks: useState */ }
...
{/* Hooks: useEffect */ }
React.useEffect(() => {
(async () => {
const res = await fetch('https://raw.githubusercontent.com/aavendan/datos/main/tutoriales/planes.xml');
const textXML = await res.text();
const parser = new DOMParser();
const xml = parser.parseFromString(textXML, "application/xml");
const data = Array.from(xml.getElementsByTagName("item")).map(element => {
return {
"title": element.getElementsByTagName("title")[0].textContent,
"subtitle": element.getElementsByTagName("subtitle")[0].textContent,
"intro": element.getElementsByTagName("intro")[0].textContent,
"description": element.getElementsByTagName("description")[0].textContent,
}
})
setMenuItems(data)
{/*const res = await fetch('https://raw.githubusercontent.com/aavendan/datos/main/tutoriales/planes.json');
const data = await res.json();
setMenuItems(data)*/}
})();
(async () => {
const res = await fetch('https://raw.githubusercontent.com/aavendan/datos/main/tutoriales/tiempo.json');
const data = await res.json();
setRadioItems(data)
})();
}, [])
...
}