Tạo Ứng Dụng Todo List Với Supabase Và React Trong 10 Phút

22/03/2026 P T P Chung 10 phút đọc 0 bình luận

Giới thiệu

Trong thế giới phát triển ứng dụng web hiện đại, việc quản lý công việc cá nhân hay nhóm trở nên ngày càng quan trọng. Một ứng dụng todo list đơn giản nhưng hiệu quả có thể giúp chúng ta tổ chức công việc tốt hơn. Trong bài viết này, chúng ta sẽ cùng nhau xây dựng một ứng dụng todo list hoàn chỉnh sử dụng Supabase làm backend và React làm frontend. Supabase cung cấp cơ sở dữ liệu PostgreSQL, xác thực người dùng và nhiều tính năng khác một cách dễ dàng, giúp chúng ta tập trung vào logic ứng dụng thay vì lo lắng về cơ sở hạ tầng.

Tại sao chọn Supabase và React?

React là một thư viện JavaScript phổ biến để xây dựng giao diện người dùng, nổi tiếng với khả năng tạo ra các ứng dụng single-page application (SPA) nhanh chóng và linh hoạt. Kết hợp với Supabase, chúng ta có một stack hoàn chỉnh từ frontend đến backend mà không cần phải quản lý server riêng biệt.

Supabase cung cấp: - Cơ sở dữ liệu PostgreSQL với Realtime subscriptions - Xác thực người dùng tích hợp sẵn - Storage cho file upload - Row Level Security (RLS) để bảo mật dữ liệu

Điều này giúp chúng ta xây dựng ứng dụng todo list với khả năng xác thực, lưu trữ dữ liệu và đồng bộ thời gian thực chỉ trong vài bước đơn giản.

Thiết lập dự án

Cài đặt Supabase

Để bắt đầu, chúng ta cần tạo một project mới trên Supabase: 1. Đăng nhập vào dashboard của Supabase 2. Tạo một project mới với tên bất kỳ 3. Lưu lại URL và public anon key để sử dụng trong ứng dụng React

Sau khi project được tạo, chúng ta cần thiết lập bảng dữ liệu cho todo list. Supabase cung cấp SQL editor để chạy các câu lệnh SQL trực tiếp:

CREATE TABLE todos (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  title TEXT NOT NULL,
  description TEXT,
  is_completed BOOLEAN DEFAULT false,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
  user_id UUID REFERENCES auth.users ON DELETE CASCADE
);

-- Tạo row level security policy ALTER TABLE todos ENABLE ROW LEVEL SECURITY;

-- Chỉ cho phép user truy cập vào dữ liệu của chính họ CREATE POLICY "Users can only access their own todos." ON todos FOR ALL WITH CHECK (auth.uid() = user_id);

-- Cho phép user đọc dữ liệu của chính họ CREATE POLICY "Users can view their own todos." ON todos FOR SELECT USING (auth.uid() = user_id);

-- Cho phép user tạo todo mới CREATE POLICY "Users can insert their own todos." ON todos FOR INSERT WITH CHECK (auth.uid() = user_id);

Khởi tạo dự án React

Tiếp theo, chúng ta khởi tạo một dự án React mới:

npx create-react-app todo-app
cd todo-app

Cài đặt các dependencies cần thiết:

npm install @supabase/supabase-js @supabase/auth-ui-react @supabase/auth-ui-shared

Xây dựng ứng dụng

Thiết lập kết nối Supabase

Tạo một file supabaseClient.js để quản lý kết nối:

import { createClient } from '@supabase/supabase-js';

const supabaseUrl = 'YOUR_SUPABASE_URL'; const supabaseAnonKey = 'YOUR_SUPABASE_ANON_KEY';

export const supabase = createClient(supabaseUrl, supabaseAnonKey);

Xác thực người dùng

Thêm xác thực vào App.js:

import { useState } from 'react';
import { Auth, createAuthProvider } from '@supabase/auth-ui-react';
import { Theme } from '@supabase/auth-ui-shared';
import { supabase } from './supabaseClient';

function App() { const [session, setSession] = useState(null);

const authProvider = createAuthProvider({ authOptions: { supabase: { supabaseUrl: supabase.url, supabaseKey: supabase.anonKey, }, }, });

return ( <Auth provider={authProvider} theme={Theme} supabaseClient={supabase} onAuthStateChange={(event, session) => { setSession(session); }} /> ); }

export default App;

Quảng cáo

300x250 In-Content Advertisement

Hiển thị danh sách todo

Tạo component TodoList.js:

import { useEffect, useState } from 'react';
import { supabase } from './supabaseClient';

function TodoList() { const [todos, setTodos] = useState([]); const [newTodo, setNewTodo] = useState('');

useEffect(() => { fetchTodos();

// Subscribe to realtime changes const subscription = supabase .from('todos') .on('*', (payload) => fetchTodos()) .subscribe();

return () => supabase.removeSubscription(subscription); }, []);

async function fetchTodos() { const user = supabase.auth.user(); const { data, error } = await supabase .from('todos') .select('*') .eq('user_id', user.id);

if (error) console.error(error); else setTodos(data); }

async function addTodo() { const user = supabase.auth.user(); const { error } = await supabase .from('todos') .insert([ { title: newTodo, user_id: user.id, }, ]);

if (error) console.error(error); else setNewTodo(''); }

return ( <div> <h2>Danh sách công việc</h2> <input value={newTodo} onChange={(e) => setNewTodo(e.target.value)} placeholder="Thêm công việc mới..." /> <button onClick={addTodo}>Thêm</button> <ul> {todos.map((todo) => ( <li key={todo.id}> <input type="checkbox" checked={todo.is_completed} onChange={async () => { await supabase .from('todos') .update({ is_completed: !todo.is_completed }) .eq('id', todo.id); }} /> <span style={{ textDecoration: todo.is_completed ? 'line-through' : 'none' }}> {todo.title} </span> </li> ))} </ul> </div> ); }

export default TodoList;

Nâng cao tính năng

Cập nhật và xóa todo

Bạn có thể mở rộng component bằng các chức năng cập nhật và xóa:

async function updateTodo(id, updates) {
  await supabase
    .from('todos')
    .update(updates)
    .eq('id', id);
}

async function deleteTodo(id) { await supabase .from('todos') .delete() .eq('id', id); }

Filter và search

Thêm khả năng lọc công việc hoàn thành hoặc chưa hoàn thành:

const [filter, setFilter] = useState('all');

const filteredTodos = todos.filter(todo => { if (filter === 'completed') return todo.is_completed; if (filter === 'active') return !todo.is_completed; return true; });

Kết luận

Qua bài viết này, chúng ta đã cùng nhau xây dựng một ứng dụng todo list hoàn chỉnh sử dụng Supabase và React. Với Supabase, chúng ta có được một backend mạnh mẽ với cơ sở dữ liệu, xác thực và realtime subscriptions chỉ trong vài bước đơn giản. React giúp chúng ta tạo ra giao diện người dùng linh hoạt và tương tác.

Điểm mạnh của stack này là khả năng mở rộng - bạn có thể dễ dàng thêm nhiều tính năng hơn như chia sẻ todo với người khác, tạo dự án, hoặc tích hợp với các dịch vụ bên thứ ba. Supabase cũng cung cấp các công cụ quản trị và monitoring giúp bạn theo dõi hiệu năng ứng dụng.

Hy vọng bài viết này đã cung cấp cho bạn cái nhìn tổng quan về cách xây dựng ứng dụng todo list với Supabase và React. Chúc bạn thành công với dự án của mình!

Quảng cáo

728x90 Bottom Advertisement

Thay thế bằng mã Google AdSense

Chia sẻ bài viết

Facebook Twitter

Bình luận

Chia sẻ ý kiến của bạn về bài viết này

Viết bình luận

Bình luận của bạn sẽ được kiểm duyệt trước khi hiển thị

Chưa có bình luận nào

Hãy là người đầu tiên bình luận về bài viết này!