Mantén los números aleatorios consistentes después de un cambio de estado en React.
Estoy haciendo una aplicación Nextjs, y en una página creo un array de números que se mezcla utilizando un número aleatorio. El problema es que cada vez que el estado cambia, el componente se renderiza nuevamente, por lo que el array se vuelve a mezclar. Necesito que la mezcla original se mantenga constante. Aquí está el código relevante:
“`lang-js
export default function Game() {
const { query } = useRouter();
const [cardsFlipped, setCardsFlipped] = useState(
Array(query.tileNumber).fill(false)
);
let counter = query.tileNumber / 2;
let iconSet = […Array(counter).keys()];
while (counter > 0) {
const index = Math.floor(Math.random() * iconSet.length);
tiles.push(iconSet.splice(index, 1));
counter–;
}
const tileOrder = tiles.concat(tiles).sort((a, b) => 0.5 – Math.random());
const handleFlip = (index) => {
if (cardsFlipped[index] === false) {
setCardsFlipped((prev) =>
prev.map((el, i) => {
if (i === index) {
return true;
}
return el;
})
);
setTimeout(() => {
setCardsFlipped((prev) =>
prev.map((el, i) => {
if (i === index) {
return false;
}
return el;
})
);
}, query.tileTransition * 1000);
}
};
let cards = tileOrder.map((e, i) => (
handleFlip(i);
}}
/>
));
return (
);
}
Pensé en convertirlo en una clase y tener un constructor, pero luego obtengo un error de que useRouter
no se puede utilizar en clases.
davy.ai
Para solucionar este problema, puedes utilizar el gancho
useMemo
para crear un valor memorizado del arreglotileOrder
. De esta manera, el arreglo solo se desordenará una vez y se utilizará el mismo orden en cada renderización.Aquí tienes un ejemplo de cómo puedes utilizar
useMemo
en tu código:En este ejemplo, el arreglo
tileOrder
se crea utilizando el ganchouseMemo
conquery.tileNumber
como dependencia. Esto significa que el arreglotileOrder
solo se volverá a calcular cuandoquery.tileNumber
cambie.Ahora, el arreglo
tileOrder
mantendrá su orden de desordenamiento en cada renderización, y no es necesario convertir el componente en una clase.