默认情况下,React 会在组件停留在同一位置时保留其状态。通常,这正是您想要的,因此将其作为默认行为是有意义的。
示例取自新的React 文档。
Example 1 - the same position,codesandbox,(相关代码):
Example 1 - the same position
return ( <div> {isPlayerA ? ( <Counter person="Taylor" /> ) : ( <Counter person="Sarah" /> )} <button onClick={() => { setIsPlayerA(!isPlayerA); }}> Next player! </button> </div> );
Example 2 - different position,codesandbox,(相关代码):
Example 2 - different position
return ( <div> {isPlayerA && <Counter person="Taylor" /> } {!isPlayerA && <Counter person="Sarah" /> } <button onClick={() => { setIsPlayerA(!isPlayerA); }}> Next player! </button> </div> );
我很困惑为什么位置Example 2被视为不同?在两种情况下,只有一个Counter 组件被渲染。我遗漏了什么?
Example 2
Counter
示例 1 可以像这样替换。
return ( <div> <Counter person={isPlayerA ? "Taylor" : "Sarah"} /> {/* isPlayerA ? ( <Counter person="Taylor" /> ) : ( <Counter person="Sarah" /> ) */} <button onClick={() => { setIsPlayerA(!isPlayerA); }}> Next player! </button> </div> );
<Counter />不会被卸载,因为只有person道具发生了变化。
<Counter />
person
但示例2不同。
有 2 个<Counter />,它们处于已安装/未安装状态