React component to handle keyboard events :key:

Last update: Apr 18, 2022

react-key-handler 🔑

npm version License Build Status

React component to handle keyboard events (such as keyup, keydown & keypress).

Testimonials

“Happy to see that react-key-handler is SSR safe 👍
[Veselin Todorov](https://github.com/vesln), Chai.js core

Table of Contents

  1. Installation
  2. Usage
    1. Higher-order Components
    2. Component
    3. Form key handling
  3. Key event names
  4. keyValue, code and keyCode
  5. Development
    1. Setup
    2. Getting started
    3. Tests
  6. Contributing
  7. License

Installation

$ npm install react-key-handler --save

Usage

You can use react-key-handler library in two flavours:

Higher-order Components

This library includes two similar higher-order components, but with a different puprose:

Higher-order Component Purpose
keyHandler Handles key changes
keyToggleHandler Handles key toggles

Both have the same API and will decorate the given component with a keyValue, code and keyCode property.

Internally the KeyHandler component is used, for a full understanding be sure to check out the implementation.

import React from 'react';
import { keyHandler, KEYPRESS } from 'react-key-handler';

function Demo({ keyValue }) {
  return (
    <div>
      {keyValue === 's' && (
        <ol>
          <li>hello</li>
          <li>world</li>
        </ol>
      )}
    </div>
  );
}

export default keyHandler({ keyEventName: KEYPRESS, keyValue: 's' })(Demo);

The prop types of the KeyHandler component are:

Name Type Required Default
keyEventName string no 'keyup' 'keydown', 'keypress' or 'keyup'
keyValue string yes * Any given KeyboardEvent.key
code string yes * Any given KeyboardEvent.code
keyCode† number yes * Any given KeyboardEvent.keyCode

* You should pass at least one of these props.

Note that the keyCode is frequently browser specific and has therefore be set as deprecated, see MDN for details.

Examples

Component

import React from 'react';
import KeyHandler, { KEYPRESS } from 'react-key-handler';

export default class Demo extends React.Component {
  state = { showMenu: false };

  render() {
    const { showMenu } = this.state;

    return (
      <React.Fragment>
        <KeyHandler
          keyEventName={KEYPRESS}
          keyValue="s"
          onKeyHandle={this.toggleMenu}
        />

        {showMenu && (
          <ol>
            <li>hello</li>
            <li>world</li>
          </ol>
        )}
      </React.Fragment>
    );
  },

  toggleMenu = (event) => {
    event.preventDefault();

    this.setState({ showMenu: !this.state.showMenu });
  };
}

The prop types of the KeyHandler component are:

Name Type Required Default
keyEventName string no 'keyup' 'keydown', 'keypress' or 'keyup'
keyValue string yes * Any given KeyboardEvent.key
code string yes * Any given KeyboardEvent.code
keyCode† number yes * Any given KeyboardEvent.keyCode
onKeyHandle function yes Function that is called when they key is handled

* You should pass at least one of these props.

Note that the keyCode is frequently browser specific and has therefore be set as deprecated, see MDN for details.

Example

Form key handling

This library does not handle key events for form elements such as <input /> and <textarea />.

React does a fine job supporting these already via keyboard events.

Examples

Key event names

TODO: explain the differences between the different key events.

keyValue, code and keyCode

The three available key events are

  • keyValue This corresponds to the true value. This is the value of the key pressed by the user while taking into considerations the state of modifier keys such as the shiftKey as well as the keyboard locale/layout
  • code This corresponds to the physical key on the keyboard (as opposed to the character generated by pressing the key). In other words, this property returns a value which isn't altered by keyboard layout or the state of the modifier keys. The value is a string specific to the key, e.g. 'Digit0'
  • keyCode This is similar to code but numeric and also deprecated.

We recommend you to use the new Web standard KeyboardEvent.key or the KeyboardEvent.code over the deprecated KeyboardEvent.keyCode.

Note that in React key is a reserved property, and thus we use keyValue when referring to the key property.

Browser support:

There's no need to worry about browser support because internally we normalize deprecated HTML5 keyValue values and translate from legacy keyCode values, similar to how React does this for their SyntheticKeyboardEvent.

More information:

W3C Working Draft.

Development

Setup

$ git clone <this repo>
$ cd react-key-handler
$ npm install

Getting started

To start the server:

$ npm demo

This starts a development server, which will automatically rebuild the demo app as you change files and supports hot module replacement for fast development:

$ open http://localhost:1234

Tests

To run all tests:

$ npm test

Or you can run the linters, unit tests and check for type errors individually:

$ npm run test:lint
$ npm run test:unit
$ npm run test:flow

Contributing

Bug reports and pull requests are welcome on GitHub. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

 _________________
< The MIT License >
 -----------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

GitHub

https://github.com/ayrton/react-key-handler
Comments
  • 1. v1.1.0 window is not defined

    ReferenceError: window is not defined
        at Object.<anonymous> (/app/node_modules/react-key-handler/dist/index.js:1:258)
        at Module._compile (module.js:624:30)
        at Object.Module._extensions..js (module.js:635:10)
        at Module.load (module.js:545:32)
        at tryModuleLoad (module.js:508:12)
        at Function.Module._load (module.js:500:3)
        at Module.require (module.js:568:17)
        at require (internal/module.js:11:18)
        at Object.zkQZ (/app/public/assets/webpack:/external "react-key-handler":1:1)
        at __webpack_require__ (/app/public/assets/webpack:/webpack/bootstrap cfaabd2047db963ff127:25:1)
        at Object.N7P3 (/app/public/assets/webpack:/frontend/ph/components/App.js:3:1)
        at __webpack_require__ (/app/public/assets/webpack:/webpack/bootstrap cfaabd2047db963ff127:25:1)
        at Object.lYkL (/app/public/assets/webpack:/frontend/server/routes/ssr.js:1:1)
        at __webpack_require__ (/app/public/assets/webpack:/webpack/bootstrap cfaabd2047db963ff127:25:1)
        at Object.TDg2 (/app/public/assets/webpack:/frontend/server/ssr.js:17:1)
        at __webpack_require__ (/app/public/assets/webpack:/webpack/bootstrap cfaabd2047db963ff127:25:1)
        at Object.0 (/app/public/assets/server.js:2373:18)
        at __webpack_require__ (/app/public/assets/webpack:/webpack/bootstrap cfaabd2047db963ff127:25:1)
        at /app/public/assets/webpack:/webpack/bootstrap cfaabd2047db963ff127:90:1
        at Object.<anonymous> (/app/public/assets/server.js:95:10)
        at Module._compile (module.js:624:30)
        at Object.Module._extensions..js (module.js:635:10)
        at Module.load (module.js:545:32)
        at tryModuleLoad (module.js:508:12)
        at Function.Module._load (module.js:500:3)
        at Function.Module.runMain (module.js:665:10)
        at startup (bootstrap_node.js:187:16)
        at bootstrap_node.js:607:3
    
    Reviewed by ayrton at 2018-08-01 12:21
  • 2. Add array as an alternative input + `code` option

    This PR does the following:

    • Allows for keyValue/keyCode to come in array format
    • Changes behavior to allow simultaneous input of all three options (API change) see discussion below †
    • Adds the option of having code instead of keyCode (also marks keyCode as deprecated)
    • Adds an example for toying around with code
    • Clarifies the examples by visually boxing each example and adding code sections where appropriate
    • Refactoring of the code so that index.js is more informative, decorators have a separate file + more
    • Updated the README and also entered info on the missing section (much is copy-paste from MDN)

    The PR includes all the updates in previous Flow PR (https://github.com/ayrton/react-key-handler/pull/147)

    † The possibility of keyValue having priority is problematic in my opinion. If a user does not intend to use both then they probably wouldn't have specified them. If this truly should not be allowed then the constructor should throw an error. I can't see any use case where allowing all provided value hooks to trigger the event function.

    Reviewed by gforge at 2018-07-29 20:22
  • 3. Adds new `handledKeys` prop to handle more than one key

    Thanks for the nice library!

    I saw in the issues a lot of requests to let this library handle multiple keys, so I took a stab at it.

    • The KeyHandler component takes a new prop called handledKeys which is basically an array of shape keyValue, keyCode, and a new prop I added called allowInputTarget which allows the event to pass even if it's target is an input (I have the use case to listen to 'Escape' key from inputs).
    • The keyHandler HOC also takes a new prop called handleKey, and if present, it passes that to KeyHandler component as the value of onKeyHandle, instead of it's own this.handleKey. This lets you take control and handle all the key events with your own function without using the KeyHandler component directly.

    Assuming you had some component with following methods:

    handleKeyEvent(e) {
      switch(e.key) {
        case 'Escape':
          return console.log('hit escape');
    
        case 'ArrowLeft':
          return console.log('navigated direction');
      }
    }
    
    get handledKeys() {
      return [
        { keyValue: 'Escape', allowInputTarget: true },
        { keyCode: 37 }
      ];
    }
    

    You could use it like this:

    <KeyHandler
      keyEventName={KEYDOWN}
      handledKeys={this.handledKeys}
      onKeyHandle={this.handleKeyEvent} />
    

    Should also work the same using as a HOC.

    Let me know if this looks good to you and I can try adding some unit tests for this behavior.

    Reviewed by aarosil at 2017-02-19 22:05
  • 4. Update code according to React 15.5

    Hello, Ayrton!

    As you most likely know, React was updated to 15.5 and React.PropTypes and React.createClass were extracted into their own packages. So now React shows warning in case you use PropTypes in the old way. Here you can find details.

    I made a small pull request #103 to fix this. It would be great if you could find a time to check and merge it and release a new version with React 15.5 support.

    Reviewed by HedgeHogBy at 2017-04-11 12:58
  • 5. Add W3C KeyboardEvent.key values support.

    As discussed at #7

    KeyboardEvent.keyCode is deprecated, also MDN recommends to avoid it for new projects in favor of KeyboardEvent.key.

    This PR is a result of following this recommendations without dropping the support for keyCode since not every browser has implemented the new standard yet.

    The usage of keyValue instead of keyId as discussed at #7 is to match an ubiquitous terminology with current standards.

    Now, despite letter case, the arrow keys values are the only difference I notice from keycodes naming to actual key values so keyNameVals might seams dummy, but it allows to map any another differences.

    Hope it helps! Cheers

    Reviewed by leocavalcante at 2016-03-06 02:58
  • 6. I do not understand the real usage of this lib and its API

    Sorry for the harsh/clumsy title, but why this API?

    I mean, If I understand correctly, in the API, here

    export default keyHandler({ keyEventName: KEYPRESS, keyValue: 's' })(Demo);
    

    It seems that the component explicitly waits for a specific KEYPRESS to be s in order for the component to have this.props.keyEventName and this.props.keyValue not null (but 115 and s).

    Why that choice?

    I was more expecting a HOC/decorator that would give me in props any keyboard events with their value, my component having to deal with that specifically in componentWillReceiveProps() or componentWillUpdate(), but this current API seems very limiting.

    Unless I'm missing the big picture here :)

    Thanks for your lights

    Reviewed by guillaumepotier at 2017-12-11 13:37
  • 7. Fix flow for issue #26

    Here's an addition of Flow interface files

    I've also uploaded packages and fixed so that all tests pass. This resulted in much more than "just a flow fix" since many of the packages had changed interfaces, including Flow itself.

    BTW this includes the minor Firefox issue that I posted recently.

    Thanks by the way for creating this gem - it was exactly what I was looking for!

    Reviewed by gforge at 2018-07-28 19:37
  • 8. Firefox keypress == 0 - amend with which

    While keyCode together with keepress returns 0 in Firefox (https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode). This can be mitigated to using a fallback thgrough the event.which argument:

    if (!isNullOrUndefined(keyCode)) {
      // Firefox handles keyCode through which 
      const code = event.keyCode || event.which;
      return keyCode === code;
    }
    
    Although the change should probably be towards just `.code`: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code
    
    
    Reviewed by gforge at 2018-07-28 17:25
  • 9. Prevent default (Browser arrow scrolling)

    I would like to use arrow keys for moving elements. This works great. But when I press 'up' and 'down' keys the browser scroll is also activated.

    How can I prevent this default behavior? I'm working with React components:

    <KeyHandler keyEventName={KEYPRESS} keyValue="ArrowLeft" onKeyHandle={this.moveEventLeft} />

    The function doesn't seem to have an event parameter.

    Thanks !

    Reviewed by xAlstrat at 2018-01-18 19:06
  • 10. Update dependencies to enable Greenkeeper 🌴

    Let’s get started with automated dependency management for react-key-handler :muscle:

    This pull request updates all your dependencies to their latest version. Having them all up to date really is the best starting point. I will look out for further dependency updates and make sure to handle them in isolation and in real-time, as soon as you merge this pull request.

    I won’t start sending you further updates, unless you have merged this very pull request.


    💥 This branch failed. How to proceed

    I suggest you find out what dependency update is causing the problem. Adapt your code so things are working nicely together again. next-update is a really handy tool to help you with this.

    Push the changes to this branch and merge it.

    🏷 How to check the status of this repository

    There is a badge added to your README, indicating the status of this repository.

    This is how your badge looks like :point_right: Greenkeeper badge

    🙈 How to ignore certain dependencies

    In case you can not, or do not want to update a certain dependency right now, you can of course just change the package.json file back to your liking.

    Add a greenkeeper.ignore field to your package.json, containing a list of dependencies you don’t want to update right now.

    // package.json
    {
      …
      "greenkeeper": {
        "ignore": [
          "package-names",
          "you-want-me-to-ignore"
        ]
      }
    }
    
    👩‍💻 How to update this pull request
      # change into your repository’s directory
      git fetch
      git checkout greenkeeper/initial
      npm install-test
      # adapt your code, so it’s working again
      git commit -m 'chore: adapt code to updated dependencies'
      git push origin greenkeeper/initial
    
    ✨ How the updates will look like

    As soon as you merge this pull request I’ll create a branch for every dependency update, with the new version applied. The branch creation should trigger your testing services to check the new version. Using the results of these tests I’ll try to open meaningful and helpful pull requests and issues, so your dependencies remain working and up-to-date.

    -  "underscore": "^1.6.0"
    +  "underscore": "^1.7.0"
    

    In the above example you can see an in-range update. 1.7.0 is included in the old ^1.6.0 range, because of the caret ^ character. When the test services report success I’ll delete the branch again, because no action needs to be taken – everything is fine. When there is a failure however, I’ll create an issue so you know about the problem immediately.

    This way every single version update of your dependencies will either continue to work with your project, or you’ll get to know of potential problems immediately.

    -  "lodash": "^3.0.0"
    +  "lodash": "^4.0.0"
    

    In this example the new version 4.0.0 is not included in the old ^3.0.0 range. For version updates like these – let’s call them “out of range” updates – you’ll receive a pull request.

    Now you no longer need to check for exciting new versions by hand – I’ll just let you know automatically. And the pull request will not only serve as a reminder to update. In case it passes your decent test suite that’s a strong reason to merge right away :shipit:

    💁‍♂️ Not sure how things are going to work exactly?

    There is a collection of frequently asked questions and of course you may always ask my humans.


    Good luck with your project and see you soon :sparkles:

    Your Greenkeeper Bot :palm_tree:

    Reviewed by greenkeeper[bot] at 2017-08-09 22:36
  • 11. Update flow-bin to version 0.35.0 🚀

    Hello lovely humans,

    flow-bin just published its new version 0.35.0.

    State Update :rocket:
    Dependency flow-bin
    New version 0.35.0
    Type devDependency

    This version is not covered by your current version range.

    Without accepting this pull request your project will work just like it did before. There might be a bunch of new features, fixes and perf improvements that the maintainers worked on for you though.

    I recommend you look into these changes and try to get onto the latest version of flow-bin. Given that you have a decent test suite, a passing build is a strong indicator that you can take advantage of these changes by merging the proposed change into your project. Otherwise this branch is a great starting point for you to work on the update.

    Do you have any ideas how I could improve these pull requests? Did I report anything you think isn’t right? Are you unsure about how things are supposed to work?

    There is a collection of frequently asked questions and while I’m just a bot, there is a group of people who are happy to teach me new things. Let them know.

    Good luck with your project :sparkles:

    You rock!

    :palm_tree:


    The new version differs by 10 commits .

    See the full diff.


    This pull request was created by greenkeeper.io.

    Tired of seeing this sponsor message? :zap: greenkeeper upgrade

    Reviewed by greenkeeperio-bot at 2016-11-11 17:42
  • 12. Combination CTRL + SHIFT + A not work

    The 2 key combination works well. e.g. ctrl+A, ctrl+C but when press key ctrl + shift + A It only files event: event.ctrlKey ===true + event.keyCode === shiftLeft But what I expect is: event.ctrlKey ===true + event.shiftKey=== true + event.keyCode ==='a'

    is there anything wrong? or this react-key-handler cannot support 3 key combination? <KeyHandler keyEventName={KEYDOWN} keyValue={['ArrowDown', 'ArrowUp', 'ArrowLeft', 'ArrowRight', 'Control', 'Meta', 'Delete', 'Backspace', 'a', 'c', 'e', 'p', 's', 'v', 'x']} onKeyHandle={this.keyDownEventHandler} />

    Reviewed by kxiang2016 at 2019-08-28 05:59
  • 13. Fires twice if props/state changes causes re-mapping of the fired key

    I've found that if the parent components props/state changes when an event is fired it will re-trigger the same event, i.e. firing twice. To be more specific, it happened when a new react-key-handler component with the same key binding was created on a different element. To illustrate the components

    [button one, key 1], [button two, key 2], [button three, key 3]

    when I pressed 2 the button one would disappear and the keys would with new bindings:

    [button two, key 1], [button three, key 2]

    I've solved this by adding a setTimeout(.., 0) to the call. This could possibly be activated through a prop that wraps the onKeyHandle in a setTimeout function.

    Reviewed by gforge at 2018-09-17 09:09
  • 14. Fires multiple times for multiple instances

    I have a component that contains this:

    <KeyHandler
         keyEventName={KEYPRESS}
         keyValue='Enter'
         onKeyHandle={onKeyHandler}
    />
    

    So, when i make multiple instances of my React component that contains this, I'm finding that onKeyHandler fires for ALL when ONE of them receives a keypress event. Any idea why this is happening or how to prevent it?

    Reviewed by matthew-dean at 2018-02-19 20:51
  • 15. Alt key with any Alphabet combination is not working

    <KeyHandler keyValue="i" onKeyHandle={this.someMethod} />

    someMethod(event) { console.log(event.altKey); }

    someMethod is not getting invoked when pressing alt + i where as alt works fine with special keys like Arrows, function keys etc.

    Reviewed by Archana-B at 2017-11-23 13:05
  • 16. Have the higer-order component accept an onKeyHandle parameter

    As of right now a component that gets wrapped by keyHandler has to expect keyValue, etc being passed down. That causes the component to be coupled with keyHandler if all you want to do is fire a callback that is on the props object. A way around this would be to allow an onKeyHandle parameter be passed to keyHandler that could look like (ownProps, keyValue, keyEventName) => void or something akin to that.

    Just want to open the discussion of any pros/cons of this approach

    Here's an example:

    import React, { Component } from 'react';
    import { keyHandler, KEYPRESS } from 'react-key-handler';
    
    const CloseButton = ({ closeHandler }) => <button onClick={closeHandler}>Close</button>;
    
    const CloseOnEnterKeyOrButton = keyHandler(
      { keyEventName: KEYPRESS, keyValue: 'enter' },
      ownProps => {
        if (ownProps.closeHandler) ownProps.closeHandler();
      }
    )(CloseButton);
    
    class Parent extends Component {
      constructor(props) {
        super(props);
        this.state = { isOpened: true };
      }
      render() {
        if (this.state.isOpened) {
          return (
            <div>
              Some stuff
              <CloseOnEnterKeyOrButton closeHandler={this.setState.bind(this, { isOpened: false })} />
            </div>
          );
        }
        return null;
      }
    }
    

    This 2nd parameter to keyHandler would only be fired when enter would be pressed

    Reviewed by petejodo at 2016-07-22 16:51
An easy-to-use keyboard event react component, Package size less than 3kb
An easy-to-use keyboard event react component, Package size less than 3kb

An easy-to-use keyboard event react component, Can achieve a variety of custom keyboard functions, Package size less than 3kb

May 5, 2022
Manage keyboard shortcuts from one place

React Shortcuts Manage keyboard shortcuts from one place. Intro Managing keyboard shortcuts can sometimes get messy. Or always, if not implemented the

Feb 15, 2022
🐭 React hook that tracks mouse events on selected element - zero dependencies
🐭  React hook that tracks mouse events on selected element - zero dependencies

React Mighty Mouse React hook that tracks mouse events on selected element. Demo Demos created with React DemoTab ?? Install npm install react-hook-mi

May 10, 2022
Determine the cursor aim for triggering mouse events.
Determine the cursor aim for triggering mouse events.

React Aim Determine the cursor aim for triggering mouse events. Demo Try the demo here. Installation npm install react-aim --save Usage import React,

May 17, 2022
React higher order component for adding onEnterKeyDown to input components

React higher order component for adding onEnterKeyDown to input components

May 4, 2020
Declarative hotkey and focus area management for React

React HotKeys A declarative library for handling hotkeys and focus areas in React applications. Upgrading from 1.*.* ? See the upgrade notes. Looking

May 12, 2022
Lightweight keydown wrapper for React components
Lightweight keydown wrapper for React components

Use react-keydown as a higher-order component or decorator to pass keydown events to the wrapped component, or call methods directly via designated ke

May 7, 2022
A set of components that react to page scrolling

react-scroll-components A set of components and mixins that react to page scrolling ScrollListenerMixin This mixin provides the following states: scro

Aug 27, 2021
Niue is a tiny shared state and event library for React

Niue is a small library (~1.3kb before compression) that provides a simple way to manage your React app's shared state and send events between components.

May 16, 2022
keyboard-aware-view is a react-native package that handles the view position based on input position and keyboard so that the text input doesn't get hidden behind the keyboard.

keyboard-aware-view is a react-native package that handles the view position based on input position and keyboard so that the text input doesn't get hidden behind the keyboard.

Apr 1, 2022
Decentralized-Public-Key-Infrastructure - A decentralized Public Key Infrastructure using Truffle and React Bootstrap
Decentralized-Public-Key-Infrastructure - A decentralized Public Key Infrastructure using Truffle and React Bootstrap

Decentralized-Public-Key-Infrastructure A decentralized Public Key Infrastructur

Apr 2, 2022
Key-racing is a simple and easy-to-use keyboard trainer that help you master ten-finger typing skills
Key-racing is a simple and easy-to-use keyboard trainer that help you master ten-finger typing skills

Key-racing is a simple and easy-to-use keyboard trainer that help you master ten-finger typing skills

Dec 25, 2021
A React Native Keyboard Accessory (View, Navigation) Component. Sticky views on keyboard.

react-native-keyboard-accessory A React Native Keyboard Accessory (View, Navigation) Component. Sticky views on keyboard. Expo Snack Playground https:

May 13, 2022
The Remote Keyboard Tutoring System is a web-based system that can be attached to any (electronic) keyboard synthesizer through a MIDI connector
The Remote Keyboard Tutoring System is a web-based system that can be attached to any (electronic) keyboard synthesizer through a MIDI connector

The Remote Keyboard Tutoring System is a web-based system that can be attached to any (electronic) keyboard synthesizer through a MIDI connector. Once our system is connected to the keyboard, the user can interactively learn, play or teach in combination with the web application that we provide.

Feb 7, 2022
Keyboard events for react-native

react-native-keyboardevents Keyboard events for react-native As of react-native 0.11 this module is obsolete. Now you can do something like the follow

Apr 16, 2022
A React hook for tracking user interaction with the DOM elements, combining 🖱 mouse events and ⌨️ keyboard focus

useHoverState() The one aware of keyboard navigation as well ?? npm i use-hover-state A React hook for tracking user interaction with the DOM elements

May 9, 2022
Keyborg is a library that tracks the state of current keyboard input on a web page through focus events.

Keyborg ⌨️ ?? Keyborg is a library that tracks the state of current keyboard input on a web page through focus events. It does not do anything invasiv

Apr 22, 2022
React hook which syncs localStorage[key] with the comp.
React hook which syncs localStorage[key] with the comp.

@rehooks/local-storage React hook for enabling synchronization with local-storage. API Docs can be found here. Table of Contents @rehooks/local-storag

May 8, 2022
Android's Native key value storage system in React Native

React Native Shared Preferences Android's Native key value storage system in React Native Installation < RN 0.47 npm install react-native-shared-prefe

May 5, 2022
redis like key-value state management solution for React

jedisdb redis like key-value state management solution for React Reactive. Redux alternative. Simple and powerful global state management system, acce

Apr 28, 2022