create-base-teek-theme
Version:
``` npm create base-teek-theme@latest my-first-blog ```
139 lines (112 loc) • 4.17 kB
Markdown
---
date: 2025-04-03 23:53:35
title: useScript
permalink: /pages/9bdc8b
tags:
- vue Hooks
author:
name: 华总
link: https://xiaoying.org.cn
categories:
- 使用指南
- hooks
---
```vue
<template>
<div>
<p v-if="isLoading">脚本正在加载中...</p>
<p v-if="success">脚本加载成功!</p>
<p v-if="error && isTimeout">脚本加载超时,已重试 {{ getRetryCount() }} 次。</p>
<p v-if="error && !isTimeout">脚本加载出错,请检查脚本链接或网络状况。</p>
<button @click="runScriptDependentFunction" :disabled="!success">运行依赖脚本的功能</button>
</div>
</template>
<script setup lang="ts">
import { useScript } from 'liyao-vue-common';
const { isLoading, error, success, isTimeout } = useScript({
src: 'https://example.com/your-script.js',
});
const runScriptDependentFunction = () => {
if (success.value) {
// 调用脚本中定义的函数
window.doSomething();
}
};
</script>
```
顺序加载指的是按顺序依次加载脚本,前一个脚本加载完成后再加载下一个脚本。可以使用 `async/await` 或者 `Promise` 的链式调用来实现。
```typescript
import { useScript } from 'liyao-vue-common';
// 定义多个脚本选项
const scriptOptionsList = [
{ src: 'https://example.com/script1.js', timeout: 5000, maxRetries: 3 },
{ src: 'https://example.com/script2.js', timeout: 5000, maxRetries: 3 },
{ src: 'https://example.com/script3.js', timeout: 5000, maxRetries: 3 }
];
// 使用 async/await 实现顺序加载
async function loadScriptsSequentially() {
for (const options of scriptOptionsList) {
const { isLoading, error, success, isTimeout } = useScript(options);
try {
await new Promise((resolve, reject) => {
const checkStatus = () => {
if (success.value) {
resolve();
} else if (error.value) {
reject(new Error(isTimeout.value ? '脚本加载超时' : '脚本加载出错'));
} else {
setTimeout(checkStatus, 100);
}
};
checkStatus();
});
console.log(`${options.src} 加载成功`);
} catch (err) {
console.error(`${options.src} 加载失败:`, err);
break; // 若某个脚本加载失败,停止后续脚本的加载
}
}
}
// 调用顺序加载函数
loadScriptsSequentially();
```
并行加载意味着同时加载多个脚本,这些脚本的加载过程相互独立。可以使用 `Promise.all` 来实现。
```typescript
import { useScript } from 'liyao-vue-common';
// 定义多个脚本选项
const scriptOptionsList = [
{ src: 'https://example.com/script1.js', timeout: 5000, maxRetries: 3 },
{ src: 'https://example.com/script2.js', timeout: 5000, maxRetries: 3 },
{ src: 'https://example.com/script3.js', timeout: 5000, maxRetries: 3 }
];
// 并行加载多个脚本
function loadScriptsInParallel() {
const promises = scriptOptionsList.map(options => {
const { isLoading, error, success, isTimeout } = useScript(options);
return new Promise((resolve, reject) => {
const checkStatus = () => {
if (success.value) {
resolve();
} else if (error.value) {
reject(new Error(isTimeout.value ? '脚本加载超时' : '脚本加载出错'));
} else {
setTimeout(checkStatus, 100);
}
};
checkStatus();
});
});
Promise.all(promises)
.then(() => {
console.log('所有脚本加载成功');
})
.catch(err => {
console.error('部分脚本加载失败:', err);
});
}
// 调用并行加载函数
loadScriptsInParallel();
```