React保留和重置状态

简介: React保留和重置状态

保留和重置状态

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

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

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>
  );
}


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