Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Projeto] Minha solução sem useEffect

Como apanhei um pouco para aprender o useEffect, antes de implementar o useEffect nesse desafio eu resolvi ele utilizando apenas os estados que já existiam.

Eu criei um evento de clique nos componentes Tags e CampoTexto passando como props as funções correspondentes e enviando os dados das tags e o valor do input:

const Tags = ({aoFiltrarFotosPorTag}) => {
  return (
    <TagsContainer>
      <TagTitulo>Busque por tags:</TagTitulo>
      {tags.map((tag) => (
        <Tag key={tag.id} onClick={() => aoFiltrarFotosPorTag(tag)} >{tag.titulo}</Tag>
      ))}
    </TagsContainer>
  );
};
const CampoTexto = ({ aoFiltrarFotosPorPesquisa }) => {
  return (
    <CampoTextoEstilizado
      type="search"
      placeholder="O que você procura?"
      onChange={(e) => aoFiltrarFotosPorPesquisa(e.target.value)}
    />
  );
};

Depois criei duas funções bem simples que comparam as fotos com os valores que foram passados pelos componentes.

  const aoFiltrarFotosPorTag = (tag) => {
    if (tag.id === 0) {
      return setFotosDaGaleria(fotos);
    }

    setFotosDaGaleria(
      fotos.filter((foto) => {
        return foto.tagId === tag.id;
      })
    );
  };

Filtrando por seleção de tags eu comparei o ID de cada tag com o tagId das fotos e retornei todas as fotos que tenham o tagId correspondente. Como a tag "Todas" tem o id 0, se clicado nessa tag retorno a lista de fotos original.

  const aoFiltrarFotosPorPesquisa = (inputValue) => {
    setFotosDaGaleria(
      fotos.filter((foto) => {
        return foto.titulo.toLowerCase().includes(inputValue.toLowerCase());
      })
    );
  };

Na pesquisa a partir do input usei a mesma lógica, mas agora comparando o valor do input com a presença dos caracteres no título da foto.

Além de mostrar pra vocês como fiz, queria saber: em questão de performance essa solução teria alguma desvantagem em relação ao useEffect?

1 resposta
solução!

Olá, Dara!

Primeiramente, parabéns por ter levado o desafio até o fim. Fico feliz de saber que, mais importante do que usar o useEffect, é que você abraçou o desafio e fez os filtros funcionarem.

No seu caso, você está atualizando o estado fotosDaGaleria diretamente nas funções aoFiltrarFotosPorTag e aoFiltrarFotosPorPesquisa. Isso significa que toda vez que uma tag for clicada ou o valor do input mudar, o estado será atualizado e o componente será renderizado novamente.

Num cenário controlado, onde temos poucas fotos e poucas opções de filtros, provalmente não teremos nenhum problema. Agora, conforme forem surgindo novos filtros e o número de fotos e tags forem crescendo, aí sim podemos ter algum problema. Nesse cenário, podemos investigar e refatorar se for necessário.

Espero ter ajudado! Bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software