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?