Code Monkey home page Code Monkey logo

react-local-storage's Introduction

React Local Storage

A stateful react hook for browser storage.

build npm downloads typescript contributions

Why?

Install

npm install @webcored/react-local-storage

Usage

component.jsx

import { useLocalStorage } from "@webcored/react-local-storage";

const [user, userStorage] = useLocalStorage('user');

....
typescript

const [user, userStorage] = useLocalStorage<User>('user');
  
....

update
userStorage.update({ ...user, name: 'new name' });
remove
userStorage.remove();
reset

Reset's to the default value provided in the key config

userStorage.reset();

Sample app

View on Github
typescript

View on Github

Configurations

import React from 'react';

import { user } from './storages/user';

import { storageConfig } from "@webcored/react-local-storage";

storageConfig({
  namespace: 'app',
  delimiter: '/'
  react: React
  storages: {
    user
  }
})
config default optional description
namespace null true namespace your storage keys to
avoid conflicts especially in the case micro-frontends.
delimiter / true delimiter between the namespace and keys,
ie: if namespace is app then key of user will be app/user
react null false react-local-storage uses useState hook internally which will be
abstracted from the given react instance.
storage window.localStorage true choose between local or session storage
storages null true storage keys config & definition

Each key can have its own configuration

Defaults

Configure default values to the localstorage key

import { storageKeyConfig } from "@webcored/react-local-storage"

const user = storageKeyConfig({
  defaults: {
    name: 'Guest',
    email: '[email protected]'
  }
})
typescript

import { storageKeyConfig } from "@webcored/react-local-storage"

const user = storageKeyConfig<User>({
  defaults: {
    name: 'Guest',
    email: '[email protected]'
  }
})

Versions & Migrations

If there is a schema change required in the local storage or in its default value, the storage can be simply migrated to the latest version by incrementing the version of a key. It will invoke the given migration method when there is a conflict with version.

import { storageKeyConfig } from "@webcored/react-local-storage"

const user = storageKeyConfig({
  defaults: {
    name: 'Guest',
    email: '[email protected]',
    avatar: 'example.com/guest.png'
  },
  version: 2,
  migration: (currentValue, defaultValue) {
    return Object.assign({}, ...currentValue, ...defaultValue);
  }
})
typescript

import { storageKeyConfig } from "@webcored/react-local-storage"

const user = storageKeyConfig<User>({
  defaults: {
    name: 'Guest',
    email: '[email protected]',
    avatar: 'example.com/guest.png'
  },
  version: 2,
  migration: (currentValue, defaultValue) {
    return Object.assign({}, ...currentValue, ...defaultValue);
  }
})

react-local-storage's People

Contributors

dependabot[bot] avatar prakashchokalingam avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar

react-local-storage's Issues

Fetch keys from other namespace

Currently, we have a global config of namespace & delimiter. Once configured the local storage hooks can read keys of a given namespace only.

Yet there might be use cases especially in micro frontends where we might need to fetch keys from a different namespace. Hence proposing the solution of overriding the default config by providing the config as args to the hook.

const [user] = useLocalStorage('user', { namespace: 'global', delimiter: '#' })

Redux state support

Currently, this hook uses the useState hook for state management. When a state of key is updated, it's not reflected in other states of the same key.

cost [user, userDispatch] = useLocalStorage('user')
cost [user2, user2Dispatch] = useLocalStorage('user')

userDispatch.reset(); // updates the user, not user2

To resolve this we can use redux instance if a project is using redux for their state management.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.