aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/docs/components/app/AppLoadingBar.vue
diff options
context:
space:
mode:
author简律纯 <hsiangnianian@outlook.com>2023-04-19 17:30:39 +0800
committer简律纯 <hsiangnianian@outlook.com>2023-04-19 17:30:39 +0800
commit3adc965dd09490b7efa1cce9f09b0a3b30970277 (patch)
treef813abb07d7b003984aa74e3154752b6ffc3ccd5 /docs/components/app/AppLoadingBar.vue
parentc7c9ca6f0c8eddf6d34cd40779f3b2d9463f3a46 (diff)
downloadHydroRoll-3adc965dd09490b7efa1cce9f09b0a3b30970277.tar.gz
HydroRoll-3adc965dd09490b7efa1cce9f09b0a3b30970277.zip
✨优化文档
Diffstat (limited to 'docs/components/app/AppLoadingBar.vue')
-rw-r--r--docs/components/app/AppLoadingBar.vue106
1 files changed, 106 insertions, 0 deletions
diff --git a/docs/components/app/AppLoadingBar.vue b/docs/components/app/AppLoadingBar.vue
new file mode 100644
index 0000000..51314a8
--- /dev/null
+++ b/docs/components/app/AppLoadingBar.vue
@@ -0,0 +1,106 @@
+<script setup>
+const props = defineProps({
+ throttle: {
+ type: Number,
+ default: 200
+ },
+ duration: {
+ type: Number,
+ default: 2000
+ }
+})
+
+const nuxtApp = useNuxtApp()
+
+// Options & Data
+const data = reactive({
+ percent: 0,
+ show: false,
+ canSucceed: true
+})
+// Local variables
+let _timer = null
+let _throttle = null
+let _cut
+
+// Functions
+function clear () {
+ _timer && clearInterval(_timer)
+ _throttle && clearTimeout(_throttle)
+ _timer = null
+}
+function start () {
+ if (data.show) { return }
+ clear()
+ data.percent = 0
+ data.canSucceed = true
+
+ if (props.throttle) {
+ _throttle = setTimeout(startTimer, props.throttle)
+ } else {
+ startTimer()
+ }
+}
+function increase (num) {
+ data.percent = Math.min(100, Math.floor(data.percent + num))
+}
+function finish () {
+ data.percent = 100
+ hide()
+}
+function hide () {
+ clear()
+ setTimeout(() => {
+ data.show = false
+ setTimeout(() => {
+ data.percent = 0
+ }, 400)
+ }, 500)
+}
+function startTimer () {
+ data.show = true
+ _cut = 10000 / Math.floor(props.duration)
+ _timer = setInterval(() => {
+ increase(_cut)
+ }, 100)
+}
+
+// Hooks
+nuxtApp.hook('content:middleware:start', start)
+nuxtApp.hook('page:start', start)
+nuxtApp.hook('page:finish', finish)
+
+onBeforeUnmount(() => clear)
+</script>
+
+<template>
+ <div
+ class="nuxt-progress"
+ :class="{
+ 'nuxt-progress-failed': !data.canSucceed,
+ }"
+ :style="{
+ width: `${data.percent}%`,
+ left: data.left,
+ opacity: data.show ? 1 : 0,
+ backgroundSize: `${(100 / data.percent) * 100}% auto`,
+ }"
+ />
+</template>
+
+<style lang="ts">
+css({
+ '.nuxt-progress': {
+ height: '{docus.loadingBar.height}',
+ position: 'fixed',
+ top: '0px',
+ left: '0px',
+ right: '0px',
+ width: '0%',
+ opacity: 1,
+ transition: 'width 0.1s, height 0.4s, opacity 0.4s',
+ background: 'repeating-linear-gradient(to right, {docus.loadingBar.gradientColorStop1} 0%, {docus.loadingBar.gradientColorStop2} 50%, {docus.loadingBar.gradientColorStop3} 100%)',
+ zIndex: '999999',
+ }
+})
+</style>