如何使用React钩子将初始切换状态存储在localStorage中

时间:2019-12-12 11:06:15

标签: javascript reactjs react-hooks

我正在尝试将切换的状态存储在本地存储中,例如在刷新时具有模式或类似内容的示例。

我大部分时间都在工作,在第一页加载时,布尔值只是设置为null,这不会呈现<p>I'm toggled</p>标签,并且当您打开和关闭时,状态为存储在本地存储中,我可以从开发工具的“应用程序本地存储”选项卡中看到。

我遇到的问题是,在初始页面加载时,如果再次刷新页面,则默认显示<p>I'm toggled</p>标签。此后每次刷新。切换仍然有效,但是任何刷新默认情况下都会返回显示的状态-不应这样做。

有人可以帮助我了解为什么会这样吗?我已经尝试了几种变体,但似乎无法解决。

import React from 'react';
import ReactDOM from 'react-dom';

const App = () => {
  const [toggle, setToggle] = React.useState(localStorage.getItem('toggle'))

  React.useEffect(() => {
    localStorage.setItem('toggle', toggle)
  }, [toggle]);

  return (
    <div>
        <button onClick={() => {
            setToggle(!toggle)
        }}>
            Toggle
        </button>
        {toggle ? <p>I'm toggled</p> : null}
    </div>
  );
};

export default App;

ReactDOM.render(<App />, document.getElementById('root'));

1 个答案:

答案 0 :(得分:3)

那是因为本地存储将您的状态存储为字符串。因此,当您切换状态时,在保存到存储期间将其更改为“ true”或“ false”。因此,刷新页面后,您便要检查!toggle。现在,那时切换===“ false”,并且!"false"等于true

一种解决方案是检查存储的值是否为"true"

const [toggle, setToggle] = React.useState(localStorage.getItem('toggle') === "true")