Como Criar um CRUD Completo em React.js e Node.js: Um Guia para Iniciantes

No mundo do desenvolvimento web moderno, React.js e Node.js são duas das tecnologias mais populares e poderosas. Enquanto o React.js é uma biblioteca JavaScript focada na construção de interfaces de usuário dinâmicas, o Node.js oferece uma plataforma robusta para construir servidores e aplicativos em tempo real.

Neste post, vamos aprender a criar um CRUD (Create, Read, Update, Delete) completo utilizando React.js no front-end e Node.js no back-end. Ao final, você terá a base para construir aplicativos interativos com uma arquitetura moderna, além de usar boas práticas adotadas pelas grandes agências de desenvolvimento.

1. Configuração do Ambiente de Desenvolvimento

Antes de começarmos a codificar, precisamos preparar nosso ambiente de desenvolvimento. Vamos usar o Node.js para o servidor, Express para roteamento e MongoDB como banco de dados. O front-end será feito com React.js.

Instalar Node.js e NPM

Primeiro, instale o Node.js a partir do site oficial. O Node.js vem com o NPM (Node Package Manager), que é a ferramenta para instalar pacotes adicionais.

Criar o Projeto no Node.js (Back-End)

  1. Criação do Servidor Node.js: Crie uma pasta para o seu projeto e, em seguida, inicialize o projeto com o comando:
mkdir crud-react-node
cd crud-react-node
npm init -y

Instalação de Dependências do Back-End:

No back-end, vamos precisar do Express (framework para Node.js) e do Mongoose (biblioteca para MongoDB):

npm install express mongoose cors body-parser

Configuração do Servidor:

Crie um arquivo chamado server.js e adicione o seguinte código para configurar o servidor Express e a conexão com o banco de dados MongoDB.

const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
const bodyParser = require('body-parser');

const app = express();
const port = 5000;

// Middleware
app.use(cors());
app.use(bodyParser.json());

// Conexão com MongoDB
mongoose.connect('mongodb://localhost:27017/crudapp', { useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => console.log('Conectado ao MongoDB'))
    .catch(err => console.log(err));

// Definir rota inicial
app.get('/', (req, res) => {
    res.send('Servidor está funcionando!');
});

// Iniciar servidor
app.listen(port, () => {
    console.log(`Servidor rodando na porta ${port}`);
});

Criar o Modelo do Banco de Dados

Vamos criar um modelo simples de “Produto” com o Mongoose. Crie uma pasta chamada models e um arquivo Product.js dentro dela:

const mongoose = require('mongoose');

const productSchema = new mongoose.Schema({
    name: { type: String, required: true },
    description: { type: String, required: true },
    price: { type: Number, required: true }
});

module.exports = mongoose.model('Product', productSchema);

2. Configuração do Front-End (React.js)

Agora, vamos configurar a parte do front-end usando o React.js. Primeiro, crie o projeto React com o create-react-app.

  1. Criar o Projeto React: Abra o terminal e execute o seguinte comando para criar o projeto:
npx create-react-app client

Depois, vá até o diretório do projeto:

cd client

Instalar Axios para Comunicação com o Back-End:

O Axios é uma biblioteca que facilita as requisições HTTP. Vamos instalá-la no nosso projeto React:

npm install axios

3. Criando o CRUD no Front-End

Agora vamos criar os componentes necessários para o CRUD em React. Vamos ter quatro operações: Criar, Ler, Atualizar e Deletar.

a. Componente App.js

O arquivo App.js vai ser responsável por exibir a lista de produtos e permitir a interação com os formulários de criação e atualização. Vamos adicionar uma estrutura simples de página com navegação:

import React, { useState, useEffect } from 'react';
import axios from 'axios';

const App = () => {
    const [products, setProducts] = useState([]);
    const [product, setProduct] = useState({ name: '', description: '', price: '' });
    const [editing, setEditing] = useState(false);
    const [editId, setEditId] = useState(null);

    // Função para pegar todos os produtos
    const fetchProducts = async () => {
        const res = await axios.get('http://localhost:5000/products');
        setProducts(res.data);
    };

    useEffect(() => {
        fetchProducts();
    }, []);

    // Função para criar um novo produto
    const handleCreate = async (e) => {
        e.preventDefault();
        await axios.post('http://localhost:5000/products', product);
        fetchProducts();
        setProduct({ name: '', description: '', price: '' });
    };

    // Função para editar um produto
    const handleEdit = async (id) => {
        const res = await axios.get(`http://localhost:5000/products/${id}`);
        setProduct(res.data);
        setEditing(true);
        setEditId(id);
    };

    // Função para atualizar um produto
    const handleUpdate = async (e) => {
        e.preventDefault();
        await axios.put(`http://localhost:5000/products/${editId}`, product);
        fetchProducts();
        setProduct({ name: '', description: '', price: '' });
        setEditing(false);
    };

    // Função para deletar um produto
    const handleDelete = async (id) => {
        await axios.delete(`http://localhost:5000/products/${id}`);
        fetchProducts();
    };

    return (
        <div className="container">
            <h1>CRUD em React.js e Node.js</h1>

            <form onSubmit={editing ? handleUpdate : handleCreate}>
                <input
                    type="text"
                    placeholder="Nome do Produto"
                    value={product.name}
                    onChange={(e) => setProduct({ ...product, name: e.target.value })}
                    required
                />
                <input
                    type="text"
                    placeholder="Descrição"
                    value={product.description}
                    onChange={(e) => setProduct({ ...product, description: e.target.value })}
                    required
                />
                <input
                    type="number"
                    placeholder="Preço"
                    value={product.price}
                    onChange={(e) => setProduct({ ...product, price: e.target.value })}
                    required
                />
                <button type="submit">{editing ? 'Atualizar' : 'Criar'}</button>
            </form>

            <h2>Produtos</h2>
            <ul>
                {products.map((product) => (
                    <li key={product._id}>
                        {product.name} - {product.description} - ${product.price}
                        <button onClick={() => handleEdit(product._id)}>Editar</button>
                        <button onClick={() => handleDelete(product._id)}>Deletar</button>
                    </li>
                ))}
            </ul>
        </div>
    );
};

export default App;

b. Estilos Responsivos

Para garantir que a interface seja responsiva, você pode usar o CSS básico com Flexbox ou Grid para garantir que os componentes se ajustem bem em qualquer dispositivo.

.container {
    width: 80%;
    margin: 0 auto;
    padding: 20px;
}

form input, button {
    margin: 10px 0;
    padding: 10px;
    width: 100%;
    max-width: 300px;
}

button {
    background-color: #4CAF50;
    color: white;
    border: none;
    cursor: pointer;
}

button:hover {
    background-color: #45a049;
}

4. Conclusão

Agora você tem um CRUD completo rodando com React.js no front-end e Node.js no back-end. Usamos Express para o roteamento no servidor e Axios para as requisições HTTP no cliente. O MongoDB serve como o banco de dados para armazenar os dados dos produtos.

Com esse projeto, você aprendeu a:

  • Configurar um servidor Node.js com Express.
  • Criar e gerenciar um banco de dados com MongoDB e Mongoose.
  • Construir um front-end interativo com React.js, realizando operações de CRUD.
  • Utilizar práticas modernas de desenvolvimento, como o uso de Axios para requisições HTTP.

Agora você pode expandir esse projeto adicionando autenticação de usuários, validação de formulários, e até mesmo a integração com outras APIs. Aproveite para explorar novas funcionalidades e criar suas próprias aplicações com React.js e Node.js!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *