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

React JS渲染Pokemon API中宝可梦第二种类型的问题求助

解决宝可梦类型图片安全渲染问题

针对你遇到的部分宝可梦没有第二种类型导致报错的问题,提供三种实用的解决方式:

1. 条件渲染(判断存在再渲染)

利用&&短路逻辑,只有当apiTypes[1]存在时,才渲染第二个类型图片:

import React from 'react';

const Card = ({pokemon}) => {
    return (
       <li className='card'>
        <img src={pokemon.image} alt={pokemon.name} />
        <h3>#{pokemon.id} {pokemon.name}</h3>
        
        <div className='infos'>
          <img src={pokemon.apiTypes[0].image} alt={pokemon.apiTypes[0].name}/>
          {/* 仅当存在第二个类型时渲染 */}
          {pokemon.apiTypes[1] && <img src={pokemon.apiTypes[1].image} alt={pokemon.apiTypes[1].name}/>}
        </div>
       </li> 
    );
};

export default Card;

2. 可选链操作符(安全访问属性)

使用ES6+的可选链?.,如果apiTypes[1]不存在,apiTypes[1]?.image会返回undefined,此时<img>标签不会加载错误资源:

import React from 'react';

const Card = ({pokemon}) => {
    return (
       <li className='card'>
        <img src={pokemon.image} alt={pokemon.name} />
        <h3>#{pokemon.id} {pokemon.name}</h3>
        
        <div className='infos'>
          <img src={pokemon.apiTypes[0].image} alt={pokemon.apiTypes[0].name}/>
          <img src={pokemon.apiTypes[1]?.image} alt={pokemon.apiTypes[1]?.name}/>
        </div>
       </li> 
    );
};

export default Card;

3. 循环渲染所有类型(最通用)

如果后续API可能返回更多类型,直接循环apiTypes数组,自动渲染所有存在的类型,无需手动判断数量:

import React from 'react';

const Card = ({pokemon}) => {
    return (
       <li className='card'>
        <img src={pokemon.image} alt={pokemon.name} />
        <h3>#{pokemon.id} {pokemon.name}</h3>
        
        <div className='infos'>
          {/* 循环渲染所有类型图片 */}
          {pokemon.apiTypes.map((type, idx) => (
            <img key={idx} src={type.image} alt={type.name}/>
          ))}
        </div>
       </li> 
    );
};

export default Card;

另外建议给所有<img>添加alt属性,提升页面可访问性,同时避免控制台警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:15:55