1
0

useScript.ts 986 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { onMounted, onUnmounted, ref } from 'vue';
  2. interface ScriptOptions {
  3. src: string;
  4. }
  5. export function useScript(opts: ScriptOptions) {
  6. const isLoading = ref(false);
  7. const error = ref(false);
  8. const success = ref(false);
  9. let script: HTMLScriptElement;
  10. const promise = new Promise((resolve, reject) => {
  11. onMounted(() => {
  12. script = document.createElement('script');
  13. script.type = 'text/javascript';
  14. script.onload = function () {
  15. isLoading.value = false;
  16. success.value = true;
  17. error.value = false;
  18. resolve('');
  19. };
  20. script.onerror = function (err) {
  21. isLoading.value = false;
  22. success.value = false;
  23. error.value = true;
  24. reject(err);
  25. };
  26. script.src = opts.src;
  27. document.head.appendChild(script);
  28. });
  29. });
  30. onUnmounted(() => {
  31. script && script.remove();
  32. });
  33. return {
  34. isLoading,
  35. error,
  36. success,
  37. toPromise: () => promise,
  38. };
  39. }