📜  react 中的响应式本地存储 - Javascript (1)

📅  最后修改于: 2023-12-03 14:46:58.564000             🧑  作者: Mango

React中的响应式本地存储

React是一个流行的JavaScript库,用于构建大型Web应用程序。React使用单向数据流来组织应用程序中的状态和行为。在React的世界中,一切都是组件,并且组件的属性和状态都仅在它们内部可用。

然而,有时候我们需要在应用程序中存储数据,并在组件之间共享。这时候本地存储是一个好的选择。在本文中,我们将介绍如何在React中使用响应式本地存储。

什么是本地存储?

本地存储是存储数据的一种方式,该数据可以直接从客户端浏览器中读取和写入。本地存储提供了一种简单而快捷的方式来存储和共享数据,这些数据可以在浏览器中进行跨页传输。

本地存储提供了两种主要的API:localStorage和sessionStorage。通常情况下,我们使用localStorage来存储用户偏好设置、应用程序状态等数据;而使用sessionStorage来存储会话级别的数据。

使用localStorage

localStorage是一个全局对象,用于在浏览器中存储键值对。它提供了如下的方法:

  • setItem(key, value):将键值对存储到localStorage中。
  • getItem(key):从localStorage中获取指定键的值。
  • removeItem(key):从localStorage中删除指定的键值对。
  • clear():从localStorage中删除所有的键值对。

在React中,我们可以将localStorage用作全局状态管理器。我们可以在一个组件中调用localStorage.setItem()来存储数据,并在另一个组件中调用localStorage.getItem()来获取相同的数据。

以下是一个使用localStorage来存储用户名的示例:

import { useState, useEffect } from 'react';

function UserNameForm() {
  const [userName, setUserName] = useState('');

  useEffect(() => {
    const storedUserName = localStorage.getItem('userName');
    if (storedUserName) {
      setUserName(storedUserName);
    }
  }, []);

  function handleChange(event) {
    setUserName(event.target.value);
  }

  function handleSubmit(event) {
    event.preventDefault();
    localStorage.setItem('userName', userName);
  }

  return (
    <form onSubmit={handleSubmit}>
      <label htmlFor="userName">User Name</label>
      <input
        id="userName"
        type="text"
        value={userName}
        onChange={handleChange}
      />
      <button type="submit">Save</button>
    </form>
  );
}

在上面的代码中,我们使用了useState钩子来存储用户输入的用户名。我们还使用了useEffect钩子来在组件挂载时检查localStorage中是否有存储的用户名。如果有,则我们将从localStorage中获取它,然后使用setUserName函数将其分配给userName状态。

当用户提交表单时,我们会调用handleSubmit函数来将用户名存储到localStorage中。下一次我们要访问该用户名时,只需调用localStorage.getItem('userName')即可。

请注意,在React中使用localStorage来存储本地状态时,我们需要使用生命周期钩子来初始化状态。这是因为在React组件的默认行为下,组件会在每次重新渲染时重新创建。因此,如果我们要防止每次渲染时都从localStorage中检索键值对,我们需要使用useEffect钩子来检查是否有存储的数据,并使用useState钩子来存储数据。

使用Redux

如果我们要在React中使用更高级的全局状态管理器,则可以考虑使用Redux。Redux是一个流行的JavaScript库,用于在应用程序中管理可预测和不可变的状态。

Redux将数据存储在一个全局的store对象中。在这个store对象中,我们可以使用reducer函数来管理我们的数据,并在需要更新数据时调度一个action。

以下是一个使用Redux来管理用户状态的示例:

import { createStore } from 'redux';
import { Provider, useSelector, useDispatch } from 'react-redux';

const SET_USERNAME = 'SET_USERNAME';

function userNameReducer(state = null, action) {
  switch (action.type) {
    case SET_USERNAME:
      return action.payload;
    default:
      return state;
  }
}

function setUserName(userName) {
  return {
    type: SET_USERNAME,
    payload: userName,
  };
}

const store = createStore(userNameReducer);

function UserNameForm() {
  const userName = useSelector(state => state);
  const dispatch = useDispatch();

  function handleChange(event) {
    dispatch(setUserName(event.target.value));
  }

  function handleSubmit(event) {
    event.preventDefault();
    localStorage.setItem('userName', userName);
  }

  return (
    <form onSubmit={handleSubmit}>
      <label htmlFor="userName">User Name</label>
      <input
        id="userName"
        type="text"
        value={userName === null ? '' : userName}
        onChange={handleChange}
      />
      <button type="submit">Save</button>
    </form>
  );
}

function App() {
  return (
    <Provider store={store}>
      <UserNameForm />
    </Provider>
  );
}

在上面的代码中,我们定义了一个名为SET_USERNAME的字符串常量,用于描述action类型。我们还定义了一个userNameReducer函数,用于管理我们的数据。当dispatch一个SET_USERNAME action时,我们的reducer函数将更新我们的state来反映新的用户名。

在UserNameForm组件中,我们使用useSelector钩子来选择我们的state对象。我们还使用useDispatch钩子来派发actions。当用户提交表单时,我们会使用localStorage.setItem()函数将用户名存储到localStorage中。

请注意,我们在return语句中使用了一个三元表达式来检查userName状态是否为null。这是因为当Redux store中的state未初始化时,我们的组件可能会获取到null值,并且React会抱怨我们尝试将null值分配给input元素的value属性。

结论

本地存储提供了一种简单而方便的方式来存储和共享数据,这些数据可以在浏览器中进行跨页传输。在React应用程序中,我们可以使用localStorage或Redux来管理我们的本地状态。虽然在某些情况下,使用localstorage能够满足我们的需求,但在更高级的应用程序中,使用Redux可能会更加适合。