这可能是一个有点高级的问题:

React说:如果有两个<Counter />组件,但如果任何一个在同一DOM树位置,它被视为同一个组件,因此没有卸载,状态将保持不变:

Reaction文档:https://react.dev/learn/preserving-and-resetting-state#same-component-at-the-same-position-preserves-state

代码:

export default function App() {
  const [isFancy, setIsFancy] = useState(false);
  return (
    <div>
      {isFancy ? (
        <Counter isFancy={true} /> 
      ) : (
        <Counter isFancy={false} /> 
      )}
      <label>
        <input
        ...

(注意:我们不会这样写代码.在现实生活中,我们可能只写一行:<Counter isFancy={isFancy} />,但这只是为了显示效果.

我还在Codesandbox上放了两个演示.以类似的方式书写,并与doctor 所说的一致:

https://codesandbox.io/p/sandbox/romantic-clarke-wtzdcc?file=%2Fsrc%2FApp.js

https://codesandbox.io/p/sandbox/rough-fast-d29rn7?file=%2Fsrc%2FApp.js

这似乎是一条奇怪的规则,因为它们实际上是两个实例,但如果这就是Reaction的工作原理,那就这样吧.

然而,如果我试着用一种稍微不同的方式来写它:

https://codesandbox.io/p/sandbox/musing-sea-mz3qq4?file=%2Fsrc%2FApp.js

  return (
    <div className="App">
      {isFancy && <Counter isFancy={true} />}
      {!isFancy && <Counter isFancy={false} />}
      {theToggle}
    </div>
  );

然后突然之间,如果我切换到"Fancy or Not",计数器就会自动重置.(如果我将计数增加到3,并切换它.现在计数将重置为0).

为什么会这样呢?

再思考P.S.个问题:

真的,每次重新渲染App,Counter实际上都是一个全新创建的实例,即使它很简单:

return <Counter isFancy={isFancy} />;

因此,Reaction并不关心它是不是一个新实例.它只关心在这个位置上它是否是具有该名称的组件.

推荐答案

我可能完全错了,但我认为react 是有区别的

在本例中:

<div className="App">
  {isFancy && <Counter isFancy={true} />}
  {!isFancy && <Counter isFancy={false} />}
  {theToggle}
</div>

React会看到:

[false, Counter component, some jsx]

还有这里:

<div className="App">
  {isFancy ? <Counter isFancy={true} /> : <Counter isFancy={false} />}
  {theToggle}
</div>
[Counter component, some jsx]

我知道doctor 清楚地说:

重要的是用户界面树中的位置,而不是JSX标记中的位置!

但也许它们对用户界面树的意义有所不同

Reactjs相关问答推荐

导致类型错误的调度不是函数";

Next.js-图像组件加载问题

Redux向后端发送请求时出现钩子问题

两条react 路由的行为不同.有没有人能解释一下,我已经找了好几天了

GitHub页面未正确显示Reaction应用程序网站

使用Ionic 7和React 18,如何访问历史对象以在页面之间导航?

React Router 6 点击链接在 React 18 应用中打开 flickr 页面

使用reactrouterdom时显示"对象无效作为React子组件"错误

useState数组不更新

在 React-Select 中显示多值的倒序

在react 中单击父级中的按钮时如何将数据从子级发送到父级?

如何禁用 redux-toolkit 的不可序列化值测试警告?

使用 axios 响应路由 Dom 操作

如何在 React Native 中更新跨屏幕呈现的上下文状态变量?

Github 页面无法正确呈现 CSS,因为它是本地的

react 测试显示错误的结果

如何使用 UseState 正确测试组件

React 检测哪些 props 在 useEffect 触发器上发生了变化

material uireact ,如何从表格中删除阴影?试图找到 api 但找不到正确的属性

在 React 中访问作为 prop 传递的状态变量