【问题标题】:VueJs:Laravel- Add loading spinner that shows in front of the page while all data is loadingVueJs:Laravel- 添加在加载所有数据时显示在页面前面的加载微调器
【发布时间】:2023-01-04 15:46:58
【问题描述】:

我想添加加载微调器,直到未加载数据。为此,我创建了一个加载 component.vue

<template>
    <div class="preloader" v-if="show">
        <div class="spinner-border" style="width: 3rem; height: 3rem;" role="status">
            <span class="visually-hidden">Loading...</span>
        </div>
    </div>
</template>

<script>
export default {
    name: "PreloaderComponent",
    data: () => ({
        show: true
    }),
    mounted(){
        if(Boolean(this.show)) this.showToggle()
    },
    methods: {
        showToggle(){
            setTimeout(() => {
                this.show = false
            }, 1000)
        }
    }
}
</script>

<style lang="scss">
.preloader {
    position: absolute;
    width: 100%;
    height: 100%;
    left: 0;
    top: 0;
    z-index: 1050;
    background: rgba(0, 0, 0, .3);
    display: flex;
    align-items: center;
    justify-content: center;
}
</style>

并将此组件视图导入我们的 dashboard.vue 中,以便在加载仪表板中的所有小部件后,微调器就会消失。但是通过添加此代码微调器不会在加载所有小部件后消失。 所以我正在寻找添加黑色微调器的解决方案,并在加载仪表板上的数据时稍微调暗背景,这应该适用于我们添加的所有未来 API 调用,所以我试图找到可以自动解决此问题的解决方案与 Vue。

找到一个解决方案,了解如何在仪表板中添加一个加载微调器,直到页面无法正确加载。在所有情况下,加载微调器只显示 1 秒;如果从 API 加载数据需要更长的时间,那么当数据尚未加载时,微调器可能会在 1 秒后消失。或者,如果数据加载速度非常快,用户可能会等待整整一秒完成。第一个问题更令人担忧,因为我们需要让微调器保持启动状态,直到所有内容都加载完毕。

【问题讨论】:

  • 我会制作一个仅适用于 html 的加载器,这样你甚至不需要等待加载 vue。你可以把它放在&lt;div id="app"&gt;&lt;!-- loader here --&gt;&lt;/div&gt;里面。 Vue 会在加载时覆盖 div 中的内容
  • 但它不起作用我的仪表板一半已加载一半仍在进行中。 @Lk77
  • 那么当您不再需要它时,您将需要隐藏它/将其删除
  • 我想要自动解决方案
  • 我认为您的代码不正确,isAxiosRequesting 不是窗口的有效事件

标签: laravel vue.js npm axios


【解决方案1】:

这是我正在使用的装载机:

<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" viewBox="0 0 44 44">
    <style type="text/css">
          <![CDATA[
            g circle {
              stroke: #fff;
              stroke-width: 3;
            }
            g circle {
              opacity: 0;
              animation: size cubic-bezier(0.165, 0.84, 0.44, 1) 1.8s infinite,
                         opacity cubic-bezier(0.3, 0.61, 0.355, 1) 1.8s infinite;
              transform-origin: 50% 50%;
            }
            g circle:last-child { animation-delay: 0.9s; }
            @keyframes size {
              0% { transform: scale(0); }
              100% { transform: scale(1); }
            }
            @keyframes opacity {
              5% { opacity: 1; }
              100% { opacity: 0; }
            }
          ]]>
    </style>
    <g fill="none">
        <circle cx="22" cy="22" r="20"/>
        <circle cx="22" cy="22" r="20"/>
    </g>
</svg>

这是一个普通的 svg 加载器,无论 js/vue,甚至加载外部 css,都可以工作, 互联网上还有更多 svg 加载器可供选择。

这些加载程序将立即加载,并且非常适合。 如果需要,您也可以将加载程序放在#app div 之外, 因此您可以决定何时删除它,如果您的应用需要时间来加载。

您可能需要黑色或白色背景,并且可能需要将其置于网页的中心并使其绝对定位。

我把装载机带到了这里:https://samherbert.net/svg-loaders/

【讨论】:

  • 在 Loder.vue 中,如果我可以添加 id app 并将此组件导入到另一个可以工作的 vue 文件中?
  • 是的,这会起作用,但在 vue 加载之前你将没有加载器。你可以做的是在vue和div中有相同的加载器,所以当vue加载时,它把加载器放在div中,这和以前一样,所以最终用户不会看到差异
  • 出于好奇,你为什么使用&lt;![CDATA[?那会改变什么?它有什么作用?
  • cdata 在这里不是必需的,我认为它什么都不做,因为它是 html 而不是 xml,我正在使用它但我不是它的作者,我以为它来自 samherbert.net/svg-loaders 但我不是确定它。
  • 我找到了,原始文件在这里:raw.githubusercontent.com/SamHerbert/SVG-Loaders/next/… 它很旧,所以也许这就是原因。那里可能有更好的 svg 加载器,它更像是一个例子。
最近更新 更多