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 設定一個用於拖放兩個組件的基本配置:
git clone https://github.com/FedericoBonel/basic-puck-app cd ./basic-puck-app npm install
太棒了!您的基本設定現已完成。接下來,讓我們深入研究在編輯器中新增共享狀態。
React Context 是解決我們問題的完美解決方案,因為它提供了一種在所有元件(編輯器內部和外部)之間共用和管理資料的簡單方法。它創建了一個您可以在需要時訪問的“全局狀態”,非常適合需要從 Puck 外部提取資料(例如所選主題或登入使用者)或在 Puck 元件之間共享資料的場景。
在本指南中,我將引導您了解 Puck 中 React Context 的兩個常見用例:
在 Puck 中設定上下文遵循與任何 React 應用程式相同的模式。您建立一個 Context 提供者來定義和管理您的共用狀態,將其包裝在父元件中,並在應用程式中需要的地方存取或更新狀態。
首先為使用者資料建立一個新的上下文。該上下文將包含使用者物件和更新使用者狀態的函數。
npm i @measured/puck --save
接下來,建立一個 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
要將提供者與 Puck 編輯器集成,只需使用 UserProvider 包裝編輯器即可。您可以將 UserProvider 放置在元件樹中編輯器上方的任何位置(例如索引檔案中),並且它會正常運作。完成此操作後,所有編輯器元件都將可以存取上下文!
git clone https://github.com/FedericoBonel/basic-puck-app cd ./basic-puck-app npm install
現在您可以在任何 Puck 元件中存取 UserContext。按照我們的用例範例,讓我們更新儀表板元件,以便它為登入使用者顯示「歡迎回來」訊息,為訪客顯示「通用歡迎」訊息。
npm i @measured/puck --save
現在,我們將讀取放置在上下文提供者中的元件中的上下文。在我們的範例中,我們將使用 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 元件之間共用狀態。 ?
✅ 優點:
❌缺點:
根據編輯器的複雜程度,您可以透過多種方法來改善 Puck 中共享狀態的管理:
將 Puck 中的共享狀態管理提升到一個新的水平,為構建動態、反應式頁面構建器打開了一個充滿可能性的世界。我很高興看到您將使用這些策略建立獨特而強大的應用程式。
所以,如果這篇文章激勵了您建立一些東西,您對 Puck 有疑問或您想做出貢獻,那麼您可以透過以下方式參與其中:
Puck 的未來以及無程式碼創新都掌握在您的手中。從今天開始構建,讓我們一起重新定義一切可能! ?
以上是在 Puck 中管理應用程式狀態的詳細內容。更多資訊請關注PHP中文網其他相關文章!