reactjs - 刷新后如何将数据保存在localStorage中?
问题描述
我正在使用 react 来编写一个子组件。此子组件从其父组件获取其状态。
Class ChildDetails extends Component{
constructor(props) {
super(props);
this.state = {
messageId: this.props.messageId,
};
}
componentDidMount() {
localStorage.setItem("messageId", this.props.messageId);
}
}
我确信在第一次渲染 Child 组件时,数据会存储到 localStorage 中。但是当我想在刷新页面后从localStorage中获取数据时,localStorage被清除了。我想可能是因为我使用的是本地开发环境,我使用
localhost:3000
访问我的应用程序。但我不知道为什么。
我的 Parent 组件是根 App,我Route
用来将数据传递给 Child 组件。数据来自redux
商店。
<Route
path="/messageDetails"
render={(props) => (
<Child
{...props}
messageId={this.props.messageId}
/>
)}
></Route>
const mapStateToProps = (state) => {
messageId: state.Reducer.messageId,
}
解决方案
当您刷新浏览器时,您的组件将重新渲染并调用 componentDidMount 生命周期方法。所以我认为错误可能来自您messageId
可能未定义的事实。避免这种情况的一种方法是添加条件,这样如果您在 localStorage 中有一个项目,它就不会尝试设置它。
Class ChildDetails extends Component{
constructor(props) {
super(props);
this.state = {
messageId: this.props.messageId,
};
}
componentDidMount() {
if(!localStorage.getItem("messageId")){
localStorage.setItem("messageId", this.props.messageId);
}
}
}
顺便说一句,我建议不要将 messageId 保存到 ChildDetails 状态,因为 redux 的目的是将状态放置在中心位置并在必要时将其馈送到组件中。
推荐阅读
- java - Mapstruct 隐式调用具有多个参数的其他映射器
- javascript - 标签点击上的触发器(“更改”)不起作用
- c# - 服务器返回对象的普通列表而不是 ODATA 信封
- c++ - 如何在我的代码中调用默认 Windows 凭据?
- excel - Excel 二次排序不起作用。手动或使用 VBA 有什么解决方法吗?
- c# - 在接收命令时通过 TCP 发送字符串
- javascript - 如何使用 JavaScript 将 ChargeBee 链接添加到 HTML 元素?
- java - JND InvalidSearchFilterException - 如何在 LDAP 中搜索规范名称?
- python - 在 plt.plot 上将 pd.Grouper 转换为人类可读的格式
- c++ - 结构/类的名称,进行编译时计算