Astro 進階課程 2. 狀態管理與跨組件通訊 —— Nano Stores

更新 發佈閱讀 6 分鐘

專題二:Nano Stores —— 連結孤島的橋樑

為什麼需要它?

在 Astro 中,每個互動組件(React, Vue, Svelte)都是一個獨立的「孤島 (Island)」。

  • 問題:如果你在 Header.tsx (React) 有一個購物車圖示,在 ProductCard.tsx (React) 有一個「加入購物車」按鈕,這兩個組件是分開渲染的,沒辦法直接傳遞數據。

-解決方案Nano Stores。它是一個極小(< 1KB)且框架無關的狀態庫,能讓不同框架、不同孤島之間共享資料。


1. 手把手實作:安裝與設定

首先,安裝 Nano Stores:

npm install nanostores @nanostores/react

2. 建立 Store

在 src/ 下建立一個資料夾 store/,並建立 cartStore.ts

import { atom } from 'nanostores'

// 定義一個簡單的狀態:購物車內的物品數量
export const $cartCount = atom(0)

// 定義一個增加數量的方法
export function addToCart() {
$cartCount.set($cartCount.get() + 1)
}

小撇步:在 Nano Stores 中,習慣在變數名前面加上 $(如 $cartCount),方便一眼看出它是個 Store。

3. 在 React 組件中使用

建立 src/components/AddToCartButton.tsx (按鈕):

import { addToCart } from '../store/cartStore'

export default function AddToCartButton() {
return (
<button
onClick={() => addToCart()}
className="bg-indigo-600 text-white px-4 py-2 rounded-lg hover:bg-indigo-700"
>
加入購物車
</button>
)
}

建立 src/components/CartCounter.tsx (顯示數量):

import { useStore } from '@nanostores/react'
import { $cartCount } from '../store/cartStore'

export default function CartCounter() {
const count = useStore($cartCount)

return (
<div className="relative p-2">
<span className="bg-red-500 text-white text-xs rounded-full px-2 py-1">
{count}
</span>
</div>
)
}

4. 在 Astro 頁面中組合

在你的 index.astro 或 Layout.astro 中放置這兩個組件:

---
import CartCounter from '../components/CartCounter';
import AddToCartButton from '../components/AddToCartButton';
---

<nav class="flex justify-between p-4 bg-slate-100">
<h1 class="font-bold">我的商店</h1>
<CartCounter client:load />
</nav>

<main class="p-10">
<AddToCartButton client:load />
</main>

📝 專題二練習題

任務目標:實作一個「深色模式 (Dark Mode)」切換器。

  1. 建立 Store:在 src/store/themeStore.ts 中建立一個 $isDark 的 atom(預設為 false)。
  2. 切換按鈕:建立一個 ThemeToggle.tsx 組件,點擊時切換 $isDark 的值。
  3. 全局影響
    • 這比較進階:在你的 BaseLayout.astro 中,使用 useStore 監聽 $isDark。
    • 當 $isDark 為 true 時,給最外層的 標籤加上 class="dark"。
    • 運用 Tailwind 的 dark: 前綴(例如 dark:bg-slate-900)來測試效果。

下個章節會有實作筆記 👍

留言
avatar-img
李昀瑾的沙龍
0會員
37內容數
李昀瑾的沙龍的其他內容
2026/01/15
🚀 專題一:Tailwind CSS 實戰開始 我們先從最能直接提升成就感的 Tailwind CSS 開始。 1. 安裝 Tailwind 在你的專案目錄執行: npx astro add tailwind (全部選 Yes,這會自動設定 astro.config.mjs 並引入指令
2026/01/15
🚀 專題一:Tailwind CSS 實戰開始 我們先從最能直接提升成就感的 Tailwind CSS 開始。 1. 安裝 Tailwind 在你的專案目錄執行: npx astro add tailwind (全部選 Yes,這會自動設定 astro.config.mjs 並引入指令
2026/01/15
✏️ 1. 利用前一章節建立的 Card.astro 組件。 ① blog.astro 匯入 Card.astro --- import BaseLayout from '../layouts/BaseLayout.astro' import PostsQuote from '../compon
2026/01/15
✏️ 1. 利用前一章節建立的 Card.astro 組件。 ① blog.astro 匯入 Card.astro --- import BaseLayout from '../layouts/BaseLayout.astro' import PostsQuote from '../compon
2026/01/14
只是目錄,看看就好 專題一:視覺美學與 UI 框架 —— Tailwind CSS 整合 專題二:狀態管理與跨組件通訊 —— Nano Stores 專題三:持久化資料存放 —— 整合 Supabase 或 Drizzle ORM
2026/01/14
只是目錄,看看就好 專題一:視覺美學與 UI 框架 —— Tailwind CSS 整合 專題二:狀態管理與跨組件通訊 —— Nano Stores 專題三:持久化資料存放 —— 整合 Supabase 或 Drizzle ORM
看更多
你可能也想看
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
Nuxt.js 是以 Vue 為基底所建構的框架,透過 Nuxt.js,我們能夠更輕鬆地開發靜態頁面 (Static Site)、操作體驗良好的單頁式網站 (SPA)、甚至是顧及 SEO 的伺服器端渲染 (SSR) 網站。
Thumbnail
Nuxt.js 是以 Vue 為基底所建構的框架,透過 Nuxt.js,我們能夠更輕鬆地開發靜態頁面 (Static Site)、操作體驗良好的單頁式網站 (SPA)、甚至是顧及 SEO 的伺服器端渲染 (SSR) 網站。
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News