在 Puck 中管理应用程序状态
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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

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

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。
