react保留和重置状态

简介: react保留和重置状态

保留和重置状态

状态在组件之间是隔离的。React 根据它们在 UI 树中的位置来跟踪哪个状态属于哪个组件。您可以控制何时保留状态以及何时在重新渲染之间重置状态。

您将学习

  • 当 React 选择保留或重置状态时
  • 如何强制 React 重置组件的状态
  • 键和类型如何影响是否保留状态

状态绑定到渲染树中的位置

React 为 UI 中的组件结构构建渲染树

当您给出组件状态时,您可能会认为该状态“存在于”组件内部。但状态实际上是在 React 内部保存的。React 通过该组件在渲染树中的位置将它所持有的每个状态片段与正确的组件相关联。

在这里,只有一个 JSX 标签,但它呈现在两个不同的位置:<Counter />

import { useState } from 'react';
 
export default function App() {
  const counter = <Counter />;
  return (
    <div>
      {counter}
      {counter}
    </div>
  );
}
 
function Counter() {
  const [score, setScore] = useState(0);
  const [hover, setHover] = useState(false);
 
  let className = 'counter';
  if (hover) {
    className += ' hover';
  }
 
  return (
    <div
      className={className}
      onPointerEnter={() => setHover(true)}
      onPointerLeave={() => setHover(false)}
    >
      <h1>{score}</h1>
      <button onClick={() => setScore(score + 1)}>
        Add one
      </button>
    </div>
  );
}

下面是它们看起来像一棵树的样子:

反应树

这是两个独立的计数器,因为每个计数器都呈现在树中自己的位置。使用 React 通常不需要考虑这些位置,但了解它的工作原理会很有用。

在 React 中,屏幕上的每个组件都具有完全隔离的状态。例如,如果并排渲染两个组件,则每个组件都将获得自己的独立和状态。Counterscorehover

尝试单击两个计数器,并注意它们不会相互影响:

import { useState } from 'react';
 
export default function App() {
  return (
    <div>
      <Counter />
      <Counter />
    </div>
  );
}
 
function Counter() {
  const [score, setScore] = useState(0);
  const [hover, setHover] = useState(false);
 
  let className = 'counter';
  if (hover) {
    className += ' hover';
  }
 
  return (
    <div
      className={className}
      onPointerEnter={() => setHover(true)}
      onPointerLeave={() => setHover(false)}
    >
      <h1>{score}</h1>
      <button onClick={() => setScore(score + 1)}>
        Add one
      </button>
    </div>
  );
}

如您所见,当一个计数器更新时,仅更新该组件的状态:

更新状态

只要你在树中的同一位置渲染相同的组件,React 就会保持状态。要查看这一点,请递增两个计数器,然后通过取消选中“渲染第二个计数器”复选框来删除第二个组件,然后再次勾选它来重新添加它:

import { useState } from 'react';
 
export default function App() {
  const [showB, setShowB] = useState(true);
  return (
    <div>
      <Counter />
      {showB && <Counter />} 
      <label>
        <input
          type="checkbox"
          checked={showB}
          onChange={e => {
            setShowB(e.target.checked)
          }}
        />
        Render the second counter
      </label>
    </div>
  );
}
 
function Counter() {
  const [score, setScore] = useState(0);
  const [hover, setHover] = useState(false);
 
  let className = 'counter';
  if (hover) {
    className += ' hover';
  }
 
  return (
    <div
      className={className}
      onPointerEnter={() => setHover(true)}
      onPointerLeave={() => setHover(false)}
    >
      <h1>{score}</h1>
      <button onClick={() => setScore(score + 1)}>
        Add one
      </button>
    </div>
  );
}

请注意,当您停止渲染第二个计数器时,其状态将完全消失。这是因为当 React 删除一个组件时,它会破坏它的状态。

删除组件

当您勾选“渲染第二个计数器”时,第二个计数器及其状态将从头开始初始化 () 并添加到 DOM 中。Counterscore = 0

添加组件

React 会保留组件的状态,只要它在 UI 树中的位置被渲染。如果它被删除,或者不同的组件在同一位置被渲染,React 就会丢弃它的状态。

相关文章
|
3月前
|
前端开发 JavaScript
react hooks深拷贝后无法保留视图状态
react hooks深拷贝后无法保留视图状态
105 58
|
4月前
|
前端开发 JavaScript
react hooks深拷贝后无法保留视图状态
react hooks深拷贝后无法保留视图状态
|
6月前
|
前端开发
React同一位置的相同组件保留状态
React同一位置的相同组件保留状态
|
6月前
|
前端开发
React保留和重置状态
React保留和重置状态
|
前端开发
前端项目实战叁拾陆-​react-admin+material ui-侧边栏样式设定重置
前端项目实战叁拾陆-​react-admin+material ui-侧边栏样式设定重置
83 0
|
前端开发
#yyds干货盘点 【React工作记录二十八】重置ant design得样式
#yyds干货盘点 【React工作记录二十八】重置ant design得样式
98 0
#yyds干货盘点 【React工作记录二十八】重置ant design得样式
|
前端开发 JavaScript 数据安全/隐私保护
react + zarm + rc-form + crypto-js 实现个人中心页面,头像上传,密码重置,登录退出功能
react + zarm + rc-form + crypto-js 实现个人中心页面,头像上传,密码重置,登录退出功能
158 0
react + zarm + rc-form + crypto-js 实现个人中心页面,头像上传,密码重置,登录退出功能
|
1月前
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
77 9
|
2月前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
25天前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
94 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生