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

ReactJS中如何预加载切换显示的按钮图片?

React组件图片预加载实现方案

你可以通过以下几种方法实现图片预加载,避免切换到激活状态时的图片加载延迟:

方法一:组件挂载时通过Image实例预加载

在组件挂载阶段,使用useEffect创建Image对象并设置图片地址,让浏览器提前加载资源并存入缓存:

import React, {useState, useEffect} from 'react';
import styles from './CallButton.module.css'
import whatsAppImg from '../../images/whatsapp.png'
import telegramImg from '../../images/telegram.png'

const CallButton = () => {
    const [isActive, setIsActive] = useState(false);

    useEffect(() => {
        // 预加载目标图片
        const imageUrls = [whatsAppImg, telegramImg];
        imageUrls.forEach(url => {
            const img = new Image();
            img.src = url;
        });
    }, []); // 空依赖数组确保仅在组件挂载时执行一次

    return (<div className={styles.container}>
        {isActive ?
            <div className={styles.appearsLeft}>
                <a className={styles.callButton} title={'Написать в WhatsApp'} href="https://wa.me/+79147726787">
                    <img src={whatsAppImg} className={styles.icon}/>
                </a>
                <a className={styles.callButton} title={'Написать в Telegram'} href="https://t.me/yolkin27">
                    <img src={telegramImg} className={styles.icon}/>
                </a>
            </div> :
            <div className={styles.main}
                 onClick={() => setIsActive(true)}>
                <div className={styles.notActiveButton}>Связаться со мной</div>
            </div>
        }
    </div>);
};

export default CallButton;

方法二:添加隐藏的img标签预加载

在组件DOM中添加一个不可见的容器,放入需要预加载的图片标签,浏览器会自动加载这些资源但不会显示:

import React, {useState} from 'react';
import styles from './CallButton.module.css'
import whatsAppImg from '../../images/whatsapp.png'
import telegramImg from '../../images/telegram.png'

const CallButton = () => {
    const [isActive, setIsActive] = useState(false);

    return (<div className={styles.container}>
        {/* 隐藏容器用于预加载图片 */}
        <div style={{position: 'absolute', width: 0, height: 0, overflow: 'hidden'}}>
            <img src={whatsAppImg} alt=""/>
            <img src={telegramImg} alt=""/>
        </div>
        {isActive ?
            <div className={styles.appearsLeft}>
                <a className={styles.callButton} title={'Написать в WhatsApp'} href="https://wa.me/+79147726787">
                    <img src={whatsAppImg} className={styles.icon}/>
                </a>
                <a className={styles.callButton} title={'Написать в Telegram'} href="https://t.me/yolkin27">
                    <img src={telegramImg} className={styles.icon}/>
                </a>
            </div> :
            <div className={styles.main}
                 onClick={() => setIsActive(true)}>
                <div className={styles.notActiveButton}>Связаться со мной</div>
            </div>
        }
    </div>);
};

export default CallButton;

方法三:利用Webpack预加载指令(适用于Webpack项目)

如果你的项目使用Webpack构建,可以在导入图片时添加注释指令,让Webpack自动处理预加载:

import React, {useState} from 'react';
import styles from './CallButton.module.css'
// 添加webpackPrefetch指令,浏览器空闲时预加载资源
import whatsAppImg from '../../images/whatsapp.png' /* webpackPrefetch: true */
import telegramImg from '../../images/telegram.png' /* webpackPrefetch: true */

const CallButton = () => {
    const [isActive, setIsActive] = useState(false);

    return (<div className={styles.container}>
        {isActive ?
            <div className={styles.appearsLeft}>
                <a className={styles.callButton} title={'Написать в WhatsApp'} href="https://wa.me/+79147726787">
                    <img src={whatsAppImg} className={styles.icon}/>
                </a>
                <a className={styles.callButton} title={'Написать в Telegram'} href="https://t.me/yolkin27">
                    <img src={telegramImg} className={styles.icon}/>
                </a>
            </div> :
            <div className={styles.main}
                 onClick={() => setIsActive(true)}>
                <div className={styles.notActiveButton}>Связаться со мной</div>
            </div>
        }
    </div>);
};

export default CallButton;

注:webpackPrefetch会在浏览器空闲时加载资源,webpackPreload会与当前页面资源并行加载,可根据需求选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:14:53