You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

条件渲染同一输入组件时不同defaultValue引发异常的原因是什么?

注意: 本问题旨在理解为何此代码会出现该行为,而非寻求实现预期效果的替代代码。

我自定义了一个用于表单字段的组件,希望根据不同条件渲染它并传入不同props(实际场景中props差异更多,此处简化为仅defaultValue不同),示例代码如下:

function DummyInput({defaultValue}) {
  console.log(defaultValue)
  return (
    <input defaultValue={defaultValue}/>
  )
}

function Picker({setContentOption}){
  const handleOptionChange = (event) => {
    setContentOption(event.target.value);
  };
  return (
    <div>
      <select onChange={handleOptionChange}>
        <option value="content-A">content-A</option>
        <option value="content-B">content-B</option>
        <option value="content-C">content-C</option>
      </select>
    </div>
  )
}

function App() {
  const [contentOption, setContentOption] = React.useState('content-A')
  let inputField = null
  
  if (contentOption === 'content-A'){
    inputField = <DummyInput defaultValue="A"></DummyInput>
  } else if (contentOption === 'content-B'){
    inputField = <DummyInput defaultValue="B"></DummyInput>
  } else if (contentOption === 'content-C'){
    inputField = <DummyInput defaultValue="C"></DummyInput>
  }
  
  return (
    <div>
      <div>注意控制台会打印三次,这意味着三种情况的代码都执行了,但只有第三种方式会重新渲染组件</div>
      <br/>
      <Picker setContentOption={setContentOption}/>
      <br/>
      
      <div>无效 - 函数体内的if/else语句方式</div>
      {inputField}
      
      <div>无效 - 内联if/else语句方式</div>
      {(contentOption === 'content-A') && (
        <DummyInput defaultValue="A"></DummyInput>
      ) || (contentOption === 'content-B') && (
        <DummyInput defaultValue="B"></DummyInput>
      ) || (contentOption === 'content-C') && (<DummyInput defaultValue="C"></DummyInput>)}
      
      <div>有效 - 三个独立的内联if语句方式</div>
      {contentOption === 'content-A' && <DummyInput defaultValue="A"></DummyInput>}
      {contentOption === 'content-B' && <DummyInput defaultValue="B"></DummyInput>}
      {contentOption === 'content-C' && <DummyInput defaultValue="C"></DummyInput>}
    </div>
  );
}

ReactDOM.render(<App />, document.querySelector("#app"))

该应用根据父组件App的contentOption状态,渲染带有不同defaultValue的DummyInput组件。我原本预期无论使用哪种条件渲染方式,defaultValue都会随状态变化而更新,但发现:

  • 通过if-else语句将组件赋值给inputField变量、使用内联或运算的条件渲染这两种方式均不生效
  • 使用三个独立的&&条件渲染时组件能正常更新

在DummyInput中添加console.log后发现,即使组件未用更新后的defaultValue重新渲染,组件内部代码仍会执行。

此外,为DummyInput添加key属性后问题解决,但我不理解为何在非map场景下需要key,也不清楚为何三个独立的&&条件渲染能生效。希望了解该行为的原因,避免在其他场景中出现类似问题。

相关问题

本问题与两个Stack Overflow问题类似。


内容的提问来源于Stack Exchange,提问作者Manuel Lera Ramírez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 12:04:55