在React使用开发中,理解何时以及如何保存或重置组件的状况是至关重要的。

理解React的状况保存机制

在React中,组件的状况(state)是与组件实例紧密相关的。React经过组件在UI树中的方位来决议是否保存状况。当组件在烘托过程中坚持在UI树的同一方位时,React会保存其状况。这意味着,如果你在两次烘托之间没有改动组件的方位或没有改动生成组件的要害特点(如key),那么组件的状况将被保存。

当你在React使用中烘托组件时,React会依据组件的方位来决议是否应该保存其内部状况。如果组件在UI树中的方位没有改动,React会认为它是同一个组件实例,并保存其状况。

技巧

  • 为了确保组件状况不被重置,你需求确保在不需求重置状况时,组件在UI树中的方位坚持不变。

示例

function App() {
  // Counter组件在UI树的相同方位
  return (
    <div>
      <Counter />
      <Counter />
    </div>
  );
}

在比如中,咱们有一个App组件,它烘托了两个Counter组件。因为这两个Counter组件在每次烘托时都处于UI树的相同方位,React将会保存它们的状况。

注意事项

  • 如果你决议移除一个组件,那么它的状况也会随之销毁。当组件从UI树中移除后,如果再次将其添加回来,它将是一个全新的组件实例,带有初始状况。

正确代码

// 显现或躲藏第二个计数器,但不改动第一个计数器的状况
function App() {
  const [showSecondCounter, setShowSecondCounter] = useState(true);
  return (
    <div>
      <Counter />
      {showSecondCounter && <Counter />}
    </div>
  );
}

在这个比如中,咱们经过一个布尔状况showSecondCounter来操控第二个Counter组件的显现与躲藏。当咱们切换这个状况时,第一个Counter组件的状况不会受到影响,因为它的方位没有改动。

过错代码

// 过错:每次App组件烘托时,Counter组件都会被重新创建,导致状况重置
function App() {
  return (
    <div>
      <Counter key={Date.now()} />
    </div>
  );
}

在过错示例中,每次App组件烘托时,都会给Counter组件一个根据当时时刻的新key。这导致React认为它是一个全新的组件实例,而且每次都会重置它的状况。

强制重置组件状况

有时候,咱们需求在组件坚持在同一方位时重置其状况。

技巧

  • 使用不同的key特点来强制React重置组件状况。

示例

function Scoreboard() {
  const [player, setPlayer] = useState('PlayerA');
  return (
    <div>
      {/* 经过改动key来重置Counter组件的状况 */}
      {player === 'PlayerA' ? <Counter key="PlayerA" /> : <Counter key="PlayerB" />}
      <button onClick={() => setPlayer(player === 'PlayerA' ? 'PlayerB' : 'PlayerA')}>
        切换玩家
      </button>
    </div>
  );
}

注意事项

  • key特点不是全局唯一的,只在其父组件中标识唯一性。

正确代码

// 使用key特点来区别不同的Counter实例
<Counter key="PlayerA" />
<Counter key="PlayerB" />

过错代码

// 过错:没有使用key特点,React会认为是同一个Counter实例
<Counter />
<Counter />

避免无意中重置状况

在某些情况下,咱们可能无意中重置了组件的状况,这通常是因为不恰当的组件结构或key的使用。

技巧

  • 避免在组件内部界说其他组件,这可能会导致状况意外重置。

示例

// 正确:将MyTextField界说在MyComponent外部
function MyTextField() {
  const [text, setText] = useState('');
  return <input value={text} onChange={e => setText(e.target.value)} />;
}
function MyComponent() {
  const [counter, setCounter] = useState(0);
  return (
    <>
      <MyTextField />
      <button onClick={() => setCounter(counter + 1)}>
        点击了{counter}次
      </button>
    </>
  );
}

注意事项

  • 确保组件界说在其使用的最外层效果域中。

正确代码

// MyTextField界说在MyComponent外部,避免了状况重置
function MyTextField() { /* ... */ }
function MyComponent() { /* ... */ }

过错代码

// 过错:MyTextField界说在MyComponent内部,每次烘托都会重置状况
function MyComponent() {
  function MyTextField() { /* ... */ }
  // ...
}

经过遵从这些技巧和注意事项,你能够更好地操控React组件的状况保存和重置,然后创建出更稳定和可预测的用户界面。记住,合理地使用key特点和组件方位是管理状况的要害。