javascript - 如何在挂载/卸载之间保持 React 组件状态?

标签 javascript reactjs

我有一个简单的组件 <StatefulView>保持内部状态。我有另一个组件 <App>切换是否 <StatefulView>被渲染。

但是,我想保留<StatefulView>安装/卸载之间的内部状态。

我想我可以实例化 <App> 中的组件然后控制是否渲染/挂载。

var StatefulView = React.createClass({
  getInitialState: function() {
    return {
      count: 0
    }
  },
  inc: function() {
    this.setState({count: this.state.count+1})
  },
  render: function() {
    return (
        <div>
          <button onClick={this.inc}>inc</button>
          <div>count:{this.state.count}</div>
        </div>
    )
  }
});

var App = React.createClass({
  getInitialState: function() {
    return {
      show: true,
      component: <StatefulView/>
    }
  },
  toggle: function() {
    this.setState({show: !this.state.show})
  },
  render: function() {
    var content = this.state.show ? this.state.component : false
    return (
      <div>
        <button onClick={this.toggle}>toggle</button>
        {content}
      </div>
    )
  }
});

这显然不起作用,新的 <StatefulView>在每次切换时创建。

这是一个 JSFiddle .

有没有办法在卸载后卡在同一个组件上以便重新安装?

最佳答案

由于在卸载时无法将状态保留在组件本身中,因此您必须决定应该将其保存在何处。

这些是您的选择:

  1. React state in parent:如果父组件保持挂载状态,它可能应该是状态的所有者,或者可以为下面不受控制的组件提供初始状态。您可以在组件卸载之前将值传回。使用 React 上下文,您可以将状态提升到应用程序的最顶部(参见例如 unstated)。
  2. 在 React 之外:例如use-local-storage-state .请注意,您可能需要在测试之间手动重置状态。其他选项包括 URL 中的查询参数、MobX 或 Redux 等状态管理库等。

我知道你正在寻找一个简单的解决方案,其中数据在 React 之外持久化,这个 Hook 可能会派上用场:

const memoryState = {};

function useMemoryState(key, initialState) {
  const [state, setState] = useState(() => {
    const hasMemoryValue = Object.prototype.hasOwnProperty.call(memoryState, key);
    if (hasMemoryValue) {
      return memoryState[key]
    } else {
      return typeof initialState === 'function' ? initialState() : initialState;
    }
  });

  function onChange(nextState) {
    memoryState[key] = nextState;
    setState(nextState);
  }

  return [state, onChange];
}

用法:

const [todos, setTodos] = useMemoryState('todos', ['Buy milk']);

关于javascript - 如何在挂载/卸载之间保持 React 组件状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31352261/

相关文章:

reactjs - React 中 Immutable.js 序列的循环计数错误

javascript - 从 JavaScript 中的数组中获取最大值和最小值

javascript - 为什么 bootstrap 网格类会阻止我的 highchart 图表呈现?

javascript - LG Webos TV 项目单击按钮后传递参数或消息

reactjs - React 16 类型 'DetailedHTMLProps, HTMLDivElement>' 上不存在属性

javascript - 每次我传递给组件的 prop 值发生变化时,如何在组件中调用 componentDidMount

javascript - 更新 React Firestore 中嵌套数组中对象的值

javascript - 复制具有不同名称的对象属性的最快方法?

javascript - jquery 单独切换

javascript - 在 react.js 中使用没有这个的 setState