Puck 是 React 的開源視覺化編輯器,為下一代頁面建立器和無程式碼產品提供支援。在 GitHub 上給我們一顆星! ⭐️
Puck 正在迅速成長,觀看起來真是太棒了! ?來自不同背景的開發人員正在突破這個開源視覺化編輯器的功能界限。但隨著越來越多的人投入 Puck,我們的 Discord 社群中不斷出現一個問題:
「如何在 Puck 中的元件之間傳遞資料或共享狀態?」
換句話說:如何讓一個元件對另一個元件的變化做出反應?例如,您可以建立一個帶有搜尋輸入的 DropZone 元件,以便放置在其中的任何清單都可以讀取其值:
首先,Puck 的內建魔法可能會讓您認為它以獨特的方式處理狀態。但事情是這樣的:Puck 只是 React,您傳遞給它的元件也是如此。 這表示您可以依賴通常用來在元件之間管理和共用資料的任何狀態庫或工具。在這篇文章中,我將簡單地教你如何使用 Context 來解決這個問題。
在我們開始之前:我假設您已經對 Puck 及其工作原理有了基本的了解。如果您是新來的,那也完全沒問題—歡迎您跟隨!但我建議先查看入門指南以熟悉基礎知識
項目設定
為了讓事情變得簡單,我在 GitHub 上準備了一個基本的 React 項目,並預先安裝了 Puck 並準備就緒。透過在終端機中執行以下命令來克隆並安裝它:
git clone https://github.com/FedericoBonel/basic-puck-app cd ./basic-puck-app npm install
已經在處理現有項目?完全沒問題!您可以簡單地使用 NPM 將 Puck 安裝為依賴項:
npm i @measured/puck --save
如果您使用 Next.js 或 Remix 等框架,Puck 會提供官方配方,讓設定過程變得無縫。
對於本教程,我假設您已經克隆了 GitHub 存儲庫以使事情簡單明了。也就是說,這些概念和步驟將適用於任何設定 - 只需根據需要更新檔案名稱以適合您的專案結構。
配置冰球
專案準備就緒後,下一步是設定 Puck。打開 src/App.jsx 檔案並將其內容與以下程式碼交換。這將為 Puck 設定一個用於拖放兩個組件的基本配置:
- 一個向使用者致意的儀表板元件,並包含一個用於嵌套其他元件的 DropZone
- 一個 ArticleList 元件,用於在儀表板中顯示文章列表
git clone https://github.com/FedericoBonel/basic-puck-app cd ./basic-puck-app npm install
太棒了!您的基本設定現已完成。接下來,讓我們深入研究在編輯器中新增共享狀態。
新增上下文
React Context 是解決我們問題的完美解決方案,因為它提供了一種在所有元件(編輯器內部和外部)之間共用和管理資料的簡單方法。它創建了一個您可以在需要時訪問的“全局狀態”,非常適合需要從 Puck 外部提取資料(例如所選主題或登入使用者)或在 Puck 元件之間共享資料的場景。
在本指南中,我將引導您了解 Puck 中 React Context 的兩個常見用例:
-
存取 Puck 外部儲存的資料:我們首先在
之外設定一個包含登入使用者資料的上下文。組件,然後從 Puck 組件存取它。 - 將資料傳遞給巢狀元件:接下來,我們將在儀表板中設定搜尋查詢上下文。這將使我們能夠捕獲用戶的搜尋查詢,將其儲存在上下文中,並將其傳遞給 ArticleList 元件。目標是根據使用者的查詢過濾文章列表,示範如何在父 Puck 元件和子 Puck 元件之間傳遞資料。
第 1 步:定義 Puck 外部的上下文
在 Puck 中設定上下文遵循與任何 React 應用程式相同的模式。您建立一個 Context 提供者來定義和管理您的共用狀態,將其包裝在父元件中,並在應用程式中需要的地方存取或更新狀態。
首先為使用者資料建立一個新的上下文。該上下文將包含使用者物件和更新使用者狀態的函數。
npm i @measured/puck --save
第 2 步:在 Puck 外部建立上下文提供者
接下來,建立一個 UserProvider 元件來包裝您的 Puck 編輯器。該提供者將管理用戶狀態並將其提供給所有孩子。
為了簡潔起見,我使用了一個虛擬使用者和 useState 傳回的 setter 函數。
// App.jsx import { Puck, DropZone } from "@measured/puck"; import "@measured/puck/puck.css"; // The configs for your draggable components // Ideally you would pull these out into their own files const dashboardConfig = { render: () => { return ( <div> <p>Once you’ve updated the file, start the application in development mode, and navigate to http://localhost:5173 to verify everything is working as expected:<br> </p> <pre class="brush:php;toolbar:false">npm run dev
第 3 步:將提供者與 Puck 集成
要將提供者與 Puck 編輯器集成,只需使用 UserProvider 包裝編輯器即可。您可以將 UserProvider 放置在元件樹中編輯器上方的任何位置(例如索引檔案中),並且它會正常運作。完成此操作後,所有編輯器元件都將可以存取上下文!
git clone https://github.com/FedericoBonel/basic-puck-app cd ./basic-puck-app npm install
步驟 4:使用 Puck 元件中的上下文
現在您可以在任何 Puck 元件中存取 UserContext。按照我們的用例範例,讓我們更新儀表板元件,以便它為登入使用者顯示「歡迎回來」訊息,為訪客顯示「通用歡迎」訊息。
npm i @measured/puck --save
第 7 步:使用 Puck 元件中的上下文
現在,我們將讀取放置在上下文提供者中的元件中的上下文。在我們的範例中,我們將使用 ArticleList 元件中的上下文,使用者透過 DropZone 將其嵌套在儀表板中。這允許 ArticleList 回應搜尋查詢中的變更並相應更新。
// App.jsx import { Puck, DropZone } from "@measured/puck"; import "@measured/puck/puck.css"; // The configs for your draggable components // Ideally you would pull these out into their own files const dashboardConfig = { render: () => { return ( <div> <p>Once you’ve updated the file, start the application in development mode, and navigate to http://localhost:5173 to verify everything is working as expected:<br> </p> <pre class="brush:php;toolbar:false">npm run dev
如果您現在進入編輯器,將儀表板組件拖到畫布上,將 ArticleList 放入其中,然後修改 initialQuery 字段,您將看到列表根據查詢動態過濾文章。 ?
您甚至可以透過讓具有不同內容的多個清單元件重複使用相同的查詢上下文來擴充此設定。
?就是這樣!現在,您可以在嵌套的 Puck 元件之間共用狀態。 ?
使用 React Context 的優點和缺點
✅ 優點:
- 提供了一個強大的解決方案,用於在 Puck 內部和外部的組件之間共享狀態
- 與現有的 React 模式和元件無縫整合
- 可以處理複雜的邏輯和狀態
- 零外部依賴,因為 React Context 隨 React 一起提供
❌缺點:
- 如果經常更新大型元件樹頂部的狀態,效能可能會下降,因為每個訂閱者都需要重新渲染
- 管理多個上下文提供者時,事情可能會變得更難除錯
更進一步
根據編輯器的複雜程度,您可以透過多種方法來改善 Puck 中共享狀態的管理:
- 最佳化上下文使用 -如果您發現效能問題或不必要的重新渲染,請考慮將上下文拆分為更小、更集中的上下文。這允許元件僅訂閱它們需要的狀態部分,從而最大限度地減少重新渲染。
- 合併狀態庫 -如果您有多個共享狀態和更複雜的邏輯,您可以超越 React Context 並使用您最喜歡的狀態庫。無論是 Redux、Zustand 還是您的專案已在使用的其他程式庫,這些都可以簡化複雜狀態的管理並提高渲染效能。
- 利用伺服器端狀態 -如果您的應用程式嚴重依賴從伺服器取得的數據,請考慮使用 TanStack Query 或 SWR 等函式庫。這些程式庫為您管理快取、重新取得和同步,從而減少對複雜的共用用戶端狀態的需求。
輪到您與 Puck 一起打造更聰明的產品了嗎?
將 Puck 中的共享狀態管理提升到一個新的水平,為構建動態、反應式頁面構建器打開了一個充滿可能性的世界。我很高興看到您將使用這些策略建立獨特而強大的應用程式。
所以,如果這篇文章激勵了您建立一些東西,您對 Puck 有疑問或您想做出貢獻,那麼您可以透過以下方式參與其中:
- ? GitHub 上的 Star Puck 以表達您的支持並激勵其他人探索。
- ?加入我們的 Discord 社群 進行聯繫、學習和協作。
- ?在 X 和 Bluesky 上關注我們,以了解先睹為快、更新內容和提示。
- ?探索文件以獲取增強您的構建的高級技術。
Puck 的未來以及無程式碼創新都掌握在您的手中。從今天開始構建,讓我們一起重新定義一切可能! ?
以上是在 Puck 中管理應用程式狀態的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3漢化版
中文版,非常好用

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)