Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PR para corrección #34

Open
wants to merge 9 commits into
base: master
Choose a base branch
from

Conversation

redotomi
Copy link

No description provided.

};

export default function MemoTest() {
const [colors, setColors] = useState(setGame())
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

esto no está mal, pero creo que lo mencioné en la clase y está bueno tenerlo en cuenta a futuro:
si tenés una función para inicializar un estado (o una ref), en vez de ejecutar la función podés pasarle la función como argumento así

const [colors, setColors] = useState(setGame)

esto tiene la ventaja de que solo corre la función en el primer render del componente, así como está ahora se va a correr siempre. no significa que se vaya a actualizar mal, pero sí estás corriendo código que no es necesario, y si por ejemplo setGame fuera una función larga que hace muchas cosas, te podría llegar a ralentizar todo.

Comment on lines +68 to +88
function unselectColors() {
setTimeout(() => {
setColors(colors.map((color) => (
{ ...color, on: false }
)))
setSelectedColors([])
}, 200)
}

function discardColors(selectedColor) {
setTimeout(() => {
setColors((prevColors) => (
prevColors.map((color) => (
color.color === selectedColor ?
{ ...color, discarded: true } :
color
))
))
setSelectedColors([]);
}, 200)
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

entiendo que hagas esto en funciones separadas para ponerles nombre, eso está bien. de lo que no estoy convencido es que el timeout lo estés seteando adentro, en vez de en el useEffect. Esto porque:

  1. es un poco dificil, leyendo el código de useEffect, darte cuenta que esto no corre instantáneamente
  2. se hace más difícil limpiar el timeout (cosa que no estás haciendo)

como regla, en un useEffect tenés que limpiar todas las cosas que queden "corriendo" en una función de return (como mostré en la clase, en la parte del title changer).
el useEffect completo me lo imagino así (sacando el setTimeout de estas dos funciones):

useEffect(() => {
    if (selectedColors.length === 2) {
      const timeoutId = setTimeout(() => {
        selectedColors[0] === selectedColors[1] ?
          discardColors(selectedColors[0]) :
          unselectColors()
      }, 200)
      return () => {
        clearTimeout(timeoutId)
      }
    }
  }, [selectedColors, unselectColors])

Comment on lines +18 to +24
function DiscardedSquare() {
return (
<div
className="memotest-square discarded">
</div>
);
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

este DiscardedSquare podría ser una variante del de arriba, pasándole una prop discarded. al ser similares y representar medio lo mismo me parece más limpio, pero no es crucial.

Comment on lines +98 to +99
const winner = getWinner(tiles, currentPlayer);
const gameEnded = winner[0] === true ? true : false;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

se me hace un poco raro llamar a cada valor del array de getWinner sin nombre, sobre todo más abajo en el componente cuando hacés winner[1]. Queda más claro si hacés con desestructuración: const [gameEnded, winner] = getWinner(tiles, currentPlayer)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants