Pular para conteúdo

Solução 16 - Context API e Gerenciamento Global 🌐

Navegação

← Exercício 16 | Voltar ao Índice

🟢 Respostas Fáceis

1. Context API

Resposta 1

Context compartilha dados globalmente sem prop drilling:

```jsx
const AuthContext = createContext();

const AuthProvider = ({ children }) => {
    const [usuario, setUsuario] = useState(null);

    return (
        <AuthContext.Provider value=(Undefined, Undefined)>
            {children}
        </AuthContext.Provider>
    );
};
```

2. Prop Drilling

Resposta 2

Passar props através de múltiplos níveis:

```jsx
// ❌ Prop drilling
<App> → <Header> → <Menu> → <UserIcon usuario={usuario} />

// ✅ Context API
const { usuario } = useContext(AuthContext); // Direto em UserIcon
```

🟡 Respostas Médias

3. useContext Hook

Resposta 3

```jsx const { usuario, login, logout } = useContext(AuthContext);

// Acesso direto aos dados do context
if (!usuario) return <LoginButton onClick={login} />;
return <WelcomeMessage nome={usuario.nome} onLogout={logout} />;
```

4. Multiple Contexts

Resposta 4

jsx const App = () => ( <AuthProvider> <ThemeProvider> <NotificationProvider> <Router /> </NotificationProvider> </ThemeProvider> </AuthProvider> );

🔴 Resposta Desafio

5. Context vs Estado Local

Resposta 5

Quando usar cada um:

**Context API** para:
- ✅ Autenticação de usuário
- ✅ Tema da aplicação
- ✅ Idioma/internacionalização
- ✅ Carrinho de compras

**Estado Local** para:
- ✅ Dados de formulário
- ✅ Estado de loading específico
- ✅ Modals abertos/fechados
- ✅ Filtros de uma página específica

**Regra**: Context para dados que **muitos componentes** precisam acessar.

Implementação Completa

```jsx // AuthContext.jsx export const AuthContext = createContext();

export const AuthProvider = ({ children }) => {
    const [usuario, setUsuario] = useState(null);
    const [loading, setLoading] = useState(true);

    const login = async (email, senha) => {
        setLoading(true);
        try {
            const response = await api.post('/login', { email, senha });
            setUsuario(response.data.usuario);
            localStorage.setItem('token', response.data.token);
        } catch (error) {
            throw error;
        } finally {
            setLoading(false);
        }
    };

    const logout = () => {
        setUsuario(null);
        localStorage.removeItem('token');
    };

    const value = {
        usuario,
        login,
        logout,
        loading,
        isAuthenticated: !!usuario
    };

    return (
        <AuthContext.Provider value={value}>
            {children}
        </AuthContext.Provider>
    );
};

// Hook customizado
export const useAuth = () => {
    const context = useContext(AuthContext);
    if (!context) {
        throw new Error('useAuth deve ser usado dentro de AuthProvider');
    }
    return context;
};
```

!!! tip "Dicas para Próximos Estudos" - Explore Redux Toolkit para estados complexos - Use React Query para gerenciamento de servidor state - Pratique Custom Hooks para lógica reutilizável - Configure TypeScript para type safety

Parabéns! 🎉

Você completou todos os exercícios do curso. Continue praticando e explorando o ecossistema React!

Navegação

← Exercício 16 | Voltar ao Índice