Compare soluções de estado React Native. Aprenda quando usar Redux, Context API ou Zustand com exemplos práticos.
Gerenciar estado corretamente evita bugs, melhora performance e facilita manutenção do código.
Apps crescem e estado fica difícil de gerenciar
Re-renders desnecessários causam lag
Código organizado facilita updates
Quando usar: Apps complexos com muitas telas compartilhando estado.
// store/userSlice.js
import { createSlice } from '@reduxjs/toolkit';
const userSlice = createSlice({
name: 'user',
initialState: {
data: null,
loading: false
},
reducers: {
setUser: (state, action) => {
state.data = action.payload;
},
setLoading: (state, action) => {
state.loading = action.payload;
}
}
});
export const { setUser, setLoading } = userSlice.actions;
export default userSlice.reducer;
// Uso no componente
const user = useSelector(state => state.user.data);
const dispatch = useDispatch();
const handleLogin = () => {
dispatch(setUser({ name: 'João', email: 'joao@email.com' }));
Quando usar: Estado simples compartilhado entre poucos componentes.
// contexts/UserContext.js
const UserContext = createContext();
export const UserProvider = ({ children }) => {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(false);
const login = async (credentials) => {
setLoading(true);
try {
const userData = await authAPI.login(credentials);
setUser(userData);
} finally {
setLoading(false);
}
};
export default function GerenciarEstadoReactNative() {
return (
<UserContext.Provider value={{ user, loading, login }}>
{children}
</UserContext.Provider>
);
};
// Hook customizado
export const useUser = () => {
const context = useContext(UserContext);
if (!context) {
throw new Error('useUser deve ser usado dentro de UserProvider');
}
return context; // Uso no componente
const { user, login } = useUser();
Quando usar: Melhor dos dois mundos - simples como Context, poderoso como Redux.
// stores/userStore.js
import { create } from 'zustand';
import { devtools, persist } from 'zustand/middleware';
const useUserStore = create(
devtools(
persist(
(set, get) => ({
user: null,
loading: false,
setUser: (user) => set({ user }),
login: async (credentials) => {
set({ loading: true });
try {
const userData = await authAPI.login(credentials);
set({ user: userData, loading: false });
} catch (error) {
set({ loading: false });
throw error;
}
},
logout: () => set({ user: null })
}),
{ name: 'user-storage' }
)
)
);
// Uso no componente
const { user, login, logout } = useUserStore();
const loading = useUserStore(state => state.loading);
Guia prático para escolher a melhor solução de estado.
Para 90% dos projetos React Native
API intuitiva
Performance otimizada
Cresce com o projeto
Migração gradual e simples:
Migração por módulos: