Primeiro CRUD em React Native: Guia Completo para Iniciantes
Este guia te acompanha na criação do seu primeiro CRUD (Create, Read, Update, Delete) em React Native. Vamos abordar os conceitos fundamentais e fornecer um código exemplo prático para você começar a construir seus aplicativos mobile.
O Que É um CRUD?
CRUD é um acrônimo que representa as quatro operações básicas que podem ser realizadas em dados persistentes: Criar, Recuperar, Update e Deletar. É a base para a maioria das aplicações que interagem com um banco de dados ou armazenamento local.Pré-requisitos
Antes de começar, certifique-se de ter o seguinte instalado:- Node.js: nodejs.org
- npm ou Yarn: Gerenciadores de pacotes do Node.js
- React Native CLI:
npm install -g react-native-cli
- Expo CLI (opcional): Para desenvolvimento mais rápido, você pode usar o Expo:
npm install -g expo-cli
- Emulador Android ou iOS: Para testar seu aplicativo.
Passo a Passo
1. Criando um Novo Projeto React Native
Use o React Native CLI ou o Expo CLI para criar um novo projeto:# Usando React Native CLI
react-native init MeuCRUD
# Usando Expo CLI
expo init MeuCRUD
Escolha um nome significativo para o seu projeto. O React Native CLI criará um projeto nativo completo, enquanto o Expo CLI oferece um ambiente de desenvolvimento mais simplificado.
2. Estrutura do Projeto
Uma estrutura básica para o seu projeto CRUD pode ser:
MeuCRUD/
├── App.js
├── components/
│ ├── Formulario.js
│ ├── ListaItens.js
│ └── Item.js
└── services/
└── api.js
Essa estrutura organiza o código em diretórios para componentes (interface do usuário) e serviços (lógica de acesso a dados).
3. Definindo o Modelo de Dados
Para este exemplo, vamos trabalhar com um modelo simples de "Tarefa":
// Exemplo de objeto Tarefa
{
id: 1,
titulo: "Lavar a louça",
descricao: "Não esquecer de usar sabão!",
concluida: false
}
O modelo define os atributos que cada tarefa terá: um ID único, título, descrição e um status de conclusão.
4. Criando os Componentes
Vamos criar os componentes React Native:Formulario.js
Responsável por criar novas tarefas.
import React, { useState } from 'react';
import { View, Text, TextInput, Button, StyleSheet } from 'react-native';
const Formulario = ({ adicionarTarefa }) => {
const [titulo, setTitulo] = useState('');
const [descricao, setDescricao] = useState('');
const handleSubmit = () => {
if (titulo && descricao) {
adicionarTarefa({ titulo, descricao });
setTitulo('');
setDescricao('');
}
};
return (
Título:
Descrição:
);
};
const styles = StyleSheet.create({
container: {
padding: 20,
},
label: {
fontSize: 16,
fontWeight: 'bold',
marginBottom: 5,
},
input: {
borderWidth: 1,
borderColor: '#ccc',
padding: 10,
marginBottom: 10,
},
});
export default Formulario;
Este componente usa useState
para gerenciar o título e a descrição da tarefa. Quando o botão "Adicionar Tarefa" é pressionado, a função handleSubmit
é chamada, que envia os dados para a função adicionarTarefa
(passada como prop) e limpa os campos do formulário.
ListaItens.js
Exibe a lista de tarefas.
import React from 'react';
import { View, FlatList } from 'react-native';
import Item from './Item';
const ListaItens = ({ tarefas, apagarTarefa, atualizarTarefa }) => {
return (
item.id.toString()}
renderItem={({ item }) => (
)}
/>
);
};
export default ListaItens;
O componente ListaItens
utiliza o FlatList
para renderizar uma lista otimizada de tarefas. Cada item da lista é renderizado pelo componente Item
.
Item.js
Representa um único item da tarefa.
import React from 'react';
import { View, Text, StyleSheet, TouchableOpacity } from 'react-native';
const Item = ({ tarefa, apagarTarefa, atualizarTarefa }) => {
return (
{tarefa.titulo}
{tarefa.descricao}
atualizarTarefa({ ...tarefa, concluida: !tarefa.concluida })}>
{tarefa.concluida ? 'Desmarcar' : 'Concluir'}
apagarTarefa(tarefa.id)}>
Apagar
);
};
const styles = StyleSheet.create({
container: {
padding: 10,
borderBottomWidth: 1,
borderBottomColor: '#ccc',
},
titulo: {
fontSize: 18,
fontWeight: 'bold',
},
botoes: {
flexDirection: 'row',
justifyContent: 'space-around'
},
botao: {
padding: 5,
backgroundColor: '#eee',
borderRadius: 5
}
});
export default Item;
O componente Item
exibe os detalhes de uma tarefa individual e permite marcar/desmarcar como concluída e apagar. Os botões utilizam TouchableOpacity
para fornecer feedback visual ao toque.
5. Lógica Principal em App.js
Gerencia o estado das tarefas e as operações CRUD.
import React, { useState, useEffect } from 'react';
import { View, StyleSheet, ScrollView } from 'react-native';
import Formulario from './components/Formulario';
import ListaItens from './components/ListaItens';
import { buscarTarefas, criarTarefa, atualizarTarefa, apagarTarefa } from './services/api'; // Importa as funções da API
const App = () => {
const [tarefas, setTarefas] = useState([]);
useEffect(() => {
carregarTarefas();
}, []);
const carregarTarefas = async () => {
const tarefasCarregadas = await buscarTarefas();
setTarefas(tarefasCarregadas);
}
const adicionarTarefa = async (novaTarefa) => {
const tarefaCriada = await criarTarefa(novaTarefa);
setTarefas([...tarefas, tarefaCriada]);
};
const atualizarTarefaItem = async (tarefaAtualizada) => {
await atualizarTarefa(tarefaAtualizada);
setTarefas(tarefas.map(t => t.id === tarefaAtualizada.id ? tarefaAtualizada : t));
}
const apagarTarefaItem = async (id) => {
await apagarTarefa(id);
setTarefas(tarefas.filter(t => t.id !== id));
}
return (
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
paddingTop: 20,
},
});
export default App;
Este componente é o coração do aplicativo. Ele utiliza useState
para manter a lista de tarefas e useEffect
para carregar as tarefas iniciais quando o componente é montado. As funções adicionarTarefa
, atualizarTarefaItem
e apagarTarefaItem
atualizam o estado das tarefas e interagem com a camada de serviço (api.js
).
O componente ScrollView permite rolar a tela caso o conteudo ultrapasse a altura da tela.
6. Criando a Camada de Serviço (api.js)
Isola a lógica de acesso aos dados (simulados, neste caso).
// services/api.js
// **IMPORTANTE:** Substitua por chamadas reais a uma API ou banco de dados!
let tarefasSimuladas = [
{ id: 1, titulo: "Comprar leite", descricao: "Ir ao mercado e comprar leite integral.", concluida: false },
{ id: 2, titulo: "Pagar contas", descricao: "Pagar a conta de luz e água.", concluida: true },
];
let proximoId = 3;
export const buscarTarefas = async () => {
return tarefasSimuladas;
};
export const criarTarefa = async (tarefa) => {
const novaTarefa = { ...tarefa, id: proximoId++, concluida: false };
tarefasSimuladas.push(novaTarefa);
return novaTarefa;
};
export const atualizarTarefa = async (tarefaAtualizada) => {
tarefasSimuladas = tarefasSimuladas.map(t => t.id === tarefaAtualizada.id ? tarefaAtualizada : t);
return tarefaAtualizada;
};
export const apagarTarefa = async (id) => {
tarefasSimuladas = tarefasSimuladas.filter(t => t.id !== id);
return id;
};
Neste exemplo, os dados são armazenados em memória (tarefasSimuladas
). Em um aplicativo real, você substituiria isso por chamadas a uma API ou a um banco de dados.
7. Executando o Aplicativo
Execute o projeto React Native:# Usando React Native CLI
react-native run-android
# ou
react-native run-ios
# Usando Expo CLI
expo start
Certifique-se de que você tem um emulador Android ou iOS configurado ou um dispositivo físico conectado ao seu computador.
Próximos Passos
- Persistência de Dados: Integre um banco de dados (SQLite, Realm, Firebase) para persistir os dados.
- Estilização: Melhore a interface do usuário com componentes estilizados (Styled Components, NativeBase, etc.).
- Validação: Adicione validação aos formulários para garantir a integridade dos dados.
- Testes: Implemente testes unitários e de integração para garantir a qualidade do código.
- Navegação: Adicione navegação entre diferentes telas do seu aplicativo usando React Navigation.
- Redux/Context API: Para aplicações maiores, considere usar um gerenciador de estado como Redux ou Context API para gerenciar o estado global da aplicação.
Sem comentários