📅  最后修改于: 2023-12-03 14:46:58.564000             🧑  作者: Mango
React是一个流行的JavaScript库,用于构建大型Web应用程序。React使用单向数据流来组织应用程序中的状态和行为。在React的世界中,一切都是组件,并且组件的属性和状态都仅在它们内部可用。
然而,有时候我们需要在应用程序中存储数据,并在组件之间共享。这时候本地存储是一个好的选择。在本文中,我们将介绍如何在React中使用响应式本地存储。
本地存储是存储数据的一种方式,该数据可以直接从客户端浏览器中读取和写入。本地存储提供了一种简单而快捷的方式来存储和共享数据,这些数据可以在浏览器中进行跨页传输。
本地存储提供了两种主要的API:localStorage和sessionStorage。通常情况下,我们使用localStorage来存储用户偏好设置、应用程序状态等数据;而使用sessionStorage来存储会话级别的数据。
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钩子来存储数据。
如果我们要在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可能会更加适合。