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

React中如何实现选择select下拉选项后动态显示对应输入框

问题原因

你的代码问题出在多元素条件渲染的写法上:在JSX中直接用&&串联多个DOM元素时,会按照JavaScript逻辑与运算的规则,仅返回最后一个为真值的元素,所以选中2、3选项时仅能看到最后一个C字段输入框。

修复方案

方案1:最小改动适配

只需要把同条件下需要展示的多个输入框包裹在React Fragment(空标签<></>)中,替换原有的&&串联写法即可:

{/* 选中1的逻辑无需调整 */}
{select==="1"&& <div className="input">
  <label htmlFor="nome">C<sub>1</sub> =</label>
  <input className="fluxo1" type="number" id='fluxo1' required="required" value={FC1} onChange={(e)=> setFC1(e.target.value)}/>
</div>}
{/* 选中2的逻辑用Fragment包裹两个输入框 */}
{select==="2"&& <>
  <div className="input">
    <label htmlFor="nome">C<sub>1</sub> =</label>
    <input className="fluxo1" type="number" id='fluxo1' required="required" value={FC1} onChange={(e)=> setFC1(e.target.value)}/>
  </div>
  <div className="input">
    <label htmlFor="nome">C<sub>2</sub>  =</label>
    <input className="fluxo2" type="number" id='fluxo2' required="required" value={FC2} onChange={(e)=> setFC2(e.target.value)}/>
  </div>
</>}
{/* 选中3的逻辑同理 */}
{select==="3"&& <>
  <div className="input">
    <label htmlFor="nome">C<sub>1</sub> =</label>
    <input className="fluxo1" type="number" id='fluxo1' required="required" value={FC1} onChange={(e)=> setFC1(e.target.value)}/>
  </div>
  <div className="input">
    <label htmlFor="nome">C<sub>2</sub>  =</label>
    <input className="fluxo2" type="number" id='fluxo2' required="required" value={FC2} onChange={(e)=> setFC2(e.target.value)}/>
  </div>
  <div className="input">
    <label htmlFor="nome">C<sub>3</sub>  =</label>
    <input className="fluxo3" type="number" id='fluxo3' required="required" value={FC3} onChange={(e)=> setFC3(e.target.value)}/>
  </div>
</>}

方案2:优化版实现(推荐)

改用数组管理C字段的状态,通过循环生成输入框,避免重复冗余代码,后续需要扩展更多C字段时仅需调整下拉选项数量即可:

import React, {useState} from 'react';

function Calculo() {
  const [taxa, settaxa] = useState('');
  const [custos, setcustos] = useState('');
  // 用数组统一管理所有C字段值
  const [fcList, setFcList] = useState(['', '', '']);
  const [select, setSelect] = useState(0);
 
  const handleCapacity=(e)=>{
    setSelect(Number(e.target.value));
  }

  // 封装修改单个C字段值的公共方法
  const handleFcChange = (index, value) => {
    const newFcList = [...fcList];
    newFcList[index] = value;
    setFcList(newFcList);
  }

  return (
      <div className=''>
        <div className="input">
          <label>n° </label>
          <select value={select} onChange={handleCapacity}>
            <option value={1}>1</option>
            <option value={2}>2</option>
            <option value={3}>3</option>
          </select>
        </div>
        <div className="input">
          <label htmlFor="loteecocompra">A =</label>
          <input className="loteecocompra" type="number" id='loteecocompra' required="required" value={taxa} onChange={(e)=> settaxa(e.target.value)}/>
        </div>  
        <div className="input">
          <label htmlFor="custodepedido">B =</label>
          <input className="custodepedido" type="number" id='custodepedido' required="required" value={custos} onChange={(e)=> setcustos(e.target.value)}/>
        </div>  
        {/* 循环生成对应数量的C输入框 */}
        {Array.from({length: select}).map((_, index) => (
          <div className="input" key={index}>
            <label htmlFor={`fluxo${index+1}`}>C<sub>{index+1}</sub> =</label>
            <input 
              className={`fluxo${index+1}`} 
              type="number" 
              id={`fluxo${index+1}`} 
              required="required" 
              value={fcList[index]} 
              onChange={(e)=> handleFcChange(index, e.target.value)}
            />
          </div>
        ))}
      </div>
    );
}

export default Calculo

内容的提问来源于stack exchange,提问作者Mpimenta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:54:03