Đăng nhập

BÀI 12: PINIA – QUẢN LÝ TRẠNG THÁI ỨNG DỤNG TRONG VUE 3

Mục tiêu:

  • Hiểu vấn đề của việc truyền dữ liệu giữa các component
  • Học cách dùng Pinia để quản lý dữ liệu dùng chung (todo list, user info, theme…)
  • Ứng dụng Pinia vào app đơn giản

Vì sao cần Pinia?

Khi dữ liệu cần chia sẻ giữa nhiều component, việc truyền qua props hoặc emit sẽ rối và khó kiểm soát. Lúc đó ta cần một nơi trung tâm để:

  • Lưu dữ liệu
  • Đọc / sửa dữ liệu từ bất kỳ component nào

Đó chính là vai trò của store trong Pinia.

Cách cài Pinia (dùng CDN):

<!-- Vue 3 -->
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<!-- Vue Router -->
<script src="https://unpkg.com/vue-router@4"></script>
<!-- Pinia -->
<script src="https://unpkg.com/pinia@2/dist/pinia.iife.js"></script>

Demo: Quản lý đếm số lượng (counter) dùng Pinia

<!DOCTYPE html>
<html lang="vi">
<head>
  <meta charset="UTF-8">
  <title>Vue + Pinia</title>
  <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
  <script src="https://unpkg.com/pinia@2/dist/pinia.iife.js"></script>
  <style>
    body {
      font-family: Arial;
      padding: 30px;
    }
    button {
      margin-right: 10px;
    }
  </style>
</head>
<body>

<div id="app">
  <h2>📦 Demo Pinia: Bộ đếm</h2>
  <p>Giá trị hiện tại: {{ counter.count }}</p>
  <button @click="counter.increment">Tăng +1</button>
  <button @click="counter.decrement">Giảm -1</button>
</div>

<script>
const { createApp } = Vue;
const { createPinia, defineStore } = Pinia;

// Tạo store
const useCounterStore = defineStore('counter', {
  state: () => ({
    count: 0
  }),
  actions: {
    increment() {
      this.count++;
    },
    decrement() {
      this.count--;
    }
  }
});

const app = createApp({
  setup() {
    const counter = useCounterStore();
    return { counter };
  }
});

const pinia = createPinia();
app.use(pinia);
app.mount('#app');
</script>

</body>
</html>

Giải thích:

Thành phầnÝ nghĩa
defineStore('counter', {...})Tạo một store tên counter
stateDữ liệu toàn cục
actionsCác hàm thay đổi dữ liệu
useCounterStore()Dùng store trong component
setup()Sử dụng Composition API để khai báo dữ liệu

Bài tập thực hành:

  1. Thêm reset() để đặt lại count = 0
  2. Tạo một todoStore để lưu danh sách công việc
  3. Dùng store trong nhiều component khác nhau để đọc/ghi todo

Tổng kết:

Bạn đã học được:

  • Cách tạo và dùng Pinia store
  • Biến dữ liệu thành toàn cục để component nào cũng dùng được
  • Cách thao tác với state, actions

Thảo luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Đăng ký nhận tin mới

Nhận bài học, tài nguyên và cơ hội việc làm qua email hàng tuần.

Chúng tôi cam kết không spam. Bạn có thể hủy bất cứ lúc nào.