Antd Cascader no muestra los hijos cuando se aplica los datos obtenidos de una API con SWR.
Estoy intentando usar el componente Cascader de Ant Design pero ha ocurrido un problema cuando apliqué los datos obtenidos de una API con el SWR Hook.
Mi código:
“`
const { dataCategories: { data }} = useCategories(); //SWR custom hook para reutilizar en otros componentes
/*
Obtuve el resultado después de la obtención:
[
{
cate_id: 1,
cate_name: ‘Apple’,
has_children: true,
…
},
{
cate_id: 2,
cate_name: ‘Asus’,
has_children: true,
…
},
{
cate_id: 3,
cate_name: ‘Dell’,
has_children: true,
…
}
]
*/
const [options, setOptions] = useState(data);
const loadData = async selectedOptions => {
const targetOption = selectedOptions[selectedOptions.length – 1];
targetOption.loading = true;
setTimeout(() => {
targetOption.loading = false;
targetOption.children = [
{
cate_name: ‘iPhone’,
cate_id: 1,
has_children: false,
},
{
cate_name: ‘Macbook’,
cate_id: 2,
has_children: false,
}
];
setOptions([…options]);
}, 2000);
};
return (
loadData={loadData}
changeOnSelect
placeholder=”Por favor seleccione su categoría”
/>
)
Actualmente, muestra los elementos, pero cuando hago clic en cada elemento para abrir el cascader de hijos, siempre está girando y no responde.
¿Qué estoy haciendo mal?
davy.ai
Basado en el código y la explicación proporcionados, parece que el problema está relacionado con la naturaleza asíncrona de la función
loadData
y la forma en que actualiza el estado deoptions
.Cuando el usuario hace clic en un elemento para abrir sus descendientes en cascada, se llama a la función
loadData
para obtener y cargar los datos de las opciones secundarias. Sin embargo, esta función establece la propiedadloading
de la opción objetivo entrue
y luego realiza una operación asíncrona (es decir, unsetTimeout
) para simular una recuperación de datos. Durante este tiempo, el estado deoptions
se actualiza con los valores originales (ya queoptions
se pasa como una dependencia asetOptions
) y el componente se vuelve a renderizar con estos datos incompletos.Cuando se completa la operación asíncrona, la propiedad
loading
de la opción objetivo se restablece afalse
y la propiedadchildren
se actualiza con los datos recuperados. Sin embargo, en lugar de establecer el estado deoptions
con las opciones actualizadas (es decir, la opción objetivo con sus descendientes), se llama asetOptions
con el array de opciones original ([...options]
), lo que provoca que el componente se vuelva a renderizar con los datos incompletos una vez más. Esto crea un bucle infinito de actualizaciones y re-renderizaciones, lo que conduce al comportamiento de giro y la falta de respuesta.Para solucionar este problema, debes actualizar el estado de
options
con el array de opciones actualizadas que incluya la opción objetivo con sus descendientes. Puedes lograr esto encontrando el índice de la opción objetivo en el array deoptions
y actualizándolo con los nuevos valores utilizando el operador de propagación (spread operator
). Luego, puedes establecer el estado deoptions
con el array actualizado utilizandosetOptions
.Aquí tienes el código actualizado para la función
loadData
:Ten en cuenta que este código actualizado utiliza una función
fetchChildren
para obtener los datos secundarios de la API en lugar de la funciónsetTimeout
. Esta función debería definirse fuera del componente y puede utilizar la APIfetch
o cualquier biblioteca (por ejemplo, Axios) para realizar la solicitud a la API y devolver los datos.Además, se agrega un bloque
try
/catch
para manejar cualquier error que pueda ocurrir durante la recuperación de la API, y la propiedadloading
de la opción objetivo se restablece afalse
en el bloquecatch
para manejar correctamente el estado de carga.Con estos cambios, el componente en cascada debe cargar y mostrar los datos correctamente, sin girar ni volverse irresponsivo.