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會員
32內容數
李昀瑾的沙龍的其他內容
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
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
Thumbnail
Nuxt.js 是以 Vue 為基底所建構的框架,透過 Nuxt.js,我們能夠更輕鬆地開發靜態頁面 (Static Site)、操作體驗良好的單頁式網站 (SPA)、甚至是顧及 SEO 的伺服器端渲染 (SSR) 網站。
Thumbnail
Nuxt.js 是以 Vue 為基底所建構的框架,透過 Nuxt.js,我們能夠更輕鬆地開發靜態頁面 (Static Site)、操作體驗良好的單頁式網站 (SPA)、甚至是顧及 SEO 的伺服器端渲染 (SSR) 網站。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News