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

React 18中如何动态设置图片src为远程URL?

React作者卡片组件问题分析与修复

问题1:require加载远程图片报错

require() 是Webpack等构建工具用于加载本地资源/模块的方法,远程图片URL不属于本地模块范畴,直接使用require(远程URL)会触发「找不到模块」的错误。

问题2:img标签报错“void element tag”

错误根源在Card组件的子元素处理逻辑:

React.cloneElement(child, { ...props, key: i });

这里把Card组件的所有props(包括children、title、subtitle等)全部传递给了子元素<img>,而<img>是HTML空标签(void element),不允许拥有children属性,因此触发报错。


正确实现方案

1. 修复Card组件

修改CardBody内的子元素克隆逻辑,只传递必要属性(避免将Card的多余props传给子元素):

export const Card = (props: {
  title?: string | null | undefined;
  subtitle?: string | null | undefined;
  borderColor?: string | null | undefined;
  children?: any;
}) => {
    const cardStyle = {
        borderColor: props.borderColor || '#ded3d3',
    };

    return (
        <div className="card-minhoteca" style={cardStyle}>
            <CardHeader title={props.title} subtitle={props.subtitle} />
            <CardBody>
                {
                    React.Children.map(props.children, (child, i) => {
                        // 仅传递key,不传递Card的多余props给子元素
                        return React.cloneElement(child, { key: i });
                    })
                }
            </CardBody>
            <CardFooter>
                <p>Card Footer</p>
            </CardFooter>
        </div>
    );
};

2. 修复Authors组件的图片引用

直接将远程URL赋值给img的src属性,移除require():

export const Authors = () => {
    const authors = [
        {
            id: 1,
            name: 'Tayeb Salih',
            wikipedia: 'https://en.wikipedia.org/wiki/Tayeb_Salih',
            picture_url: 'https://upload.wikimedia.org/wikipedia/commons/a/ae/Tayeb_saleh.jpg'
        },
        {
            id: 2,
            name: 'Adolfo Bioy Casares',
            wikipedia: 'https://en.wikipedia.org/wiki/Adolfo_Bioy_Casares',
            picture_url: 'https://upload.wikimedia.org/wikipedia/commons/a/a9/Bioy.png'
        },
        {
            id: 3,
            name: 'Lucy Foley',
            wikipedia: 'https://en.wikipedia.org/wiki/Lucy_Foley',
            picture_url: 'https://www.intrinseca.com.br/upload/autor/Lucy%20Foley%20G.jpg'
        },
        {
            id: 4,
            name: 'Matt Ruff',
            wikipedia: 'https://en.wikipedia.org/wiki/Matt_Ruff',
            picture_url: 'https://images.gr-assets.com/authors/1597587995p5/40577.jpg'
        }];  

    return (
        <section id="section-authors">
            <h1>Authors</h1>
            <div className="group-cards">
                {authors.map((author, index) => {
                    const borderColor = index > 1 ? null : index > 0 ? '#57b60a' : '#b60a57';
                    return (
                        <Card 
                            borderColor={borderColor} 
                            title={author.name} 
                            subtitle={author.id.toString()} 
                            key={author.id} // 建议用唯一id作为key,而非数组索引
                        >
                            <img src={author.picture_url} alt={author.name} />
                        </Card>
                    );
                })}
            </div>
            <img
                src="https://upload.wikimedia.org/wikipedia/commons/a/a9/Bioy.png"
                alt="Adolfo Bioy Casares" // 补充有意义的alt文本
                height="200"
            />
        </section>
    );
};

额外优化建议

  • 用作者的id作为key而非数组索引,避免列表更新时的性能问题和渲染异常。
  • 给所有图片补充有意义的alt文本,提升页面可访问性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:25:35