1
resposta

[Dúvida] Dúvida sobre o useEffect dos filtros

Olá, estou tentando entender o código feito na parte dos filtro:

  const [fotosDaGaleria, setFotosDaGaleria] = useState(fotos)
  const [filtro, setFiltro] = useState('')
  const [tag, setTag] = useState(0)
  
  useEffect(() => {
    const fotosFiltradas = fotos.filter(foto => {
      const filtroPorTag = !tag || foto.tagId === tag;
      const filtroPorTitulo = !filtro || foto.titulo.toLowerCase().includes(filtro.toLowerCase())
      return filtroPorTag && filtroPorTitulo
    })
    setFotosDaGaleria(fotosFiltradas)
  }, [filtro, tag])

A const fotosFiltradas, como o nome sugere, recebera as fotos que passarem nos filtros.

Dentro do fotosFiltradas há duas variáveis que recebem algo de acordo com o valor de tag e filtro respectivamente. Como tem o operador || (ou) se a condição do primeiro valor der true ele nem irá para o segundo, pois, para satisfazer esse operador, somente um dos valores precisa ser true. Desse modo, quando o input estiver vazio, o valor de filtro será false, mas como é !filtro se tornará true, assim o filtro do título não será executado. Ademais isto ocorre da mesma forma na tag, o valor inicial e o filtro de todos é 0, logo false, mas como é !tag será true, então o filtro não ocorre.

A parte dos filtros em si acho bem intuitivo pelo código.

No final é "settado" no fotosGaleria os valores que resultaram do filtro cada vez que o state de filtro ou tag é alterado.

O código que eu fiz no desafio ficou diferente, por isso queria intender melhor se ocorre do jeito que eu pensei.

1 resposta

Você entendeu corretamente o funcionamento do código. Vou resumir para facilitar:

  • fotosFiltradas recebe as fotos que passam nos filtros.
  • Os filtros são definidos com base nas variáveis filtro e tag.
  • Se o filtro estiver vazio, ou seja, se não houver nenhum texto digitado no campo de pesquisa, filtroPorTitulo será verdadeiro para todas as fotos, pois !filtro será verdadeiro. Isso significa que todas as fotos serão incluídas na lista filtrada, independentemente de seus títulos.
  • Se tag for igual a 0 (ou falsa), filtroPorTag será verdadeiro para todas as fotos, pois !tag será verdadeiro. Isso significa que todas as fotos serão incluídas na lista filtrada, independentemente de suas tags.
  • Se filtro e tag tiverem valores diferentes de vazio e 0, respectivamente, o filtro funcionará conforme esperado, considerando tanto o título quanto a tag das fotos.

Portanto, o código está configurado para incluir todas as fotos na lista filtrada quando nenhum filtro específico é aplicado (filtro vazio ou tag igual a 0). Quando filtros específicos são aplicados, apenas as fotos que correspondem a esses filtros serão incluídas na lista. E sim, sempre que o estado de filtro ou tag é alterado, a lista de fotos filtradas é atualizada.