Astro 「群島架構」Nano Stores 繼續學習 - 3

更新 發佈閱讀 7 分鐘

第三題:跨框架同步(React 與 Vue 的對話)

這是 Nano Stores 最強大的地方。假設你有一個專案,因為歷史原因或團隊偏好,同時使用了 React 和 Vue。


練習目標

  1. 建立一個 React 的輸入框(Input)。
  2. 建立一個 Vue 的預覽文字(Preview)。
  3. 當 React 框輸入文字時,Vue 的文字即時改變。

1. 建立 Store (src/textStore.ts)

import { atom } from 'nanostores'

export const $sharedText = atom('Hello Nano!')

2. React 元件 (src/components/ReactInput.tsx)

在 React 中,我們使用 @nanostores/react 提供的 useStore 鉤子。

import { useStore } from '@nanostores/react'
import { $sharedText } from '../textStore'

export default function ReactInput() {
const text = useStore($sharedText)

return (
<div className="p-4 border-2 border-blue-500">
<h3>React 元件</h3>
<input
type="text"
value={text}
onChange={(e) => $sharedText.set(e.target.value)}
className="text-black p-1"
/>
</div>
)
}

3. Vue 元件 (src/components/VuePreview.vue)

在 Vue 中,我們使用 @nanostores/vue 提供的 useStore

① 安裝

npm install @nanostores/vue

② 使用

<script setup>
import { useStore } from '@nanostores/vue'
import { $sharedText } from '../textStore'

// vue 的 useStore 會回傳一個 Ref
const text = useStore($sharedText)
</script>

<template>
<div class="p-4 border-2 border-green-500">
<h3>Vue 元件</h3>
<p>即時預覽:{{ text }}</p>
</div>
</template>

❌ 可能會遇到這個錯誤

Failed to parse source for import analysis because the content contains invalid JS syntax. Install @vitejs/plugin-vue to handle .vue files.

這個錯誤訊息非常明確:你的 Astro 專案目前看不懂 .vue 檔案

雖然你安裝了 @nanostores/vue,但那只是讓 Vue 能與 Store 溝通的工具。你還需要安裝 Astro 的 Vue 整合套件,讓 Astro 具備編譯 Vue 組件的能力。

解決方法:安裝 Astro Vue 整合
請在終端機執行這行自動化指令:

npx astro add vue

這個指令會幫你做三件事:

  1. 安裝 @astrojs/vue
  2. 安裝 vue 核心庫。
  3. 自動修改 astro.config.mjs,把 vue() 加入到 integrations 陣列中。

手動檢查 astro.config.mjs
執行完指令後,你的設定檔應該會長這樣:

import { defineConfig } from 'astro/config'
import vue from '@astrojs/vue' // 確保有這行
import tailwindcss from '@tailwindcss/vite'

export default defineConfig({
integrations: [
vue(), // 確保有這行
],
vite: {
plugins: [tailwindcss()],
},
})

為什麼會報錯?

Astro 本身是一個靜態網站生成器,它預設只支援 .astro 檔案。如果你想在裡面放 Vue、React 或 Svelte,你必須告訴 Astro 的底層編譯器(Vite)如何處理這些特殊副檔名。

你遇到的 Failed to parse source 錯誤,就是因為 Vite 試圖把你的 .vue 檔當成普通 JavaScript 來讀取,結果被 <template> 標籤卡住了。

💡 程式碼檢查:關於 useStore 的小提醒

有一點要特別注意:

  • $sharedText 是一個 atom(例如 atom('hello')),useStore($sharedText) 會回傳一個 Vue 的 Ref
    在 <template> 中,你直接用 {{ text }} 是對的,Vue 會自動解包。
  • 但在 <script setup> 中,如果你要讀取它的值,記得要加 .value
    console.log(text.value) // 在 script 中要加 .value

4. 在 Astro 中併用

---
import ReactInput from '../components/ReactInput.jsx';
import VuePreview from '../components/VuePreview.vue';
---

<div class="grid gap-8">
<ReactInput client:load />
<VuePreview client:load />
</div>
留言
avatar-img
李昀瑾的沙龍
0會員
32內容數
李昀瑾的沙龍的其他內容
2026/01/27
第二題:深色模式(Dark Mode) 深色模式(Dark Mode) 的核心在於如何讓狀態「持久化」(即使重新整理網頁,設定也不會消失),以及如何與系統或手動設定同步。 在 Nano Stores 中,我們可以使用原生提供的 persistent 擴充功能,這能讓我們省去手寫 localSto
2026/01/27
第二題:深色模式(Dark Mode) 深色模式(Dark Mode) 的核心在於如何讓狀態「持久化」(即使重新整理網頁,設定也不會消失),以及如何與系統或手動設定同步。 在 Nano Stores 中,我們可以使用原生提供的 persistent 擴充功能,這能讓我們省去手寫 localSto
2026/01/25
第一題:「購物車」系統 這個練習的重點在於學習如何使用 map 來處理物件型態的狀態,以及如何在多個元件之間同步這些數據。 練習目標 建立一個商品清單,點擊「加入」按鈕時更新購物車。 若商品已在購物車,數量 +1+1;若不在,則新增一筆。 即時顯示購物車內的商品總數。 第一步:建立
2026/01/25
第一題:「購物車」系統 這個練習的重點在於學習如何使用 map 來處理物件型態的狀態,以及如何在多個元件之間同步這些數據。 練習目標 建立一個商品清單,點擊「加入」按鈕時更新購物車。 若商品已在購物車,數量 +1+1;若不在,則新增一筆。 即時顯示購物車內的商品總數。 第一步:建立
2026/01/23
✏️ 專題二實作 1. 建立 Store (src/store/themeStore.ts) import { atom } from 'nanostores' // 預設為 false (淺色模式) export const $isDark = atom(false) 2. 建立切換按鈕
Thumbnail
2026/01/23
✏️ 專題二實作 1. 建立 Store (src/store/themeStore.ts) import { atom } from 'nanostores' // 預設為 false (淺色模式) export const $isDark = atom(false) 2. 建立切換按鈕
Thumbnail
看更多
你可能也想看
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
Thumbnail
這是一場從「網路連結 → 線下見面」的活動,我一開始其實有些猶豫,畢竟地點對我來說不近,加上平常在社群裡其實不太主動互動。 但因為主辦人西打誠意滿滿地邀請,甚至還提出補貼車資,最後我決定自費參加。現在回頭看,真的很值得! 場地很有感,氛圍超溫暖 一踏進場地就被暖黃的燈光包圍,小閣樓超舒適,還
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
從實際應用中學習 Python 程式設計,提升技能並建立作品集。文章提供八個循序漸進的 Python 專案範例,涵蓋檔案操作、網路爬蟲、Web 應用、自動化腳本、數據分析、遊戲開發、API 互動及應用程式部署,並附上實戰建議及學習資源。
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
Thumbnail
網站開發專案成功的關鍵在於與客戶的有效溝通。本文分享一個成功案例,說明如何透過明確掌握專案需求、主動提供技術方案、定期回報進度、完善技術協助及建立良好客戶關係,順利完成一個中文影片學習分享網站的建置,並獲得客戶高度滿意與後續合作機會。
Thumbnail
C通常一部電影 網路影集 小說 漫畫 電玩 在最後一集或最後結局 可以把感動觀眾到哭的 結局劇情 可能有哪幾種劇情? 幸福課程 幸福教練黃老師 潮資訊媒體 社群編輯 在影視作品和文學作品的最後一集或結局, 有一些常見的劇情元素和情感觸發方式, 可以感動觀眾並引起哭泣
Thumbnail
C通常一部電影 網路影集 小說 漫畫 電玩 在最後一集或最後結局 可以把感動觀眾到哭的 結局劇情 可能有哪幾種劇情? 幸福課程 幸福教練黃老師 潮資訊媒體 社群編輯 在影視作品和文學作品的最後一集或結局, 有一些常見的劇情元素和情感觸發方式, 可以感動觀眾並引起哭泣
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News