初次加载资源时无法正常加载,需要多次刷新、请求才能拿到资源的有效解决方案

初次加载资源时无法正常加载,需要多次刷新、请求才能拿到资源的有效解决方案

前言

在使用cloudinary进行图片上传并获取图片链接作为用户头像时发现,图片链接网址初次加载会报错:ERR_CONNECTION_RESET必须刷新几次才能获取到,原因可能是cloudinary没有国内的节点,而我用的是在新加坡的节点,所以会导致初次加载的时候被重定向。而这个错误会直接导致用户头像无法加载,因为在img中此链接只会被在初始化的时候加载一次,而此博客就是为了解决此问题让图片正常加载。

正文

我的思路就是监听图片地址是否能正常获取,若是获取失败则一直刷新直到图片正常加载,具体看下面代码:

修改前:

import { signOut, useSession } from 'next-auth/react';
import Link from 'next/link'
import React from 'react'
import { SessionData } from '../lib/type';
import { Logout } from '@mui/icons-material';
const handleLogout = () => {
  signOut({ callbackUrl: '/auth/login' });
}
const TopBar = () => {
  const { data: session } = useSession();
  const user = session?.user as SessionData | null;
  return (
    <div className='bg-white h-9 border-x-1 flex justify-between'>

          <p className='text-center mt-2 ml-2 font-sans text-small antialiased font-bold'>NextChat</p>
          <div className='flex'>
            <Link rel="stylesheet" href="/chats/profile">
              <img
                src={user?.image || "/images/person.jpg"}
                alt="image"
                className="w-8 h-8 rounded-full mt-[2px]" 
              />
            </Link>
            
            <div className='mx-4'>
              <p className='text-center font-sans text-small antialiased font-bold'>{user?.username}</p>
              <p className='text-center font-sans text-mm antialiased font-bold text-gray-500'>{user?.email}</p>
            </div>
            <Logout sx={{ color: "#737373", cursor: "pointer" }} onClick={handleLogout} className='mt-1 mr-4'/>
          </div>
        </div>
  )
}
export default TopBar

修改后:

import { signOut, useSession } from 'next-auth/react';
import Link from 'next/link'
import React, { useEffect, useRef } from 'react'
import { SessionData } from '../lib/type';
import { Logout } from '@mui/icons-material';
const handleLogout = () => {
  signOut({ callbackUrl: '/auth/login' });
}
const TopBar = () => {
  const { data: session } = useSession();
  const user = session?.user as SessionData | null;
  const imageRef = useRef<HTMLImageElement | null>(null);

  const handleImageError = () => {
    if (imageRef.current) {
      imageRef.current.src = user?.image || "/images/person.jpg";
    }
  };

  useEffect(() => {
    if (imageRef.current) {
      imageRef.current.onerror = handleImageError;
    }
  }, [user?.image]);

  return (
    <div className='bg-white h-9 border-x-1 flex justify-between'>

          <p className='text-center mt-2 ml-2 font-sans text-small antialiased font-bold'>NextChat</p>
          <div className='flex'>
            <Link rel="stylesheet" href="/chats/profile">
              <img
                ref={imageRef}
                src={user?.image || "/images/person.jpg"}
                alt="image"
                className="w-8 h-8 rounded-full mt-[2px]" 
              />
            </Link>
            
            <div className='mx-4'>
              <p className='text-center font-sans text-small antialiased font-bold'>{user?.username}</p>
              <p className='text-center font-sans text-mm antialiased font-bold text-gray-500'>{user?.email}</p>
            </div>
            <Logout sx={{ color: "#737373", cursor: "pointer" }} onClick={handleLogout} className='mt-1 mr-4'/>
          </div>
        </div>
  )
}

export default TopBar

在这个修改后的代码中,我定义了一个名为 imageRefuseRef 来存储图像元素的引用。然后,我使用 useEffect 钩子来监听 user?.image 的变化,并在其变化时更新图像的 onerror 事件处理函数。当图像加载失败时,handleImageError 函数会被调用(给onerror绑定处理函数),重新设置图像的 src 属性为原始的 user?.image 或默认图片的路径,如果在处理函数 handleImageError 中将图片 src 重新设置为另一个同样会加载失败的图片地址,这会再次触发 onerror 事件。这样图片就会一直尝试重新加载,直到成功为止。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/882256.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【VUE3.0】动手做一套像素风的前端UI组件库---先导篇

系列文章目录 【VUE3.0】动手做一套像素风的前端UI组件库—Button【VUE3.0】动手做一套像素风的前端UI组件库—Radio 目录 系列文章目录引言准备素材字体鼠标手势图 创建vue3项目构建项目1. 根据命令行提示选择如下&#xff1a;2. 进入项目根目录下载依赖并启动。3. 设置项目s…

MySQL函数介绍--日期与时间函数(二)

我相信大家在学习各种语言的时候或多或少听过我们函数或者方法这一类的名词&#xff0c;函数在计算机语言的使用中可以说是贯穿始终&#xff0c;那么大家有没有思考过到底函数是什么&#xff1f;函数的作用又是什么呢&#xff1f;我们为什么要使用函数&#xff1f;其实&#xf…

什么是上层封禁海外流量

上层封禁海外流量&#xff08;Upper-layer Blocking of Overseas Traffic&#xff09;是一种网络安全策略&#xff0c;旨在通过在网络传输的上层进行流量控制和过滤&#xff0c;从而阻止来自海外的恶意流量或不必要的访问。这一措施主要用于防止分布式拒绝服务&#xff08;DDoS…

【AIGC】ChatGPT RAG提取文档内容,高效制作PPT、论文

目录 一、理解 RAG 技术 二、利用 ChatGPT 的 RAG 技术提取文档内容 三、高效制作 PPT 四、高效撰写论文 五、最佳实践与建议 六、工具推荐 随着人工智能生成内容&#xff08;AIGC&#xff09;的快速发展&#xff0c;利用先进的技术工具如 ChatGPT 的 RAG&#xff08;Ret…

【深度学习】(3)--损失函数

文章目录 损失函数一、L1Loss损失函数1. 定义2. 优缺点3. 应用 二、NLLLoss损失函数1. 定义与原理2. 优点与注意3. 应用 三、MSELoss损失函数1. 定义与原理2. 优点与注意3. 应用 四、BCELoss损失函数1. 定义与原理2. 优点与注意3. 应用 五、CrossEntropyLoss损失函数1. 定义与原…

【觅图网-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

Java集合(Map篇)

一.Map a.使用Map i.键值&#xff08;key-value&#xff09;映射表的数据结构&#xff0c;能高效通过key快速查找value&#xff08;元素&#xff09;。 ii.Map是一个接口&#xff0c;最常用的实现类是HashMap。 iii.重复放入k-v不会有问题&#xff0c;但是一个…

Rasa对话模型——做一个语言助手

1、Rasa模型 1.1 模型介绍 Rasa是一个用于构建对话 AI 的开源框架&#xff0c;主要用于开发聊天机器人和语音助手。Rasa 提供了自然语言理解&#xff08;NLU&#xff09;和对话管理&#xff08;DM&#xff09;功能&#xff0c;使开发者能够创建智能、交互式的对话系统。 1.2…

【计算机网络】计算机网络基础二

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 以太网的通信原理令牌环网的通信原理网络传输基本流程 数据包封装和分用 网络传输流程图 局域网通信&#xff08;同一个网段内的两台…

Java基础笔记1】Java基础语法

目录 一、Java简介 二、JDK和Java初体验 三、配置环境变量 四、IDEA快捷键 五、Java语法基础 1. 注释 2. 字面量 3. 变量 4. 关键字和标识符 5. 变量详解 a. 数值数据在计算机中的存储​编辑 b. 文本、图片、音频等数据在计算机中的存储 c. 八进制和十六进制 6. 数据类型 a. …

Java多线程(1)—线程基础

一、关于线程 1.1 简介 计算机线程&#xff08;Thread&#xff09;是操作系统能够进行运算调度的最小单位。线程的优势在于提高了程序的效率和响应能力&#xff0c;尤其在处理 I/O 操作或多任务时。多线程编程能够充分利用多核处理器的计算能力&#xff0c;达到更高的性能。 …

electron-updater实现electron全量版本更新

在 Electron 应用中使用 electron-updater 来实现自动更新功能时&#xff0c;通常你会在一个专门的模块或文件中管理更新逻辑。如果你想要使用 ES6 的 import 语法来引入 electron-updater&#xff0c;你需要确保你的项目已经配置好了支持 ES6 模块的构建工具&#xff08;如 We…

【Fastapi】参数获取,json和query

【Fastapi】参数获取&#xff0c;json和query 前言giteegithub query形式json传递同步方法使用json 前言 花了半个月的时间看了一本小说&#xff0c;懈怠了…今天更新下fastapi框架的参数获取 gitee https://gitee.com/zz1521145346/fastapi_frame.git github https://git…

828华为云征文|Flexus云服务器X实例实践:部署Alist文件列表程序

828华为云征文&#xff5c;Flexus云服务器X实例实践&#xff1a;部署Alist文件列表程序 引言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 主要使用场景 二、购买Flexus云服务器X实例2.1 购买规格参考2.2 查看Flexus云服务器X实例状态 三、远程连接Flexus云服务…

python是什么语言写的

Python是一种计算机程序设计语言。是一种面向对象的动态类型语言。现今Python语言很火&#xff0c;可有人提问&#xff0c;这么火的语言它的底层又是什么语言编写的呢&#xff1f; python是C语言编写的&#xff0c;它有很多包也是用C语言写的。 所以说&#xff0c;C语言还是很…

二分查找算法(5) _山脉数组的峰顶索引

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 二分查找算法(5) _山脉数组的峰顶索引 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c;…

二分算法——优选算法

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 本章我们来学习的是二分查找算法&#xff0c;二分算法的应用非常广泛&#xff0c;不仅限于数组查找&#xff0c;还可以用于解决各种搜索问题、查找极值问题等。在数据结构和算…

海外仓商品退换货管理:选择系统为何至关重要?

随着跨境电商的蓬勃发展&#xff0c;退换货问题成为了卖家们不得不面对的挑战。退换货处理不仅繁琐&#xff0c;而且对效率和服务质量的要求极高。因此&#xff0c;许多卖家选择海外仓来简化退换货流程。然而&#xff0c;海外仓在处理退换货时同样面临诸多难题&#xff0c;涉及…

openeuler 22.03 lts sp4 使用 kubeadm 部署 k8s-v1.28.2 高可用集群

文章目录 [toc]废话篇这篇文章什么时候写的为什么是 openeuler为什么是 22.03 lts sp4高可用架构题外话 干活篇环境介绍系统初始化相关关闭防火墙关闭 selinux关闭 swap开启内核模块开启模块自动加载服务 sysctl 内核参数调整清空 iptables 规则安装各种依赖和工具修改 .bashrc…

【uni-app】小兔鲜项目-基础架构-请求和上传文件拦截器

注意事项 uni.request 请求封装 请求和上传文件拦截器 uniapp 拦截器&#xff1a; uni.addInterceptor 接口说明&#xff1a;接口文档 实现需求 拼接基础地址设置超时时间添加请求头标识添加 token 参考代码 // src/utils/http.ts// 请求基地址 const baseURL https://pca…