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

如何正确在本地存储中保存与展示图片?React+Redux项目实践

基于React+Redux(JavaScriptServices)实现Base64头像的本地缓存与展示

背景

我目前在使用JavaScriptServices的React+Redux模板开发应用,核心需求是调用一个返回Base64格式用户头像的API,并且要通过本地存储缓存头像,避免重复发起API请求。

具体实现步骤

1. 调用API获取Base64头像

这里是我实际项目中用来调用接口的代码(基于fetch实现,你也可以换成axios等请求库):

// 异步获取用户头像的API调用函数
const fetchUserAvatar = async (userId) => {
  try {
    const response = await fetch(`/api/users/${userId}/avatar`);
    // 接口直接返回纯Base64格式的字符串
    const base64Avatar = await response.text();
    // 获取成功后自动存入本地存储
    saveAvatarToLocalStorage(userId, base64Avatar);
    return base64Avatar;
  } catch (error) {
    console.error('获取用户头像失败:', error);
    // 返回空值,后续用默认头像兜底
    return null;
  }
};

2. 保存头像到本地存储的工具函数

为了方便复用,我封装了一个专门处理本地存储写入的函数:

/**
 * 将Base64格式的头像存入localStorage
 * @param {string} userId - 用户唯一标识,避免不同用户头像冲突
 * @param {string} base64Avatar - Base64格式的头像字符串
 */
const saveAvatarToLocalStorage = (userId, base64Avatar) => {
  if (!userId || !base64Avatar) return;
  localStorage.setItem(`user_avatar_${userId}`, base64Avatar);
};

3. 从本地存储读取头像的工具函数

在需要展示头像的场景,优先从本地缓存读取,没有数据时再触发API请求:

/**
 * 从localStorage获取用户头像
 * @param {string} userId - 用户唯一标识
 * @returns {string|null} Base64头像字符串或null
 */
const getAvatarFromLocalStorage = (userId) => {
  return localStorage.getItem(`user_avatar_${userId}`);
};

4. 在React组件中展示头像

拿到Base64字符串后,直接作为img标签的src属性即可,同时加上兜底的默认头像:

import React, { useState, useEffect } from 'react';

const UserAvatar = ({ userId }) => {
  // 先从本地缓存取头像数据
  const localAvatar = getAvatarFromLocalStorage(userId);
  const [avatar, setAvatar] = useState(localAvatar);

  // 本地无数据时,调用API获取并更新状态
  useEffect(() => {
    if (!localAvatar) {
      fetchUserAvatar(userId).then(fetchedAvatar => setAvatar(fetchedAvatar));
    }
  }, [userId, localAvatar]);

  // 兜底的默认头像路径
  const fallbackAvatar = '/assets/default-avatar.png';
  const avatarSrc = avatar ? `data:image/png;base64,${avatar}` : fallbackAvatar;

  return (
    <img
      src={avatarSrc}
      alt={`用户${userId}的头像`}
      style={{ width: '80px', height: '80px', borderRadius: '50%', objectFit: 'cover' }}
    />
  );
};

export default UserAvatar;

当前状态

目前整个流程运行一切正常,既满足了头像的正常展示需求,又通过本地存储有效减少了不必要的API请求,优化了应用的性能和用户体验。

内容的提问来源于stack exchange,提问作者Oscar Cabrera Rodríguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:14:52