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

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

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

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>CounterpCounter此外,当您在同一位置渲染不同的组件时,它会重置其整个子树的状态。要了解其工作原理,请递增计数器,然后勾选复选框:

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 中移除时,它下面的整棵树(包括它的状态)也被破坏了。CounterdivdivsectiondivCounter

相关文章
|
3月前
51开发板独立按键调节时钟的应用实验、可以使用独立按键进行时间的调节(可对时间重新自定义)
51开发板独立按键调节时钟的应用实验、可以使用独立按键进行时间的调节(可对时间重新自定义)
|
5月前
|
前端开发
React同一位置的相同组件保留状态
React同一位置的相同组件保留状态
|
6月前
|
前端开发
在有状态组件中使用forceUpdate()方法重新渲染
在React类组件中使用`forceUpdate()`重新渲染的步骤包括:继承`React.Component`,定义`updateComponent`方法调用`forceUpdate`,并在模块热替换回调中调用此方法。示例代码展示了如何实现。注意,这种方式需要手动创建和管理组件实例,不适合React Hooks,应优先考虑使用`useState`或`useReducer`来更新状态并触发渲染。
|
6月前
Rockchip系列之LED状态灯 CAN收发数据流程以及控制状态显示(4)
Rockchip系列之LED状态灯 CAN收发数据流程以及控制状态显示(4)
145 3
|
6月前
|
C语言
独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”
独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”
|
6月前
|
JavaScript UED
Vue中如何监听窗口尺寸变化?
Vue中如何监听窗口尺寸变化?
1135 4
|
前端开发 API
Electron 渲染进程之间互相通信 创建窗口时触发
Electron 渲染进程之间互相通信 创建窗口时触发
|
缓存 前端开发
React在定时器中无法获取状态最新值
React在定时器中无法获取状态最新值问题解决记录
194 1
|
前端开发
【React工作记录五十三】键盘绑定按下事件
【React工作记录五十三】键盘绑定按下事件
139 0