简体   繁体   English

在 react(useEffect) 中监听 localStorage

[英]Listen localStorage in react(useEffect)

I am using some third-party libraries in react.我在 React 中使用了一些第三方库。 That will make some local storage change on the page.这将使页面上的一些本地存储发生变化。 I tried to listen to that local storage change using javascript storage event and give localStorage.getItem('test') as the dependency of useEffect.我尝试使用 javascript 存储事件来监听本地存储更改,并将 localStorage.getItem('test') 作为 useEffect 的依赖项。 But it is not listening to the localStorage change.但它没有监听 localStorage 的变化。

Here is my code这是我的代码

useEffect(() => {
  window.addEventListener('storage', () => {
    console.log(JSON.parse(localStorage.getItem('test')));
  })
},[])

How to listen the localStorage event in react.如何在 React 中监听 localStorage 事件。

Based on this answer Listen for changes with localStorage on the same window基于这个答案Listen for changes with localStorage on the same window

React version:反应版本:

Add this code before the other script add anything to local storage在其他脚本添加任何内容到本地存储之前添加此代码

const originalSetItem = localStorage.setItem;

localStorage.setItem = function (key, value) {
  const event = new Event("itemInserted");

  event.value = value; // Optional..
  event.key = key; // Optional..

  document.dispatchEvent(event);

  originalSetItem.apply(this, arguments);
};

In your component:在您的组件中:

useEffect(() => {
  const localStorageSetHandler = function (e) {
    alert('localStorage.set("' + e.key + '", "' + e.value + '") was called');
  };

  document.addEventListener("itemInserted", localStorageSetHandler, false);

  // remember to remove the listener
  return () =>
    document.removeEventListener("itemInserted", localStorageSetHandler);
}, []);

请参阅 codesandbox 上的示例

You can this way!你可以这样!

useEffect(() => {
  function checkLocalData() {
    const item = localStorage.getItem('test')

    if (item) {
      checkLocalData(item)
    }
  }

  window.addEventListener('storage', checkLocalData)

  return () => {
    window.removeEventListener('storage', checkLocalData)
  }
}, [])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM