Quản lý state cục bộ với useState

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 19 tháng 4, 2025

Trong Nuxt 3, useState là một phương pháp tiện lợi để tạo state cục bộ hoặc chia sẻ giữa các thành phần trong cùng một app, mà không cần thiết lập hệ thống quản lý state phức tạp như Vuex hay Pinia. Bài học này sẽ hướng dẫn bạn cách sử dụng useState, phân biệt với refreactive, cũng như cách chia sẻ state này giữa các trang trong ứng dụng Nuxt.

Quản lý state cục bộ với useState

1. Tạo state cục bộ với useState

useState là hàm được Nuxt cung cấp để tạo reactive state, có thể được dùng trong mọi component, composable hoặc page.

<script setup>
const counter = useState('counter', () => 0)
</script>

<template>
  <button @click="counter++">Tăng: {{ counter }}</button>
</template>

Giải thích:

  • 'counter' là key định danh.
  • Hàm () => 0 là giá trị khởi tạo, chỉ được gọi 1 lần.
  • Nuxt đảm bảo state này được chia sẻ trong cùng một phiên SSR hoặc hydration client.

2. So sánh useState với reactive và ref

Đặc điểm useState() ref() / reactive()
Tự động SSR ✅ Có ❌ Không
Chia sẻ toàn app ✅ Có ❌ Chỉ trong component
Giữ state sau khi chuyển trang ✅ Có ❌ Không
Dùng trong Nuxt app ✅ Tối ưu ✅ Chuẩn Vue 3

Khi nào dùng useState:

  • Khi muốn chia sẻ state đơn giản giữa các component/page.
  • Khi cần state tồn tại xuyên suốt quá trình SSR + hydration.

3. Chia sẻ state giữa các trang (Pages)

Bạn có thể tạo state trong một trang và sử dụng lại ở nơi khác:

// ~/pages/index.vue
<script setup>
const counter = useState('counter', () => 0)
</script>
<template>
  <NuxtLink to="/about">Go to About</NuxtLink>
  <p>Index Counter: {{ counter }}</p>
</template>
// ~/pages/about.vue
<script setup>
const counter = useState('counter', () => 0)
</script>
<template>
  <NuxtLink to="/">Back</NuxtLink>
  <p>About Counter: {{ counter }}</p>
</template>

Lưu ý:

  • useState không reset khi chuyển trang nếu cùng key.
  • Giống như một singleton cho mỗi phiên SSR.

4. Dùng useState trong composable

Bạn có thể tạo một file composable để tái sử dụng state:

// ~/composables/useCounter.ts
export const useCounter = () => useState('counter', () => 0)
// bất kỳ file nào
<script setup>
const counter = useCounter()
</script>

Kết luận bài học

useState là một tính năng mạnh mẽ của Nuxt giúp bạn quản lý state cục bộ hoặc dùng chung giữa các component và trang, mà không cần cài thêm thư viện. So với ref() hay reactive() trong Vue 3, useState có ưu thế trong các app cần SSR hoặc trạng thái được duy trì khi chuyển trang. Tuy nhiên, khi ứng dụng trở nên phức tạp, bạn có thể cần đến các giải pháp quản lý state toàn cục như Pinia, sẽ được trình bày trong bài tiếp theo.

Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ