Skip to content

Docs: adiciona artigo sobre Custom Hooks#144

Open
dvbcknd wants to merge 4 commits into
he4rt:masterfrom
dvbcknd:feature/custom-hooks
Open

Docs: adiciona artigo sobre Custom Hooks#144
dvbcknd wants to merge 4 commits into
he4rt:masterfrom
dvbcknd:feature/custom-hooks

Conversation

@dvbcknd

@dvbcknd dvbcknd commented Jul 8, 2026

Copy link
Copy Markdown

O que foi feito

Adiciona artigo explicando como criar custom hooks no React, cobrindo:

  • O problema que motiva a extração de lógica
  • Como criar um hook customizado
  • Exemplo prático de uso

Closes #123

dvbcknd added 2 commits July 8, 2026 16:08
Signed-off-by: Bruno Gomes <189028215+dvbcknd@users.noreply.github.com>
@dvbcknd dvbcknd requested a review from a team July 8, 2026 19:19
@gabrielduete gabrielduete added the documentation Improvements or additions to documentation label Jul 9, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(block): Ajuste no local do arquivo

Precisamos mover esse arquivo pra essa pasta: https://github.com/he4rt/react4noobs/tree/master/docs/Iniciando%20com%20React

E renomear ele pra 8.8-custom-hooks

Comment thread docs/Custom Hooks/custom-hooks.md Outdated
</a>
</p>


Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(nitpick): remover linha em branco (6 ou 7)


Perceba como o componente ficou mais limpo: Ele não sabe **como** a requisição é feita, apenas **usa** o resultado.

<p align="center">Made with 💜</p>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(block): Antes disso, precisamos colocar o link para a próxima seção, tipo como é feito aqui: https://github.com/he4rt/react4noobs/blob/master/docs/Iniciando%20com%20React/8.3-useContext.md

Comment thread docs/Custom Hooks/custom-hooks.md Outdated

export function useFetch(url){
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(block): Precisamos iniciar o state de loading como false. Se o hook for montado sem URL, o estado fica "carregando" pra sempre. Dá pra inicializar como false e só ativar dentro do fetchData.

Suggested change
const [loading, setLoading] = useState(true);
const [loading, setLoading] = useState(false);

OBS: Setar pra true dentro do fetchData

Comment thread docs/Custom Hooks/custom-hooks.md Outdated

if(!url){
return;
}else{

@gabrielduete gabrielduete Jul 9, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(suggestion): Podemos usar early return nessa condição, vai ficar bem mais clean!

Atual

            if(!url){
                return;
            }else{
                fetchData(); //Se tiver URL ele chama a função
            }

Early return

         if (!url) return;
         
         fetchData();

Ou deixar o if (!url) no começo do arquivo mesmo. Vou deixar como exemplo no próximo comentário.

```javascript
import { useState, useEffect } from 'react';

export function useFetch(url){

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

(suggestion): Adicionar cleanup no useEffect pra evitar race condition

Como o useEffect dispara a cada mudança de url, requisições podem resolver fora de ordem, uma resposta antiga chega depois da nova e sobrescreve o data correto. Como é um tutorial, vale mostrar o padrão de cleanup, que é o jeito idiomático de lidar com isso:

useEffect(() => {
    if (!url) {
        setLoading(false);
        return;
    }

    let ignore = false; // flag: ignora resultado se o effect já foi limpo

    const fetchData = async () => {
        setLoading(true);
        setError(null);

        try {
            const respon
            }
            const json = await response.json();
            if (!ignore) setData(json);
        } catch (err) {
            if (!ignore) {
                setError(err.message);
                setData(null);
            }
        } finally {
            if (!ignore) setLoading(false);
        }
    };

    fetchData();

    // Cleanup: roda quando a url muda ou o componente desmonta
    return () => {
        ignore = true;
    };
}, [url]);

O let ignore = false + return () => { ignore = true } garante que só a requisição mais recente atualiza o estado.

Alternativa mais robusta seria AbortController pra cancelar o fetch de verdade, mas o ignore já resolve o problema visível e é mais simples de explicar para um iniciante.

@gabrielduete gabrielduete left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Opa, @dvbcknd! Tudo bem? O Artigo ficou muito bom!

Muito obrigado por contribuir! 💜

Deixei alguns comentários! Boa parte é bem simples, mas qualquer coisa pode falar! =)

@gabrielduete gabrielduete self-requested a review July 9, 2026 00:41
@dvbcknd

dvbcknd commented Jul 9, 2026

Copy link
Copy Markdown
Author

@gabrielduete obrigado pelos comentários. Vou verificar tudo e fazer as mudanças.

dvbcknd added 2 commits July 9, 2026 03:17
Correção do link de direcionamento para o próximo item: 8.8-custom-hooks

Signed-off-by: Bruno Gomes <189028215+dvbcknd@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Hooks - Como criar custom hooks?

2 participants