美文网首页React
自定义 hook —— useLocalStorageState

自定义 hook —— useLocalStorageState

作者: Lia代码猪崽 | 来源:发表于2021-09-07 16:59 被阅读0次

基础功能

  1. state 保存到 localStorage 中,实现本地持久化;
  2. 如果清空了值,也从 localStorage 中删除这条数据;
  3. 会自动处理序列化和反序列化的操作;
  4. 重新刷新页面后也能拿到之前的值;
  5. 同源多页面之间也能共享值,当其中一个页面的值发生了改变,不刷新其他页面下也能更新值。

具体实现代码

import { useState, useEffect } from "react";

const useLocalStorageState = (key, defaultState) => {
  const [localState, setLocalState] = useState(defaultState);
  const [showState, setShowState] = useState(defaultState);

  // 刷新页面后能拿到值
  useEffect(() => {
    const value = localStorage.getItem(key);
    if (!value) {
      return;
    }
    setLocalState(value);
  // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  // 同源页面监听改变实时刷新
  useEffect(() => {
    const storageFuction = function(e) {
      const value = e.newValue
      setLocalState(value)
    }
    window.addEventListener('storage', storageFuction)
    return () => {
      window.removeEventListener('storage', storageFuction)
    }
    // console.log(localStorage.getItem(key))
  }, [])

  useEffect(() => {
    if (localState) {
      if (typeof localState === "object") {
        localStorage.setItem(key, JSON.stringify(localState));
      } else {
        localStorage.setItem(key, String(localState));
      }
      setShowState(localState)
      return;
    }
    localStorage.removeItem(key);
    setShowState(undefined)
  // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [localState]);

  return [showState, setLocalState];
};

export default useLocalStorageState;

demo

demo1

import useLocalStorageState from './hooks/useLocalStorageState'

function App() {
  const [state,setState] =  useLocalStorageState('test', [])
  return (
    <div className="App" style={{textAlign: 'center'}}>
      <header className="App-header">
        <p>
          { state }
        </p>
        <button onClick={() => setState([...state, 'A'])}>Push A</button>
        <button onClick={() => setState(state.slice(0, state.length - 1))}>Pop A</button>
      </header>
    </div>
  );
}

export default App;

demo2

import useLocalStorageState from './hooks/useLocalStorageState'

function App() {
  const [state,setState] =  useLocalStorageState('test', '')
  return (
    <div className="App" style={{textAlign: 'center'}}>
      <header className="App-header">
        <p>
          { state }
        </p>
        <input value={state || ''} onChange={(e) => setState(e.target.value)} />
      </header>
    </div>
  );
}

export default App;

相关文章

  • 自定义 hook —— useLocalStorageState

    基础功能 将 state 保存到 localStorage 中,实现本地持久化; 如果清空了值,也从 localS...

  • 在React中创建自定义hook

    什么是自定义hook? 使用自定义hook可以将某些组件逻辑提取到可重用的函数中。 自定义hook是一个从use开...

  • react的一些总结

    什么时候自定义Hook? 当多个组件之间有一些公共的逻辑,可以将他们抽取成自定义的Hook,Hook本质是自定义的...

  • 自定义Hook & 高阶组件

    自定义Hook 自定义Hook: 将一些常用的、跨越多个组件的Hook功能,抽离出去形成一个函数,该函数就是自定义...

  • 自定义hook

    自定义hook 需求描述:自定义一个hook函数,实现获取滚动距离Y const [y] = useWindowS...

  • fishHook-代码实例

    可以HOOK系统的C函数,但无法HOOK自定义的函数 fishHook 无法交换自定义函数!!!,这个函数肯定是C...

  • DebugValue Hook

    DebugValue Hook useDebugValue:用于将自定义Hook的关联数据显示到调试栏 如果创建的...

  • [react]24、自定义hooks

    1、自定义Hook的基本使用 自定义Hook本质上只是一种函数代码逻辑的抽取,严格意义上来说,它本身并不算Reac...

  • Hook

    Hook 概念和特点 useState useRef EffectHook 自定义钩子 useCallback u...

  • 记一次git hook踩坑(python编写hook脚本)

    背景:项目内有个zip包需要发版时去网上更新,自定义一个pre-commit hook来解决。 hook逻辑编写(...

网友评论

    本文标题:自定义 hook —— useLocalStorageState

    本文链接:https://www.haomeiwen.com/subject/ljdpwltx.html