如何在 React.js 中刷新页面后保持状态?

IT技术 javascript reactjs
2021-02-02 13:54:12

假设我有为上一页选择的选择框设置状态的代码:

this.setState({selectedOption: 5});

有没有办法this.state.selectedOption在页面刷新后填充 5?

是否有回调可用于将其保存在 localStorage 中,然后执行一个大的回调,setState或者是否有执行此类操作的标准方法?

6个回答

所以我的解决方案是localStorage在设置状态时也设置,然后从回调localStorage内部再次获取值,getInitialState如下所示:

getInitialState: function() {
    var selectedOption = localStorage.getItem( 'SelectedOption' ) || 1;

    return {
        selectedOption: selectedOption
    };
},

setSelectedOption: function( option ) {
    localStorage.setItem( 'SelectedOption', option );
    this.setState( { selectedOption: option } );
}

我不确定这是否可以被视为反模式,但除非有更好的解决方案,否则它可以工作。

@CoryDanielson 那么推荐的方式应该是什么?
2021-03-13 13:54:12
如果输入是表单(或一组相关输入)的一部分,您可以将所有输入/值保存到单个对象中,然后 JSON.stringify 对象并将字符串存储在 localStorage 中
2021-03-23 13:54:12
如果您替换localStoragesessionStorage您为每个选项卡获得单独的状态,则避免跨选项卡的冲突
2021-04-04 13:54:12
我认为有点“反模式”的唯一部分是您的组件在 localStorage 中保持它自己的状态。如果这个组件被多次使用,那么你将不得不处理键冲突。Imo,如此重要的信息(需要持久保存到 localStorage)可能应该在应用程序架构中向上移动到更高的状态或数据层......但这是完成工作的最简单方法,直到细节工作出去
2021-04-09 13:54:12
如果您想使用 localStorage 以在同一组件的多个实例中安全的方式保存状态,您可以为每个组件提供一个唯一的 ID,然后使用该 ID 作为 localStorage 中的键 - 就像 ${this.props.id}.SelectedOption
2021-04-10 13:54:12

您可以像 Omar 建议的那样使用本地存储“持久化”状态,但应该在设置状态后完成。为此,您需要将回调传递给该setState函数,并且需要对放入本地存储的对象进行序列化和反序列化。

constructor(props) {
  super(props);
  this.state = {
    allProjects: JSON.parse(localStorage.getItem('allProjects')) || []
  }
}


addProject = (newProject) => {
  ...

  this.setState({
    allProjects: this.state.allProjects.concat(newProject)
  },() => {
    localStorage.setItem('allProjects', JSON.stringify(this.state.allProjects))
  });
}

我们有一个应用程序,允许用户在页面中设置“参数”。我们所做的是在 URL 上设置这些参数,使用 React Router(结合 History)和一个库,该库将 JavaScript 对象 URI 编码为可用作查询字符串的格式。

当用户选择一个选项时,我们可以将其值推送到当前路由上:

history.push({pathname: 'path/', search: '?' + Qs.stringify(params)});

pathname可以是当前路径。在你的情况下params看起来像:

{
  selectedOption: 5
}

然后在 React 树的顶层,React Router 将props使用location.search我们之前设置的编码值的 prop更新该组件的,所以会有componentWillReceiveProps类似的东西

params = Qs.parse(nextProps.location.search.substring(1));
this.setState({selectedOption: params.selectedOption});

然后该组件及其子组件将使用更新的设置重新渲染。由于信息位于 URL 上,因此可以将其添加为书签(或通过电子邮件发送 - 这是我们的用例),刷新将使应用程序处于相同状态。这对我们的应用程序来说非常有效。

react-router:https : //github.com/reactjs/react-router

历史:https : //github.com/ReactTraining/history

查询字符串库:https : //github.com/ljharb/qs

这可以用于大型阵列吗?
2021-03-20 13:54:12
这应该是公认的解决方案,而不是保存到本地存储,这并不总是可行的并且会减慢应用程序的速度。我会尝试应用这个,谢谢。
2021-03-28 13:54:12

我认为状态仅用于查看信息,并且应该在视图状态之外持续存在的数据最好存储为props。当您希望能够链接到一个页面或将 URL 共享到应用程序深处时,URL 参数很有用,但否则地址栏会变得混乱。

看看 Redux-Persist(如果您使用的是 redux)https://github.com/rt2zz/redux-persist

如果存在,则从 localStorage加载状态

constructor(props) {
    super(props);           
    this.state = JSON.parse(localStorage.getItem('state'))
        ? JSON.parse(localStorage.getItem('state'))
        : initialState

覆盖this.setState在每次更新后自动保存状态

const orginial = this.setState;     
this.setState = function() {
    let arguments0 = arguments[0];
    let arguments1 = () => (arguments[1], localStorage.setItem('state', JSON.stringify(this.state)));
    orginial.bind(this)(arguments0, arguments1);
};