#Context Estoy creando un memory game los
1 messages · Page 1 of 1 (latest)
part 2 👇
useEffect(() => {
getCards();
if (choiseOne && choiseTwo) {
if (choiseOne.image === choiseTwo.image) {
setMatchedPairs([...matchedPairs, choiseOne.id, choiseTwo.id]);
setFlippedCards([]);
resetChoise();
} else {
setTimeout(() => {
choiseOne.flipped = false;
choiseTwo.flipped = false;
setFlippedCards([]);
resetChoise();
}, 800);
}
}
if (matchedPairs.length === 16) {
onMatchFinished(true);
}
}, [choiseOne, choiseTwo, matchedPairs, onMatchFinished]);
const resetChoise = () => {
setChoiseOne(null);
setChoiseTwo(null);
};
const getCards = async () => {
const { data } = await supabase.from("cards").select(`
*,
languages (
*
)
`);
setCardData(data);
};
//This is not possible because breaking one of hooks rules
// native.length > 0 && learn.length > 0
// ? setCard(useShuffle(cardData))
//: console.log("Waiting");
return (
<>
<section className="p-10 gap-x-4 gap-y-4 overflow-hidden grid grid-cols-4 justify-items-center content-center ">
{/*cards.length > 0 ? (
cards.map((pair: CardInfo, index: number) => (
<CardComponent
key={index}
id={pair.id}
word={pair.word}
image={pair.image}
flipped={pair.flipped}
matched={pair.matched}
onClick={() => handleCardClick(pair)}
/>
))
) : (
<span className="text-[#ffffff]">loading</span>
) */}
</section>
</>
);
};
export { CardsComponent };
custom hook:
import { useEffect, useState } from "react";
import { CardInfo } from "../models/card.model";
const useShuffle = (array:CardInfo[]) => {
const [cards, setCards] = useState<CardInfo[]>();
useEffect(()=>{
const shuffledCards = [...array].sort(() => Math.random() - 0.5);
setCards(shuffledCards);
}, [])
return cards;
};
export { useShuffle };
y que problema estás teniendo?
se ejecuta primero el custom hook
y rompe todo
ya en el momento que en que se ejecuta aun lo datos no han llegado
cual y donde? que no veo donde se ejecuta
esta comentado
vale
en el return
en el useEffect tienes algunas cosas que pueden generar problemas
la dependencia matchedPairs y el llamado a setMatchedPairs
si dentro del efecto modificas una dependencia, se va a volver a ejecutar el efecto y puede volverse una ejecución infinita
choiseOne.flipped = false; los estados no pueden modificarse asi, ya que deben ser inmutables
lo que tienes comentado, lo podrías meter en otro useEffect
para que no te de problemas
useEffect(() => {
if (native.length > 0 && learn.length > 0) {
// acá volvemos al problema de modificar la dependencia cardData
setCard(useShuffle(cardData))
}
}, [native.length, learn.length, cardData])
setChoiseOne(prevVal => ({ ...prevVal, flipped: false }))
algo como eso
okokokok
voy a hacerlo, gracias
pregunta, cuantos useEffect pueden estar en un component?
igual debes buscar la manera de darle la vuelta a la logica que tienes, porque tienes muchas posibilidades de terminar con ejecución indefinida del useEffect
los que necesites, no hay problema
okokok
pero debe evitarse su uso para modificar estados en base a otros estados
ya que genere re-renders y puede afectar el performance
ookokok, cualquier cosa te escribo 