”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Pulsy 自述文件已更新

Pulsy 自述文件已更新

发布于2024-11-08
浏览:688

Pulsy Readme updated

Pulsy - React 的轻量级状态管理库

Pulsy 是一个轻量级、灵活且易于使用的 React 状态管理库,提供持久性、中间件、记忆、计算和组合存储、时间旅行和 DevTools 集成等功能。它可以帮助您有效地管理 React 应用程序中的全局状态,而无需不必要的复杂性。

特征

  • 全局状态管理:使用简单的存储 API 管理跨组件的状态。
  • 持久化:自动将存储数据持久化到localStorage或自定义存储解决方案中。
  • 中间件:通过中间件功能修改和处理商店更新。
  • 记忆化:通过使用记忆状态值避免不必要的渲染。
  • 计算存储:从现有存储中导出并计算状态。
  • 可组合存储:将多个存储合并为一个存储以进行模块化状态管理。
  • 时间旅行:快退和快进状态变化。
  • DevTools Integration:在开发模式下跟踪和调试状态更新。

安装


npm install pulsy
# or
yarn add pulsy



基本用法

第 1 步:配置 Pulsy

Pulsy 可以进行全局配置,以启用 DevTools、默认记忆、持久性和用于商店创建和更新的回调挂钩。


import { configurePulsy } from 'pulsy';

configurePulsy({
  enableDevTools: process.env.NODE_ENV === 'development',
  persist: true, // Globally enable persistence by default
  defaultMemoize: true, // Enable memoization for all stores by default
  onStoreCreate: (name, initialValue) => console.log(`Store "${name}" created! Initial value:`, initialValue),
  onStoreUpdate: (name, newValue) => console.log(`Store "${name}" updated! New value:`, newValue),
});


第 2 步:创建商店

要创建商店,请使用 createStore 函数。存储保存全局状态,可以在 React 应用程序中的任何位置使用。


import { createStore } from 'pulsy';

// Create a store named 'counter' with an initial value of 0
createStore('counter', 0);


第 3 步:在组件中使用 Store

Pulsy 提供了 usePulsy 钩子来访问和更新 React 组件中的 store 的值。让我们创建一个计数器组件:


import usePulsy from 'pulsy';

function CounterComponent() {
  const [count, setCount] = usePulsy('counter');

  const increment = () => setCount((prev) => prev   1);

  return (
    

Current Count: {count}

); } export default CounterComponent;

坚持

Pulsy 可以轻松地将存储值保存在 localStorage 或任何其他自定义存储系统中。只需在创建商店时传递 persist 选项即可。


createStore('counter', 0, { persist: true });


计数器存储的值现在将在页面重新加载时保持不变。

示例:使用自定义存储

您还可以配置 Pulsy 使用自定义存储,例如 sessionStorage 或任何其他实现 Storage 接口的存储引擎:


createStore('sessionCounter', 0, {
  persist: {
    storage: sessionStorage, // Use sessionStorage instead of localStorage
    serialize: (value) => JSON.stringify(value),
    deserialize: (value) => JSON.parse(value),
  },
});


这会将 sessionCounter 存储在 sessionStorage 中。


中间件

中间件允许您在提交存储更新之前拦截和修改它们。您可以在创建商店时添加中间件,或者稍后使用 addMiddleware.


const loggingMiddleware = (nextValue, prevValue, storeName) => {
  console.log(`[${storeName}] changed from ${prevValue} to ${nextValue}`);
  return nextValue;
};

createStore('counter', 0, { middleware: [loggingMiddleware] });


在此示例中,中间件记录计数器存储中的每个状态更改。

示例:异步中间件

Pulsy 支持异步中间件来处理 API 调用等异步任务:


const asyncMiddleware = async (nextValue, prevValue, storeName) => {
  console.log(`Fetching data before updating ${storeName}...`);
  const data = await fetch('https://api.example.com/data').then((res) => res.json());
  return nextValue   data.amount;
};

createStore('counter', 0, { middleware: [asyncMiddleware] });


在此示例中,中间件在更新存储之前从 API 获取一些数据。


时间旅行状态管理

Pulsy 允许您使用 useTimeTravel 挂钩管理状态历史记录,使您能够撤消和重做状态更改。


import { useTimeTravel } from 'pulsy';

function TimeTravelCounter() {
  const [count, setCount, undo, redo] = useTimeTravel('counter');

  return (
    

Count: {count}

); }

示例:显示状态历史记录

您可以使用useTimeTravel提供的historyRef访问状态更改的完整历史记录:


function HistoryCounter() {
  const [count, setCount, undo, redo, history] = useTimeTravel('counter');

  return (
    

Count: {count}

History: {history.join(', ')}

); }

计算存储

计算存储从其他存储中获取其状态。 Pulsy 允许您创建其值基于一个或多个其他商店的商店。


import { createComputedStore } from 'pulsy';

createComputedStore('doubleCounter', () => {
  const counter = getStoreValue('counter');
  return counter * 2;
}, ['counter']);


这里,只要计数器存储发生变化,doubleCounter就会自动更新。

示例:显示组件中的计算存储

您现在可以像访问常规商店一样访问计算存储:


function DoubleCounterComponent() {
  const [doubleCount] = usePulsy('doubleCounter');

  return (
    

Double Counter: {doubleCount}

); }

组合商店

Pulsy 支持将多个商店合并为一个商店。这对于通过将相关状态片段分组在一起来管理复杂状态特别有用。


import { composeStores } from 'pulsy';

const [getComposedStore, setComposedStore] = composeStores('userProfile', {
  username: 'userNameStore',
  age: 'ageStore',
});

const UserProfileComponent = () => {
  const userProfile = getComposedStore();

  return (
    

Username: {userProfile.username}

Age: {userProfile.age}

); };

示例:更新组合存储

您还可以使用 setCompositedStore 函数更新组合存储的特定部分:


setComposedStore({
  username: 'newUsername',
});



命名空间存储

Pulsy 允许您创建命名空间存储,以保持相关存储的组织性并避免大型应用程序中的命名冲突。


import { createNamespacedStore } from 'pulsy';

// Create a namespaced store for user-related data
const useUserStore = createNamespacedStore('user');

function UserComponent() {
  const [username, setUsername] = useUserStore('username');

  return (
    

Username: {username}

); }

这里,所有与用户相关的存储(例如,user:username、user:age)都分组在用户命名空间下。


开发工具集成

Pulsy 与浏览器 DevTools 集成,以帮助跟踪和调试商店更新。启用 DevTools 后,您将在控制台中看到有关商店更新、状态更改和性能测量的日志。


configurePulsy({
  enableDevTools: true, // Logs detailed store activity to the console
});


Pulsy 记录有用的信息,例如何时创建或更新商店、中间件执行以及开发模式下的时间旅行操作。


完整示例:使用持久性和中间件管理用户配置文件

让我们将多个 Pulsy 功能组合到一个示例中。


import { createStore, usePulsy, configurePulsy } from 'pulsy';

// Global configuration
configurePulsy({
  enableDevTools: true,
  persist: true,
});

// Middleware to log store updates
const loggingMiddleware = (nextValue, prevValue, storeName) => {
  console.log(`Store ${storeName}

 updated from ${prevValue} to ${nextValue}`);
  return nextValue;
};

// Create a store for user profile
createStore('userProfile', {
  username: 'guest',
  age: 25,
}, { middleware: [loggingMiddleware], persist: true });

// Component to manage user profile
function UserProfileComponent() {
  const [userProfile, setUserProfile] = usePulsy('userProfile');

  const updateUsername = () => {
    setUserProfile((prevProfile) => ({
      ...prevProfile,
      username: 'newUsername',
    }));
  };

  return (
    

Username: {userProfile.username}

Age: {userProfile.age}

); } export default UserProfileComponent;

在此示例中,userProfile 存储由中间件持久保存、记录,并可通过 usePulsy 挂钩访问。 UserProfileComponent 在简单的 UI 中显示和更新商店。


结论

Pulsy 是一个强大且灵活的 React 状态管理库,为持久性、中间件、计算存储、时间旅行和 DevTools 提供开箱即用的支持。其简单的 API 和广泛的功能使其适用于小型和大型应用程序。

版本声明 本文转载于:https://dev.to/ng_dream_3e53e6a868268e4d/pulsy-readme-updated-15l6?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在 Galera 集群节点上设置 MariaDB/MySQL Exporter 以进行 Prometheus 监控
    如何在 Galera 集群节点上设置 MariaDB/MySQL Exporter 以进行 Prometheus 监控
    社区开发者您好! ? 在这篇文章中,我将引导您完成在 Galera Cluster 节点上设置 MariaDB/MySQL Exporter 以使用 Prometheus 进行监控所采取的步骤。就我而言,我在具有三个节点的云服务器提供商上运行 MariaDB Galera Cluster,并使用 P...
    编程 发布于2024-11-08
  • 演示疼痛
    演示疼痛
    我想讲述一件每次我需要做的事情时都困扰我的事情。它正在准备演示。一般来说,当我尝试使用 Viktor Lidholt 的 slick_slides 来准备演示文稿时,我会在 PowerPoint 中准备演示文稿。  如何放置不同大小的图像,如何选择字体,使用什么颜色,如何放置代码,如何突出显示它,所...
    编程 发布于2024-11-08
  • 请求 Iris 的正文限制中间件
    请求 Iris 的正文限制中间件
    概述 Iris Body Limit 中间件是一个强大的工具,用于控制 Iris Web 应用程序中传入请求正文的大小。通过设置请求正文的大小限制,您可以防止客户端发送过大的负载,否则可能会压垮您的服务器或导致拒绝服务 (DoS) 攻击。此中间件对于处理文件上传、JSON 有效负载...
    编程 发布于2024-11-08
  • 如何在 cookie 中存储 PHP 数组以及安全性和序列化的最佳实践是什么?
    如何在 cookie 中存储 PHP 数组以及安全性和序列化的最佳实践是什么?
    在 Cookie 中存储 PHP 数组在 PHP 中,可以将数组存储在 Cookie 中,以便在后续请求时轻松检索。然而,考虑安全隐患并使用正确的序列化技术至关重要。序列化选项要将数组转换为 cookie 兼容格式,您可以选择以下方法:JSONsetcookie('your_cookie_name'...
    编程 发布于2024-11-08
  • 如何设置VS Code调试工作目录?
    如何设置VS Code调试工作目录?
    设置 VS Code 中调试的工作目录在 Visual Studio Code (VS Code) 中调试 Python 程序时,它通常很有用指定脚本应在其中运行的工作目录。这允许您使用与代码所在的特定目录相关的文件和资源。要将工作目录动态设置为当前打开的 Python 文件的目录,请修改 laun...
    编程 发布于2024-11-08
  • 婴儿学步学习 Laravel
    婴儿学步学习 Laravel
    欢迎回来,开发者! ✨ 在 Laravel 之旅的这一章中(请记住,我在撰写这些文章时正在学习,因此这将是您能找到的最现实的教程系列之一!),我们将深入研究我们的 Laravel 项目。我们将探索项目结构,熟悉迁移,并以最简单的方式分解 MVC 架构。 ?今天的议程...
    编程 发布于2024-11-08
  • 如何动态包含具有不受控制的“document.write()”内容的脚本?
    如何动态包含具有不受控制的“document.write()”内容的脚本?
    动态添加具有不受控制的源内容的脚本标记当内容来自于控件外部时,创建具有外部源的脚本标记可能会带来挑战包括使用 document.write() 的代码。如前所述,仅在 中附加 script 标记无法支持此类内容。要解决此问题,请考虑以下解决方案:使用 document.create 新建一个 sc...
    编程 发布于2024-11-08
  • 在 JavaScript 中如何有效地确定一个数字是否为素数?
    在 JavaScript 中如何有效地确定一个数字是否为素数?
    在 JavaScript 中高效验证素数在计算机编程中,确定给定数字是否是素数是一项基本任务。素数是大于 1 的正整数,除了 1 和它本身之外没有正因数。检查素数的一种流行方法涉及埃拉托斯特尼筛法。然而,出于性能考虑,可以采用更有效的方法,如以下 JavaScript 实现所示:let inputV...
    编程 发布于2024-11-08
  • 为什么 Lambda 表达式需要最终局部变量而不是实例变量?
    为什么 Lambda 表达式需要最终局部变量而不是实例变量?
    Lambda 表达式和变量作用域:为什么 Local ≠ Instance在 Java 中使用 lambda 表达式时,一个常见的困惑点是为什么局部变量需要终结,而实例变量需要终结不要。本文旨在阐明这种区别背后的根本原因。局部变量:最终性命令在 lambda 表达式中,局部变量必须标记为 Final...
    编程 发布于2024-11-08
  • CKA 全程课程日 为什么使用 Kubernetes?
    CKA 全程课程日 为什么使用 Kubernetes?
    那么,您可能已经使用 Docker 容器有一段时间了,对吧?我知道旋转第一个容器的兴奋感就像魔法一样,但随后现实袭来。您开始注意到大规模管理容器很快就会成为物流噩梦。就在那时,Kubernetes(K8s)像经验丰富的项目经理一样进入房间,准备接管并简化一切。 在这篇文章中,我们将探讨独立容器面临的...
    编程 发布于2024-11-08
  • 简要封装示例
    简要封装示例
    书包: 该示例创建一个名为 bookpack 的包,其中包含一个用于管理书籍数据库的简单类。 图书类别: 它有私有属性 title、author 和 pubDate(标题、作者和出版日期)。 构造方法初始化属性。 show() 方法显示书籍详细信息。 BookDemo类: 创建一个包含 5 个 Bo...
    编程 发布于2024-11-08
  • 适用于 AWS 云的简单 SaaS 的技术堆栈
    适用于 AWS 云的简单 SaaS 的技术堆栈
    介绍 注1:这里是托管的交互式演示:demo.saasconstruct.com 注 2:我每个 SaaS 设置的每月账单为 3-5 美元,其中大部分是 CI/CD 成本。 注3:模板在这里:saasconstruct.com。 我在 AWS 上完成了多个 AI PoC 和 MVP...
    编程 发布于2024-11-08
  • 为什么在事件处理程序中使用箭头函数时“this”会出现意外行为?
    为什么在事件处理程序中使用箭头函数时“this”会出现意外行为?
    JavaScript - 箭头函数和事件处理程序当使用箭头函数作为事件处理程序的回调时,函数中的 this 值是意外的。这篇博文解释了此行为背后的原因,并提供了使用 event.currentTarget.箭头函数和词法作用域访问预期元素的解决方案与常规函数不同,箭头函数没有其自己的上下文或范围。相...
    编程 发布于2024-11-08
  • Aurora PostgreSQL 掌握:让您的团队喜极而泣的防弹 Java 模型和 DAO
    Aurora PostgreSQL 掌握:让您的团队喜极而泣的防弹 Java 模型和 DAO
    听着,代码骑师。我即将提供一些知识,帮助您将 Aurora PostgreSQL 游戏从业余游戏转变为大联盟游戏。我们谈论的是 Java 模型和数据库访问器,它们会让您的高级开发人员喜极而泣,而您的 DBA 是否会给您买啤酒(取决于您的年龄)。 为什么这很重要: 性能:草率的模型和 ...
    编程 发布于2024-11-08
  • 理解后端开发中的责任链设计模式
    理解后端开发中的责任链设计模式
    责任链 (CoR) 设计模式是一种强大的行为模式,可以显着增强后端开发。此模式允许您通过处理程序链传递请求,其中每个处理程序可以处理请求或将其传递到下一个处理程序。在本博客中,我们将从后端角度探讨 CoR 模式,特别关注其在 Web 服务中的请求验证和处理中的应用,并使用 Java 作为示例。 ...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3