useScript.ts 847 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import { onMounted, 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. const promise = new Promise((resolve, reject) => {
  10. onMounted(() => {
  11. const script = document.createElement('script');
  12. script.onload = function () {
  13. isLoading.value = false;
  14. success.value = true;
  15. error.value = false;
  16. resolve('');
  17. };
  18. script.onerror = function (err) {
  19. isLoading.value = false;
  20. success.value = false;
  21. error.value = true;
  22. reject(err);
  23. };
  24. script.src = opts.src;
  25. document.head.appendChild(script);
  26. });
  27. });
  28. return {
  29. isLoading,
  30. error,
  31. success,
  32. toPromise: () => promise,
  33. };
  34. }