假设我们设置了一个上下文提供程序,以及一些初始数据属性值。在这个过程中的某个地方,假设消费者修改了这些属性。重新加载页面时,这些更改将丢失。保存数据以便保留这些数据修改的最佳方法是什么?除了本地存储之外,还有其他方法吗?
7bsow1i61#
是的,如果您希望数据在重新加载过程中保持不变,您可以选择将该信息存储在服务器端(通过api调用)或浏览器存储中(本地存储、会话存储、cookie)。您希望使用的选项取决于您希望实现的持久性级别。无论存储选择如何,它看起来都可能与
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> ) } }
olmpazwi2#
上下文不会以您想要的方式持续存在。下面是我所做的一个示例,使用带有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钩子。从16.8开始,这是一项完全受支持的功能。这个 useEffect() 替换类似于上面tladd的类声明中的生命周期方法。他正在使用 componentDidUpdate 坚持。最新的方法是 useEffect . 当应用程序刷新时,将调用此方法并在上下文中设置一些硬编码数据。要使用提供程序,请执行以下操作:
useEffect()
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 将仍然具有您指定给它们的任何默认值。
data
moreData
2条答案
按热度按时间7bsow1i61#
是的,如果您希望数据在重新加载过程中保持不变,您可以选择将该信息存储在服务器端(通过api调用)或浏览器存储中(本地存储、会话存储、cookie)。您希望使用的选项取决于您希望实现的持久性级别。无论存储选择如何,它看起来都可能与
olmpazwi2#
上下文不会以您想要的方式持续存在。下面是我所做的一个示例,使用带有react钩子的无状态函数。
从一开始就要明白,这是一种变通办法,而不是永久性的解决方案。持久化数据是数据库的工作,而不是客户端的工作。但是,如果开发需要持久化数据,这是一种方法。首先请注意,我使用的是react钩子。从16.8开始,这是一项完全受支持的功能。这个
useEffect()
替换类似于上面tladd的类声明中的生命周期方法。他正在使用componentDidUpdate
坚持。最新的方法是useEffect
. 当应用程序刷新时,将调用此方法并在上下文中设置一些硬编码数据。要使用提供程序,请执行以下操作:
当你刷新时,
data
及moreData
将仍然具有您指定给它们的任何默认值。