React Context API - 在页面刷新时保留数据
React Context API - persist data on page refresh
假设我们设置了上下文提供程序以及一些初始数据 属性 值。
假设某个消费者随后修改了这些属性。
页面重新加载时,这些更改将丢失。持久化数据以便我们保留这些数据修改的最佳方式是什么?除了简单的本地存储之外还有其他方法吗?
是的,如果您希望数据在重新加载后保持不变,您的选择是将该信息存储在服务器端(通过 api 调用)或浏览器存储(本地存储、会话存储、饼干)。您要使用的选项取决于您希望达到的持久性级别。无论选择哪种存储方式,它都可能看起来类似于
const MyContext = React.createContext(defaultValue);
class Parent extends React.Component {
setValue = (value) => {
this.setState({ value });
}
state = {
setValue: this.setValue,
value: localStorage.getItem("parentValueKey")
}
componentDidUpdate(prevProps, prevState) {
if (this.state.value !== prevState.value) {
// Whatever storage mechanism you end up deciding to use.
localStorage.setItem("parentValueKey", this.state.value)
}
}
render() {
return (
<MyContext.Provider value={this.state}>
{this.props.children}
</MyContext.Provider>
)
}
}
上下文不会以您想要的方式持续存在。这是我所做的示例,使用带有 React 挂钩的无状态函数。
import React, {useState, useEffect} from 'react'
export function sample(){
// useState React hook
const [data, setData] = useState({})
const [moreData, setMoreData] = useState([])
// useState React hook
useEffect(() => {
setData({test: "sample", user: "some person"})
setMoreData(["test", "string"])
}, [])
return data, moreData
}
export const AppContext = React.createContext()
export const AppProvider = props => (
<AppContext.Provider value={{ ...sample() }}>
{props.children}
</AppContext.Provider>
)
从一开始就了解这是一种解决方法,而不是永久解决方案。持久化数据是数据库的工作,而不是客户端。但是,如果您需要持久化数据进行开发,这是一种方法。首先请注意,我使用的是 React hooks。从 16.8 开始,这是一个完全支持的功能。 useEffect()
替换了 class 声明中的生命周期方法,就像上面的 TLadd 一样。他用 componentDidUpdate
来坚持。最新的方法是 useEffect
。当应用程序刷新时,将调用此方法并在上下文中设置一些硬编码数据。
要使用提供商:
import React from 'react'
import Component from './path/to/component'
import { AppProvider } from './path/to/context'
const App = () => {
return (
<AppProvider>
<Component />
</AppProvider>
)
}
当您刷新时,data
和 moreData
仍将具有您分配给它们的任何默认值。
我假设您已经熟悉设置上下文和设置上下文提供程序。
您可以做的一件事是将值存储在浏览器的 Cookie 或您可用的任何存储中,然后在您的 Context Provider 中检索该值,如果可以找到它,则设置它,如果没有,请设置默认值。如果提供程序文件是基于 class 的组件,您希望在 constructor()
中检索此值,否则如果它是功能性的,您可以使用 useLayoutEffect()
来设置它。
假设我们设置了上下文提供程序以及一些初始数据 属性 值。
假设某个消费者随后修改了这些属性。
页面重新加载时,这些更改将丢失。持久化数据以便我们保留这些数据修改的最佳方式是什么?除了简单的本地存储之外还有其他方法吗?
是的,如果您希望数据在重新加载后保持不变,您的选择是将该信息存储在服务器端(通过 api 调用)或浏览器存储(本地存储、会话存储、饼干)。您要使用的选项取决于您希望达到的持久性级别。无论选择哪种存储方式,它都可能看起来类似于
const MyContext = React.createContext(defaultValue);
class Parent extends React.Component {
setValue = (value) => {
this.setState({ value });
}
state = {
setValue: this.setValue,
value: localStorage.getItem("parentValueKey")
}
componentDidUpdate(prevProps, prevState) {
if (this.state.value !== prevState.value) {
// Whatever storage mechanism you end up deciding to use.
localStorage.setItem("parentValueKey", this.state.value)
}
}
render() {
return (
<MyContext.Provider value={this.state}>
{this.props.children}
</MyContext.Provider>
)
}
}
上下文不会以您想要的方式持续存在。这是我所做的示例,使用带有 React 挂钩的无状态函数。
import React, {useState, useEffect} from 'react'
export function sample(){
// useState React hook
const [data, setData] = useState({})
const [moreData, setMoreData] = useState([])
// useState React hook
useEffect(() => {
setData({test: "sample", user: "some person"})
setMoreData(["test", "string"])
}, [])
return data, moreData
}
export const AppContext = React.createContext()
export const AppProvider = props => (
<AppContext.Provider value={{ ...sample() }}>
{props.children}
</AppContext.Provider>
)
从一开始就了解这是一种解决方法,而不是永久解决方案。持久化数据是数据库的工作,而不是客户端。但是,如果您需要持久化数据进行开发,这是一种方法。首先请注意,我使用的是 React hooks。从 16.8 开始,这是一个完全支持的功能。 useEffect()
替换了 class 声明中的生命周期方法,就像上面的 TLadd 一样。他用 componentDidUpdate
来坚持。最新的方法是 useEffect
。当应用程序刷新时,将调用此方法并在上下文中设置一些硬编码数据。
要使用提供商:
import React from 'react'
import Component from './path/to/component'
import { AppProvider } from './path/to/context'
const App = () => {
return (
<AppProvider>
<Component />
</AppProvider>
)
}
当您刷新时,data
和 moreData
仍将具有您分配给它们的任何默认值。
我假设您已经熟悉设置上下文和设置上下文提供程序。
您可以做的一件事是将值存储在浏览器的 Cookie 或您可用的任何存储中,然后在您的 Context Provider 中检索该值,如果可以找到它,则设置它,如果没有,请设置默认值。如果提供程序文件是基于 class 的组件,您希望在 constructor()
中检索此值,否则如果它是功能性的,您可以使用 useLayoutEffect()
来设置它。