react不同元件处于同一位置复位状态

勾选复选框将替换为:<Counter>``<p>

javascript 复制代码
import { useState } from 'react';

export default function App() {
  const [isPaused, setIsPaused] = useState(false);
  return (
    <div>
      {isPaused ? (
        <p>See you later!</p> 
      ) : (
        <Counter /> 
      )}
      <label>
        <input
          type="checkbox"
          checked={isPaused}
          onChange={e => {
            setIsPaused(e.target.checked)
          }}
        />
        Take a break
      </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 会从 UI 树中删除 并销毁其状态。<div>``Counter``pCounter此外,**当您在同一位置渲染不同的组件时,它会重置其整个子树的状态。**要了解其工作原理,请递增计数器,然后勾选复选框:

javascript 复制代码
import { useState } from 'react';

export default function App() {
  const [isFancy, setIsFancy] = useState(false);
  return (
    <div>
      {isFancy ? (
        <div>
          <Counter isFancy={true} /> 
        </div>
      ) : (
        <section>
          <Counter isFancy={false} />
        </section>
      )}
      <label>
        <input
          type="checkbox"
          checked={isFancy}
          onChange={e => {
            setIsFancy(e.target.checked)
          }}
        />
        Use fancy styling
      </label>
    </div>
  );
}

function Counter({ isFancy }) {
  const [score, setScore] = useState(0);
  const [hover, setHover] = useState(false);

  let className = 'counter';
  if (hover) {
    className += ' hover';
  }
  if (isFancy) {
    className += ' fancy';
  }

  return (
    <div
      className={className}
      onPointerEnter={() => setHover(true)}
      onPointerLeave={() => setHover(false)}
    >
      <h1>{score}</h1>
      <button onClick={() => setScore(score + 1)}>
        Add one
      </button>
    </div>
  );
}

单击该复选框时,计数器状态将重置。虽然你渲染了 ,但从 a 变为 a 的第一个子项。当子项从 DOM 中移除时,它下面的整棵树(包括它的状态)也被破坏了。Counter``div``div``section``div``Counter

相关推荐
大怪v4 小时前
AI抢饭?前端佬:我要验牌!
前端·人工智能·程序员
新酱爱学习4 小时前
字节外包一年,我的技术成长之路
前端·程序员·年终总结
小兵张健4 小时前
开源 playwright-pool 会话池来了
前端·javascript·github
IT_陈寒7 小时前
Python开发者必知的5大性能陷阱:90%的人都踩过的坑!
前端·人工智能·后端
codingWhat7 小时前
介绍一个手势识别库——AlloyFinger
前端·javascript·vue.js
Lee川7 小时前
深度拆解:基于面向对象思维的“就地编辑”组件全模块解析
javascript·架构
代码老中医8 小时前
2026年CSS彻底疯了:这6个新特性让我删掉了三分之一JS代码
前端
进击的尘埃8 小时前
Web Worker 与 OffscreenCanvas:把主线程从重活里解放出来
javascript
不会敲代码18 小时前
Zustand:轻量级状态管理,从入门到实践
前端·typescript
踩着两条虫8 小时前
VTJ.PRO 双向代码转换原理揭秘
前端·vue.js·人工智能