react获取全局_使用react hooks实现的简单全局状态管理

注意,此代码存储库已被弃用,不会再更新维护了.

Note that this code repository has been deprecated and will not be updated and maintained.

react-simple-global-state-store-hook

基于react hooks 和EventTarget 实现的极简全局状态管理 库

,可以跨组件共享全局状态,拥有高性能

就像使用 useState 一样使用全局状态,非常简洁

使用简单,可能是使用方法最简单的全局状态管理工具!

使用步骤只有两步,初始化全局状态,组件状态与全局状态双向绑定

跟其他全局状态管理工具相比,使用这个库对于原有的代码不需要太多的修改

只管理状态仓库,修改全局状态的方法返回给组件内部调用,

就跟使用useState一样简单!

希望世上再无 难用的全局状态管理

跟 redux 对比,极为简洁!抛弃 redux!

基于 react hooks和EventTarget 实现

可以在任何组件中使用全局状态,所有组件最外层不需要包裹context.provider

redux主要由store,action,reducer等等组成,过于庞大负杂,繁琐,组件太多无用的刷新,性能低下

组件状态与全局状态双向绑定

组件状态改变时全局状态改变

全局状态改变时组件状态改变

高性能 ,减少无用的组件刷新

不使用 React.createContext

不使用context刷新组件,而是使用setstate只刷新单个组件

如果使用context会导致大量组件的无用刷新

仅仅使用 几十 行代码写成的极简 react 全局状态管理库!

演示网址

局部安装

cnpm install --save https://github.com/masx200/react-simple-global-state-store-hook.git

或者

yarn add https://github.com/masx200/react-simple-global-state-store-hook.git

用法

API

import {

changeState,

useGlobalStore,

initGlobalState,

getGlobalStates,

} from "@masx200/react-simple-global-state-store-hook";

函数changeState用来改变全局状态,并且通知所有订阅状态的组件更新状态

第一个参数是全局状态名,第二个参数是更新的状态值,或者函数返回新状态值

函数getGlobalStates用来读取全局状态中的某一个值

函数initGlobalState用来生成状态初始值,可以多次使用

参数为一个object,键名为全局状态名,键值为全局状态初始值

函数useGlobalStore用来订阅全局状态,组件状态与全局状态双向绑定

第一个参数为一个string, 为全局状态名

返回值是个Array,返回一个有状态值,以及一个更新它的函数

基础语法

只能在 react 的函数式组件中使用!

以下示例使用了es6的解构赋值方法

就跟使用useState一样简单!

import React, { useState } from "react";

const [count, setCount] = useState(0);

使用react-simple-global-state-store-hook

import {

useGlobalStore,

initGlobalState,

} from "@masx200/react-simple-global-state-store-hook";

initGlobalState({

testnumber: "初始值数字",

全局状态testname: "初始值名字",

});

function component() {

const [count, setCount] = useGlobalStore("全局状态testname");

return

{count}
;

}

例如

要生成全局状态 testnumber ,初始值为 88888785461111111

import {

changeState,

useGlobalStore,

initGlobalState,

} from "@masx200/react-simple-global-state-store-hook";

initGlobalState({

testnumber: 88,

});

//全局状态 testnumber 生成 ,初始值为 88

import React from "react";

function increment() {

changeState("testnumber", (a) => a + 1);

}

function random() {

changeState("testnumber", Math.random());

}

function Htest() {

const [number, setnumber] = useGlobalStore("testnumber");

//全局状态 testnumber 已经 生成 ,不会重复生成初始值

return (

onClick={() => {

random();

}}

>

number:

{number}

onClick={() => {

increment();

// setnumber(number + 1);

/*修改全局状态 testnumber,其他使用了全局状态number的组件也会刷新数据*/

}}

>

修改number

);

}

import { render } from "react-dom";

render(, document.getElementById("root"));

为什么要写这个状态管理工具?

因为

现有的 redux,mobx,vuex 等等管理工具使用太过繁琐,

不喜欢那些使用特别麻烦的状态管理工具

这个状态管理工具可能是学习成本和使用成本最低的

状态双向绑定使用非常简单

原理介绍

使用事件发布者订阅者模式

内部使用了 react hooks 中的 useState 和 useEffect

使用了通过在EventTarget上触发事件和接收事件的方式,来通知组件刷新,一个事件触发对应多个事件监听

把事件名称设置为状态名称,确保了一个全局状态的改变只会刷新使用这个状态的变量,不刷新其他变量,减少性能损耗

给每个要全局状态管理的变量,设置事件状态名称监听器 ,接收到事件后,把变量新的值从内部变量reactsimpleglobalstatestore中取出,然后执行setstate,通知组件刷新

当有全局变量改变时,把变量新的值存入内部变量reactsimpleglobalstatestore中,触发事件状态名称,

如果多个组件使用同一个全局状态,则改变一个状态,这些组件就会同步数据,组件刷新

如果一个全局状态在多个组件中被多次初始化,则只有第一次初始化的值存在全局状态中

当组件被卸载时,清除事件监听器,防止内存泄漏

当组件挂载之后,会自动同步全局状态

由于事件监听函数是异步执行,所以组件状态刷新也是异步执行的

React

React 是一个用于构建用户界面的 JavaScript 库。

React Hooks

Hook 是 React 16.8 中的新增功能。它们允许您在不编写类的情况下使用状态和其他 React 功能。

EventTarget

EventTarget 是一个由可以接收事件的对象实现的接口,并且可以为它们创建侦听器

在 IE 浏览器和Edge中使用需要添加 EventTarget 的 polyfill 和 Event 构造函数 polyfill

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

职业规划测试软件,生涯规划常用测试工具

原标题:生涯规划常用测试工具认识自己测试生涯规划关于生涯规划的几个测试上周我们说到中学生很有必要进行生涯规划,在进行生涯规划前,我们需要对自己有一个更清晰、更全面的认识,随着心理学的发展,很多认识自我的测试…

使用SoapUI调用不同的安全WCF SOAP服务-基本身份验证,第一部分

在这个分为三部分的系列中,我将演示如何使用SoapUI API工具来调用安全的WCF SOAP服务。 第一篇文章将着重于创建将要测试的系统的服务。 第二篇文章将介绍在基本身份验证机制保护的情况下调用它所需的步骤。 在最后一部分中,我将对初始服务稍作更改&…

计算机动画分为关键帧动画和,一个最简单的动画最少有几个关键帧

大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。一个最简单的动画至少有两个关键帧,两个关键帧中必须是元件,而且必须是同一个元件。要创建使组合体或文字发生颜色渐变的动画,必须先将它们转换为…

python+robotframework_python+robot framework接口自动化测试

转载:http://www.cnblogs.com/nzg-noway/p/6651957.htmlpythonrequests实现接口的请求前篇已经介绍,还有不懂或者疑问的可以访问目前我们需要考虑的是如何实现关键字驱动实现接口自动化输出,通过关键字的封装实现一定意义上的脚本与用例的脱离…

自动装箱和拆箱_自动装箱

自动装箱和拆箱自Java 1.5以来,所有Java开发人员都可以使用自动装箱功能。嗯,我可能太乐观了。 至少所有开发人员都应该可以使用自动装箱。 毕竟,在ORACLE页面上有一个很好的教程。 自动装箱是指Java编译器在需要时自动从原始类型创建用于创…

计算机网络标准体系,计算机网络标准体系结构实验报告.doc

华北电力大学实 验 报 告||试验名称 计算机网络体系结构试验课程名称 计算机网络体系结构||专业班级:网络1202 学生姓名:学 号: 成 绩:指导老师:李丽芬 试验日期:.12.18一、试验目标和要求1.将网…

配置中文_星球大战:战机中队配置需求公布 支持中文

近日《星球大战》系列新作《星球大战:战机中队》公布,该作采用寒霜引擎打造,支持中文。游戏将于2020年10月3日发售,预购价格为238元,登陆Xbox One/PS4/PC(Steam/Origin/Epic)平台,有单人和多人模式&#xf…

为什么在生产中进行硒自动化测试对于您的下一个版本至关重要?

您是否认为仅仅是因为您的Web应用程序在过渡环境中以鲜艳的色彩通过了,您的生产环境也将是相同的吗? 您可能需要重新考虑! 特别是,如果我们指的是跨浏览器测试 ,则需要确保跨各种操作系统,运行在不同操作系…

手机usb共享计算机网络连接,如何将手机wifi网络通过USB共享给电脑?小编教你共享方法...

曾经就有过这样的情况,家里突然断网了,这时又需要打开电脑接收文件,或是需要在线编辑公众号的文章,着急得很,这时电脑没有网络怎么办呢?能不能使用手机的流量,来让电脑连网呢?有时候…

为全局变量赋值_实例分析如何远离漫天飞舞的全局变量

前篇《由static来谈谈模块封装》基本实现了对外隐藏属性,隐藏局部模块函数,开放接口的功能。对于这个话题还有些点没有深入探讨:为什么要这样做?以及这样做的好处。或许很多刚刚开始用C或者其他面向对象编程语言(比如C)的小伙伴们…

数据库班级字段怎么定义名称_班级名称

数据库班级字段怎么定义名称在Java中,每个类都有一个名称。 类位于包中,这使我们程序员可以一起工作,避免名称冲突。 我可以命名我的班级A ,也可以命名您的班级A ,只要它们位于不同的程序包中,它们可以很好…

计算机指令取决,不同的计算机,其指令不同,这主要取决于什么?

不同的计算机,其指令系统也不同,这主要取决于所用的CPU。1、CPU指中央处理器,是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。2、程…

python内存管理方法_Python 内存管理大揭秘

前言语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素。无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征。这里以Python语言为例子,说明一门动态类型的、面向对象的语言的内存管理方式。对象的内存使用…

Kubernetes集群上的Apache Ignite和Spring第1部分:Spring Boot应用程序

在之前的一系列博客中,我们在Kubernetes集群上启动了一个Ignite集群。 在本教程中,我们将使用先前在Spring Boot Application上创建的Ignite集群。 让我们使用Spring Boot创建我们的项目。 Spring Boot应用程序将连接到Ignite集群。 让我们添加依赖项…

计算机VB整除,【原创】VB中的整除运算和转换函数

前言&#xff1a;【关于四舍五入】——实际上是相对小数部分<0.5 舍&#xff1b;0.5 看整数部分&#xff0c;若为奇数则进&#xff0c;若为偶数则舍&#xff1b;>0.5 进整除运算“\”作用&#xff1a;用于对两个数进行除法运算并返回一个整数例如&#xff1a;18\53 …

栈空间_Linux中的进程栈和线程栈

1. 进程栈进程栈是属于用户态栈&#xff0c;和进程虚拟地址空间 (Virtual Address Space) 密切相关。那我们先了解下什么是虚拟地址空间&#xff1a;在 32 位机器下&#xff0c;虚拟地址空间大小为 4G。这些虚拟地址通过页表 (Page Table) 映射到物理内存&#xff0c;页表由操作…

mockito_Mockito 101

mockitoMockito是一个模拟框架&#xff0c;可让您使用简洁的API编写漂亮的测试。 它偏向于最小的规格&#xff0c;使不同的行为看起来有所不同&#xff0c;并显示清晰的错误消息。 创造嘲弄 要使用Mockito创建模拟&#xff0c;只需使用Mock注释模拟&#xff0c;然后调用Mockit…

csgo显示服务器失败,csgo服务器失败

csgo服务器失败 内容精选换一换您可以通过“应用管理”页面的应用列表&#xff0c;快速查看应用状态&#xff0c;及相关异常信息&#xff0c;如图1所示。包括&#xff1a;应用状态&#xff1a;即图1中的①应用异常信息&#xff1a;即图1中的②云服务器异常信息&#xff1a;即图…

mysql多表成绩查询_MySQL多表数据记录查询(一)

1&#xff0e;交叉连接SQL语句的语法结构如下&#xff1a;select * from表1 cross join 表2;或Select * from表1&#xff0c;表2;2.内连接SQL语句有两种表示形式&#xff1a;使用inner join 语法结构如下&#xff1a;Select表达式1&#xff0c;表达式2&#xff0c;...&#xff…

DMN中的函数式编程:感觉就像再次重读我的大学课程一样

在本文中&#xff0c;我想分享有关DMN中的递归支持的有趣见解&#xff0c;并重点介绍FEEL语言的特定属性如何使功能编程结构能够在DMN中建模。 我们将从一个基本的示例开始&#xff0c;以演示FEEL语言和DMN构造的“商业友好”性质如何使我们能够解决一个通常不愉快的问题&…