You need to enable JavaScript to run this app. React JS 如何正确将JSON数组值渲染到表单文本框并避免代码重复
优惠活动
大模型
产品
解决方案
定价
更多

React JS 如何正确将JSON数组值渲染到表单文本框并避免代码重复

优化方案

原有代码的核心问题是嵌套三元判断重复了完全相同的表单结构,我们可以通过收敛判断逻辑、抽离公共组件两种方式优化,同时还能修复原有实现隐含的ID重复问题。

方案1:简化判断逻辑,消除重复代码

先用可选链对数组做判空兜底,合并两个空值分支,代码直接减少2/3的冗余:

{
  // 提前对Names做判空,默认赋值为空数组,覆盖null/undefined场景
  const names = this.state.testJson?.Names || [];
  names.length > 0 ? 
    names.map(response => (
      <div className="form-group col-md-3" key={response.nameId}>
        <label htmlFor="firstName">{Liferay.Language.get('first-name')}</label>
        <input 
          name="firstName" 
          // 空值兜底,就算otherName为null/undefined也显示空白
          value={response.otherName ?? ''} 
          type="text" 
          className="form-control" 
          id="firstName" 
        />
      </div>
    )) : (
      <div className="form-group col-md-3">
        <label htmlFor="firstName">{Liferay.Language.get('first-name')}</label>
        <input 
          name="firstName" 
          value='' 
          type="text" 
          className="form-control" 
          id="firstName" 
        />
      </div>
    )
}

如果项目环境不支持ES2020的可选链、空值合并运算符,可以换成兼容写法:

const names = (this.state.testJson && this.state.testJson.Names) || [];
value={response.otherName || ''}

方案2:抽离公共组件,后续维护成本更低

如果这个表单字段在多个地方用到,可以直接抽成独立组件,后续修改样式、文案只需要改一次:

// 抽离公共的姓名字段组件
const FirstNameField = ({ value = '', keyId }) => (
  <div className="form-group col-md-3" key={keyId}>
    <label htmlFor="firstName">{Liferay.Language.get('first-name')}</label>
    <input 
      name="firstName" 
      value={value} 
      type="text" 
      className="form-control" 
      id="firstName" 
    />
  </div>
)

// 业务代码中直接调用
{
  const names = this.state.testJson?.Names || [];
  names.length > 0 
    ? names.map(res => <FirstNameField keyId={res.nameId} value={res.otherName} />)
    : <FirstNameField keyId="empty" />
}

补充:修复ID重复问题

原有实现如果Names数组长度大于1,会生成多个ID为firstName的输入框,不符合HTML ID唯一的规范。如果你的业务实际只需要展示第一条姓名数据,可以进一步简化,完全消除分支判断:

{
  const names = this.state.testJson?.Names || [];
  const nameItem = names[0] || {};
  return (
    <div className="form-group col-md-3">
      <label htmlFor="firstName">{Liferay.Language.get('first-name')}</label>
      <input 
        name="firstName" 
        value={nameItem.otherName ?? ''} 
        type="text" 
        className="form-control" 
        id="firstName" 
      />
    </div>
  )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 23:36:08