Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Dúvida em relação ao primeiro click no botao favorito

Olá, estou curioso sobre como funciona, a parte do código a seguir, no primeiro click:


favorita: fotoDaGaleria.id === foto.id ? !foto.favorita : fotoDaGaleria.favorita

As fotos, antes do primeiro click no favorito, não possuem a propriedade favorita, então nesse momento além de definir o valor a propriedade está sendo criada. Contudo, na criação desta, para o valor ser estabelecido, o operador ternário utiliza a própria propriedade favorita para estabelecer o valor.

A questão é: como no primeiro click a propriedade favorita não existe ainda, logo na parte do código (!foto.favorita : fotoDaGaleria.favorita), o valor de foto.favorita e fotoDaGaleria.favorita seriam undefined, porém como estamos em uma validação esse valor passaria a ser false por causa do falsy values do JS? Desse modo, na primeira parte (? !foto.favorita) passaria de undefined para false e como está invertendo o valor, no final ficaria true? Já na segunda parte (: fotoDaGaleria.favorita) passaria de undefined para false?

Gostaria de saber se a minha explicação estaria certa, se não, como seria.

2 respostas
solução!

Bora amplicar o nosso escopo, Matheus, pra gente analisar essa função?

Vem comigo aqui:


    const aoAlternarFavorito = (foto) => {
        setFotosDaGaleria (fotosGaleria.map(fotoDaGaleria => {
            return{
            ...fotoDaGaleria,
            favorita: fotoDaGaleria.id === foto.id ? !foto.favorita : fotoDaGaleria.favorita
            }
        }))

Nós recebemos uma foto por parâmetro, certo? Ou seja, queremos alternar o favoritismo dela. Se for true vira false. Então, quando fazemos um fotosGaleria.map, a gente percorre toda nossa galera. Aí fazemos o mapeamento:

Se a foto da galeria foi a foto clicada, nós invertemos o valor: !foto.favorita. Isso quer dizer que, se for true, vira false. Se for false ou undefined, vira true.

No nosso else, não importa se favorita é false, true ou undefined. O valor que existir, vamos manter.

Quando validamos essa propriedade para escolher o ícone não faz diferença se temos false ou undefined, nos dois casos a foto não é favorita :)

Ah! entendi, na primeira parte caso seje undefined ou false ele troca para true e quando for true para false. Já na segunda parte, independente do valor, undefined, false ou true, ele simplesmente manterá o valor.

Muito obrigado, Vinicios, esclareceu minha dúvida :D