Como Usar Between Entre Duas Colunas de Data no Laravel
Trabalhar com intervalos de datas é uma necessidade comum em aplicações web, especialmente em sistemas que lidam com eventos, agendamentos... Leia mais
Desenvolvedor de Software
Se você vem do jQuery e quer modernizar seus projetos com Alpine.js, esse tutorial é pra você. Vamos mostrar como sair de ações comuns com jQuery e aplicá-las com Alpine.js, e no final, criar um mini projeto real com Laravel usando formulários reativos e requisições AJAX limpas.
Alpine.js é um mini framework reativo pensado para funcionar direto no HTML, como o jQuery, mas com uma pegada declarativa e moderna.
| Conceito | jQuery | Alpine.js |
|---|---|---|
| DOM Ready | $(document).ready(...) |
x-data inicializa automaticamente |
| Mostrar/ocultar | $('#id').hide() |
x-show="visivel" |
| Eventos | $('#btn').click(...) |
@click="acao()" |
| Acesso a valores | $('#input').val() |
x-model="valor" |
| AJAX | $.get(...), $.post(...) |
fetch(...), com ou sem async/await |
Exemplos Comparativos
1. Manipular formulário
Jquery
$('#btn').click(() => {
const nome = $('#nome').val();
alert('Olá ' + nome);
});
Alpine
<div x-data="{ nome: '' }">
<input x-model="nome" placeholder="Digite seu nome">
<button @click="alert('Olá ' + nome)">Enviar</button>
</div>
2. AJAX (GET)
jQuery
$.get('/api/usuarios', function(data) {
console.log(data);
});
Alpine
<div x-data="{
usuarios: [],
async carregar() {
const res = await fetch('/api/usuarios');
this.usuarios = await res.json();
}
}" x-init="carregar()">
<ul>
<template x-for="user in usuarios">
<li x-text="user.nome"></li>
</template>
</ul>
</div>
3. POST com Alpine + Fetch
<div x-data="{
nome: '',
async salvar() {
await fetch('/api/usuarios', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ nome: this.nome })
});
}
}">
<input x-model="nome">
<button @click="salvar">Salvar</button>
</div>
Agora Vamos a um mini projeto para aplicarmos na prática:
Mini Projeto: Alpine.js + Laravel com Formulário Dinâmico
Backend: Laravel 12
Frontend: Blade + Alpine.js (separado)
Objetivo: Cadastrar e listar usuários com AJAX
Migration:
php artisan make:model Usuario -m
Schema::create('usuarios', function (Blueprint $table) {
$table->id();
$table->string('nome');
$table->string('email')->unique();
$table->timestamps();
});
php artisan migrate
Controller:
public function index() {
return Usuario::all();
}
public function store(Request $request) {
$dados = $request->validate([
'nome' => 'required',
'email' => 'required|email|unique:usuarios',
]);
return Usuario::create($dados);
}
Rotas (API):
Route::get('/usuarios', [UsuarioController::class, 'index']);
Route::post('/usuarios', [UsuarioController::class, 'store']);
2️⃣ Alpine.js – Componente externo
resources/js/components/usuarioForm.js:
export default function usuarioForm() {
return {
form: { nome: '', email: '' },
usuarios: [],
mensagem: '',
async salvar() {
const res = await fetch('/api/usuarios', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
},
body: JSON.stringify(this.form)
});
this.mensagem = 'Usuário cadastrado com sucesso!';
this.form.nome = '';
this.form.email = '';
this.carregar();
},
async carregar() {
const res = await fetch('/api/usuarios');
this.usuarios = await res.json();
},
init() {
this.carregar();
}
}
}
3️⃣ Alpine + Vite
resources/js/app.js:
import Alpine from 'alpinejs';
import usuarioForm from './components/usuarioForm';
window.Alpine = Alpine;
Alpine.data('usuarioForm', usuarioForm);
Alpine.start();
4️⃣ Blade com Alpine.js
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>Usuários</title>
@vite('resources/js/app.js')
</head>
<body class="p-6">
<div x-data="usuarioForm">
<form @submit.prevent="salvar">
<input x-model="form.nome" placeholder="Nome" class="block mb-2">
<input x-model="form.email" placeholder="Email" class="block mb-2">
<button type="submit">Salvar</button>
</form>
<div x-text="mensagem" class="text-green-600 mt-2" x-show="mensagem"></div>
<h3 class="mt-4">Usuários:</h3>
<ul>
<template x-for="u in usuarios" :key="u.id">
<li><strong x-text="u.nome"></strong> - <span x-text="u.email"></span></li>
</template>
</ul>
</div>
</body>
</html>
Se você já domina jQuery, Alpine.js é o passo natural para criar interfaces mais modernas, reativas e organizadas, sem sair do Blade e sem complicações como Vue ou React.
Com Alpine, você ganha:
Reatividade nativa no HTML
Menos código JS separado
Facilidade para integrar com Laravel e Livewire
Menor curva de aprendizado vindo do jQuery
Trabalhar com intervalos de datas é uma necessidade comum em aplicações web, especialmente em sistemas que lidam com eventos, agendamentos... Leia mais
Ao realizar estudos de análise de dados ou ao testar sistemas que lidam com grandes volumes de informações, é comum... Leia mais
Hoje boa parte dos banco de dados relacionais podem armazenar campos com valores no formato JSON o que garante maior... Leia mais
Vamos a mais um post HOW TO…. Abra o Terminal: Você pode fazer isso procurando por “Terminal” no menu de... Leia mais