# Quick Start

Soft Storage provides three ways to manage storage:

  • Combined with the ref API in Vue 3
  • Combined with useState API in React
  • Standalone use in any project that supports cjs modules or esm modules

In addition, if you only want to use a shallow modular wrapper for the browser's Storage API, you can go straight to the Raw Usage section.

WARNING

Attention please! You should never use interface to define a type in Soft Storage, to instead of it, you can use type. Click Q&A > About Interface for more details.

# For Vue 3 vue >= 3.1.0

# Install

  • npm
  • yarn
  • pnpm
npm install @soft-storage/vue-hooks

# Create a Storage Module

Create a new file anywhere, and use like this:

// storage.ts
import { createLocalStorage } from '@soft-storage/vue-hooks';

type UserInfo = {
  token?: string;
  hasSigned: boolean;
};

export const storage = createLocalStorage<UserInfo>({
  // This is storage key
  storageModuleKey: 'user_info',
  // Used to initialize
  initial: {
    hasSigned: false, // Non-nullable properties must be initialized
    // Optional properties cannot be initialized
  },
});

# Use Hooks in Component

<script setup lang="ts">
import { onMounted } from 'vue';
import { getUserInfo } from '@/api'; // Suppose you have a function that gets user information
import { useStorage } from '@soft-storage/vue-hooks';
import { storage } from './storage';

/* You can easily deconstruct the hook's return value,
because TypeScript will give you great type hints */
const {
  refs: { token, hasSigned },
  resetters: { resetToken, resetHasSigned },
  checkers: { containsToken, containsHasSigned },
} = useStorage(storage);

onMounted(() => {
  getUserInfo().then(res => {
    token.value = res.token; // It's a ref
    hasSigned.value = true; // Same as above
  });
});

const onSignOut = () => {
  resetToken(); // Reset the value of token
  resetHasSigned(); // Reset the value of hasSigned
};
</script>

<template>
  <div>Contains token: {{ containsToken() }}</div>
  <div>Contains hasSigned: {{ containsHasSigned() }}</div>
  <button @click="onSignOut">Sign out</button>
</template>

# For React react >= 16.8.0

# Install

  • npm
  • yarn
  • pnpm
npm install @soft-storage/react-hooks

# Create a Storage Module

Create a new file anywhere, and use like this:

// storage.ts
import { createSessionStorage } from '@soft-storage/react-hooks';

type UserInfo = {
  token?: string;
  hasSigned: boolean;
};

export const storage = createSessionStorage<UserInfo>({
  // This is storage key
  storageModuleKey: 'user_info',
  // Used to initialize
  initial: {
    hasSigned: false, // Non-nullable properties must be initialized
    // Optional properties cannot be initialized
  },
});

# Use Hooks in Component

import React, { useEffect } from 'react';
import { getUserInfo } from '@/api'; // Suppose you have a function that gets user information
import { useStorage } from '@soft-storage/react-hooks';
import { storage } from './storage';

function UserInfoFC() {
  /* You can easily deconstruct the hook's return value,
  because TypeScript will give you great type hints */
  const {
    tokenState: { token, setToken, resetToken, containsToken },
    hasSignedState: { hasSigned, setHasSigned, resetHasSigned, containsHasSigned },
  } = useStorage(storage);

  useEffect(() => {
    getUserInfo().then(res => {
      setToken(res.token);
      setHasSigned(true);
    });
  }, []);

  const onSignOut = () => {
    resetToken(); // Reset the value of token
    resetHasSigned(); // Reset the value of hasSigned
  };

  return (
    <>
      <div>Contains token: {containsToken()}</div>
      <div>Contains hasSigned: {containsHasSigned()}</div>
      <button onClick={onSignOut}>Sign out</button>
    </>
  );
}

export default UserInfoFC;

# For Standalone Use

# Install

  • npm
  • yarn
  • pnpm
npm install @soft-storage/hooks

# Create a Storage Module

Create a new file anywhere, and use like this:

// storage.ts
import { createSessionStorage } from '@soft-storage/hooks';

type UserInfo = {
  token?: string;
  hasSigned: boolean;
};

export const storage = createSessionStorage<UserInfo>({
  // This is storage key
  storageModuleKey: 'user_info',
  // Used to initialize
  initial: {
    hasSigned: false, // Non-nullable properties must be initialized
    // Optional properties cannot be initialized
  },
});

# Use Hooks in a Script File

import { getUserInfo } from '@/api'; // Suppose you have a function that gets user information
import { useStorage } from '@soft-storage/hooks';
import { storage } from './storage';

const { token, hasSigned } = useStorage(storage);

(() => {
  getUserInfo().then(res => {
    token.set(res.token);
    hasSigned.set(true);
    console.log(hasSigned.get()); // Output: true
  });
})();

const onSignOut = () => {
  token.reset(); // Set value to initial value, if not, it is set to undefined
  hasSigned.reset();
  console.log(token.get(), token.exist()); // Output: undefined, false
  console.log(hasSigned.get(), hasSigned.exist()); // Output: false, true
};

# How about remove() API?

TIP

remove() is an unsupported API. Click Q&A > About Remove and Clear for more details.

# Raw Usage

# Install

  • npm
  • yarn
  • pnpm
npm install @soft-storage/core

# Create a Storage Module

// storage.ts
type UserInfo = {
  token?: string;
  hasSigned: boolean;
};

const storageModule = new StorageModule<UserInfo>('user_info', StorageType.SESSION);

const helper = storageModule.getHelper();
if (!helper.getExistence()) {
  // Here the initialization is arbitrary, no restrictions
  helper.setModule({
    token: '',
    hasSigned: false,
  });
}

export { storageModule };

# Use in Any Script File

import { StorageModule, StorageType } from '@soft-storage/core';
import { getUserInfo } from '@/api'; // Suppose you have a function that gets user information
import { storageModule } from './storage.ts';

type UserInfo = {
  token?: string;
  hasSigned: boolean;
};

(() => {
  getUserInfo().then(res => {
    storageModule.setItem('token', res.token);
    storageModule.setItem('hasSigned', true);
    console.log(storageModule.getItem('hasSigned')); // Output: true
    console.log(storageModule.contains('token')); // Output: true
  });
})();

const onSignOut = () => {
  storageModule.removeItem('token');
  storageModule.setItem('hasSigned', false);
  console.log(storageModule.getItem('token')); // Output: undefined
  console.log(storageModule.size()); // Output: 1

  // Or
  storageModule.clear();
  console.log(storageModule.size()); // Output: 0
};

# Next

Now, you can enjoy the type hints brought by TypeScript!