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

React组件按description字段渲染内容异常,求高效实现方案

问题描述

我有以下房产JSON数据:

{"location":"2034","type":"Residential","price":400000,"address":"123 Fake Street","suburb":"Maroubra","historical_DAs":0,"description":"Residential","property_ID":1},
{"location":"2036","type":"Commercial","price":475000,"address":"123 Fake Street","suburb":"Coogee","historical_DAs":10,"description":"Government","property_ID":2},
{"location":"2035","type":"Food & Bev","price":56000,"address":"123 Fake Street","suburb":"Clovelly","historical_DAs":3,"description":"Residential","property_ID":3},
{"location":"2031","type":"Education","price":69070,"address":"123 Fake Street","suburb":"Randwick","historical_DAs":7,"description":"Government","property_ID":4},
{"location":"2036","type":"Education","price":69070,"address":"123 Fake Street","suburb":"Randwick","historical_DAs":7,"description":"Government","property_ID":5}

我想根据description字段渲染不同内容(当前用文本测试),写了下面的React组件,但所有内容都渲染成“Image 2”,实际应该有部分显示“Image 1”,求高效解决方法:

function TypeImages({ description }) { 
  
  function Residential(props) {
    return <div>
       <h1>Image 1</h1>
     </div>;
  }

  function Government(props) {
    return <div>
       <h1>Image 2 </h1>
     </div>;
  }

  function TypeImage(props) {
    if (description === 'Residential') {
      return <Residential />;
    } else
  return <Commercial />;
  }


  return (
    <div>
      <div>
        <div className="hidden lg:inline-flex mb-1 px-9">
          <TypeImage/>      
          <div>
            
          </div>  
        </div>
      </div>
    </div>
  );
}

export default TypeImages;

问题分析
  1. 未定义Commercial组件:代码else分支返回的<Commercial/>从未声明,运行时会触发错误;同时逻辑只判断了Residential,忽略了Government的匹配,导致非Residential的场景全部走错误分支。
  2. 嵌套组件冗余:在组件内部嵌套定义子组件,增加了代码复杂度,不利于维护。

高效解决方案

推荐使用组件映射表的方式,代码简洁易扩展,新增类型时只需补充映射表条目即可:

// 单独定义各类型对应的组件
const Residential = () => <div><h1>Image 1</h1></div>;
const Government = () => <div><h1>Image 2</h1></div>;
// 定义默认组件,处理未匹配到的description类型
const DefaultImage = () => <div><h1>Default Image</h1></div>;

// 组件映射表:key为description的值,value为对应渲染的组件
const DESCRIPTION_COMPONENTS = {
  Residential,
  Government
  // 后续新增类型,直接在这里添加即可
};

function TypeImages({ description }) {
  // 根据description获取对应组件,无匹配则用默认组件
  const TargetComponent = DESCRIPTION_COMPONENTS[description] || DefaultImage;

  return (
    <div>
      <div className="hidden lg:inline-flex mb-1 px-9">
        <TargetComponent />
      </div>
    </div>
  );
}

export default TypeImages;

方案优势

  • 扩展性强:新增description类型时,只需定义新组件并加入映射表,无需修改核心逻辑。
  • 可读性高:避免多层if-else/switch的冗余写法,逻辑一目了然。
  • 容错性好:默认组件处理未匹配的场景,避免渲染异常。

原代码修复(仅作参考)

如果要基于原代码修改,需补全组件定义并完善判断逻辑:

function TypeImages({ description }) { 
  const Residential = () => <div><h1>Image 1</h1></div>;
  const Government = () => <div><h1>Image 2</h1></div>;
  const Commercial = () => <div><h1>Commercial Image</h1></div>; // 补全组件定义

  function TypeImage() {
    if (description === 'Residential') {
      return <Residential />;
    } else if (description === 'Government') { // 增加Government的判断分支
      return <Government />;
    } else {
      return <Commercial />;
    }
  }

  return (
    <div>
      <div className="hidden lg:inline-flex mb-1 px-9">
        <TypeImage/>      
      </div>
    </div>
  );
}

export default TypeImages;

注:该方案扩展性较差,不推荐长期使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:15:38