26.useScript

news/2025/1/30 21:44:31/

在 Web 应用开发中,动态加载外部脚本是一个常见需求,特别是在需要集成第三方库或服务时。然而,在 React 应用中管理脚本加载可能会变得复杂。useScript 钩子提供了一种优雅的方式来处理外部脚本的加载、错误处理和清理,使得在 React 组件中动态加载脚本变得简单和可靠。以下是如何实现和使用这个自定义钩子:

const useScript = src => {const [status, setStatus] = React.useState(src ? 'loading' : 'idle');React.useEffect(() => {if (!src) {setStatus('idle');return;}let script = document.querySelector(`script[src="${src}"]`);if (!script) {script = document.createElement('script');script.src = src;script.async = true;script.setAttribute('data-status', 'loading');document.body.appendChild(script);const setDataStatus = event => {script.setAttribute('data-status',event.type === 'load' ? 'ready' : 'error');};script.addEventListener('load', setDataStatus);script.addEventListener('error', setDataStatus);} else {setStatus(script.getAttribute('data-status'));}const setStateStatus = event => {setStatus(event.type === 'load' ? 'ready' : 'error');};script.addEventListener('load', setStateStatus);script.addEventListener('error', setStateStatus);return () => {if (script) {script.removeEventListener('load', setStateStatus);script.removeEventListener('error', setStateStatus);}};}, [src]);return status;
};const script ='data:text/plain;charset=utf-8;base64,KGZ1bmN0aW9uKCl7IGNvbnNvbGUubG9nKCdIZWxsbycpIH0pKCk7';const Child = () => {const status = useScript(script);return <p>Child status: {status}</p>;
};const MyApp = () => {const status = useScript(script);return (<><p>Parent status: {status}</p><Child /></>);
};ReactDOM.createRoot(document.getElementById('root')).render(<MyApp />
);

这个技巧的关键点包括:

  1. 使用 useState 来跟踪脚本的加载状态。

  2. 使用 useEffect 来处理脚本的加载、错误处理和清理逻辑。

  3. 检查是否已存在相同 src 的脚本元素,避免重复加载。

  4. 使用 data-status 属性来跟踪脚本的加载状态。

  5. 添加事件监听器来处理加载成功和失败的情况。

使用这个钩子时,需要注意以下几点:


http://www.ppmy.cn/news/1567985.html

相关文章

web前端三大主流框架对比,Angular和React和Vue的区别

为什么说学会多种框架是很有好处的呢?其实从本质上来说&#xff0c;框架使编程变得更加有趣&#xff0c;并且框架使初学者更容易出成果&#xff0c;软件架构有就显得极为重要&#xff0c;那么你知道web前端三大主流框架对比&#xff0c;Angular和React和Vue之间有什么区别呢?…

MATLAB中alphanumericsPattern函数用法

目录 语法 说明 示例 从文本中提取字母和数字 匹配所设置数目的字母和数字 匹配不同大小的字母和数字集合 alphanumericsPattern函数的功能是匹配字母和数字字符。 语法 pat alphanumericsPattern pat alphanumericsPattern(N) pat alphanumericsPattern(minCharact…

OpenCV 版本不兼容导致的问题

问题和解决方案 今天运行如下代码&#xff0c;发生了意外的错误&#xff0c;代码如下&#xff0c;其中输入的 frame 来自于 OpenCV 开启数据流的读取 """ cap cv2.VideoCapture(RTSP_URL) print("链接视频流完成") while True:ret, frame cap.rea…

团体程序设计天梯赛-练习集——L1-022 奇偶分家

前言 这几道题都偏简单一点&#xff0c;没有什么计算&#xff0c;10分 L1-022 奇偶分家 给定N个正整数&#xff0c;请统计奇数和偶数各有多少个&#xff1f; 输入格式&#xff1a; 输入第一行给出一个正整N&#xff08;≤1000&#xff09;&#xff1b;第2行给出N个非负整数…

10.3 LangChain实战指南:解锁大模型应用的10大核心场景与架构设计

LangChain实战指南:解锁大模型应用的10大核心场景与架构设计 关键词: LangChain使用场景、LLM应用案例、检索增强生成、智能体开发、知识库问答 一、LangChain场景全景图:从简单到复杂的应用分层 #mermaid-svg-nzjpyXIPLzL0j3PG {font-family:"trebuchet ms",ver…

3-scala的类

Scala中的类是用于创建对象的蓝图&#xff0c;其中包含了方法、常量、变量、类型、对象、特质、类&#xff0c;这些统称为成员。类型、对象和特质将在后面的文章中介绍。 类定义 一个最简的类的定义就是关键字class标识符&#xff0c;类名首字母应大写。 class Userval user…

蓝桥杯算法笔记|前缀和3382、3419

&#xff01;前倾回顾 &#xff08;一&#xff09;进制转换 任意进制转化成十进制 int x0;//存放结果 int k;//k存放当前进制 int a[];//存放当前数拆解成的每位数 for(int i0;i<a.size();i){xx*ka[i]; } cout<<x<<\n 十进制转化成任意进制 string s;//存放结…

c++-------------------------继承

1.继承的概念和定义 1.1继承的概念 继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段&#xff0c;它允许我们在保持原有 类特性的基础上进⾏扩展&#xff0c;增加⽅法(成员函数)和属性(成员变量)&#xff0c;这样产⽣新的类&#xff0c;称派⽣类。继承 呈…