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

Pulsy 自述文件已更新

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

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]删除
最新教程 更多>
  • 如何在php中使用卷发发送原始帖子请求?
    如何在php中使用卷发发送原始帖子请求?
    如何使用php 创建请求来发送原始帖子请求,开始使用curl_init()开始初始化curl session。然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头...
    编程 发布于2025-04-07
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-04-07
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-04-07
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-04-07
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    class'ziparchive'在Linux Server上安装Archive_zip时找不到错误 commant in lin ins in cland ins in lin.11 on a lin.1 in a lin.11错误:致命错误:在... cass中找不到类z...
    编程 发布于2025-04-07
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题: 考虑一个布局,其中我们具有可滚动的映射div,该图像div与用户的垂直滚动一起移动,同时维持固定的固定sidebar。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。 映射{} 因此。我们不使用jQuery的“ .aim...
    编程 发布于2025-04-07
  • 如何在Java中执行命令提示命令,包括目录更改,包括目录更改?
    如何在Java中执行命令提示命令,包括目录更改,包括目录更改?
    在java 通过Java通过Java运行命令命令可能很具有挑战性。尽管您可能会找到打开命令提示符的代码段,但他们通常缺乏更改目录并执行其他命令的能力。 solution:使用Java使用Java,使用processBuilder。这种方法允许您:启动一个过程,然后将其标准错误重定向到其标准输出。...
    编程 发布于2025-04-07
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-04-07
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-04-07
  • 哪种在JavaScript中声明多个变量的方法更可维护?
    哪种在JavaScript中声明多个变量的方法更可维护?
    在JavaScript中声明多个变量:探索两个方法在JavaScript中,开发人员经常遇到需要声明多个变量的需要。对此的两种常见方法是:在单独的行上声明每个变量: 当涉及性能时,这两种方法本质上都是等效的。但是,可维护性可能会有所不同。 第一个方法被认为更易于维护。每个声明都是其自己的语句,使其...
    编程 发布于2025-04-07
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-04-07
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-04-07
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-04-07
  • 如何处理PHP文件系统功能中的UTF-8文件名?
    如何处理PHP文件系统功能中的UTF-8文件名?
    在PHP的Filesystem functions中处理UTF-8 FileNames 在使用PHP的MKDIR函数中含有UTF-8字符的文件很多flusf-8字符时,您可能会在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    编程 发布于2025-04-07

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

Copyright© 2022 湘ICP备2022001581号-3