兄弟们, vue 网页有没有办法实现页面首页加载超过 1 秒才显示 loading, 1 秒内就不显示 loading 吗

2022-12-13 23:11:03 +08:00
 dafuyang
目前我采用的是常规的实现方式,在还 vue 没渲染的时候显示 loading ,挂载渲染后隐藏 loading ,首次效果不错,但是后续浏览器有缓存了,在加载很快的情况下,loading 的显示就会闪一下,感觉不是很爽,有办法实现我标题中的这种需求吗。。
5159 次点击
所在节点    Vue.js
52 条回复
makelove
2022-12-14 09:49:05 +08:00
我就是这么用的,实现没用 js ,用的是 css animation 就有的延迟动画 1s 功能
yamedie
2022-12-14 09:59:23 +08:00
我会选择用 Promise.race ,好处是省得手动 set 和 clear 定时器(也不用去比对 Date.now()),逻辑也更清晰一点儿。

const sleep = time => new Promise(resolve => setTimeout(resolve, time));

let isLoading = false;

const promiseSleep = sleep(1000);

const promiseAjax = fetch(xxx).then(res => {xxxx 业务逻辑; return true}).finally(() => {isLoading = false});

Promise.race([promiseSleep, promiseAjax]).then(res => {if (!res) isLoading = true});
yamedie
2022-12-14 10:03:34 +08:00
噢,没注意审题,想在 vue 运行时还没加载时就开始计时并显示 loading ,应该在 html 的 head 里尽早加载独立的 script 来控制骨架屏的显隐吧
justdoit123
2022-12-14 10:10:56 +08:00
强制至少 loading X 秒的体验会好一点,效果稳定。比如,至少 loading 0.3 秒,如果 0.3 秒后页面还没准备好,那就继续 loading 。
darknoll
2022-12-14 10:15:24 +08:00
vue 没渲染的时候显示 loading ,是怎么整的?
kealm
2022-12-14 10:27:59 +08:00
这个叫 grace time 。一般的处理方式是:1. 增加一个延迟 2. 增加最短展示时间。
延迟时间内不显示 loading ,如果延迟时间内加载完毕,直接进入。如果延迟时间内没有加载完毕,显示 loading ,时间是 MIN(最短展示时间,实际时间)。
kealm
2022-12-14 10:28:24 +08:00
@kealm MIN => MAX
dreamn
2022-12-14 10:33:22 +08:00
试试渐变显示 loading ,渐变退出 loading 的方案呢?
这样视觉上就是不是闪烁效果了.....
rrZ2C
2022-12-14 10:41:18 +08:00
设置至少 loading 1 秒
flyingghost
2022-12-14 12:20:13 +08:00
进页展示一个透明 1s 后渐入 100%的动画 loading 。
4771314
2022-12-14 15:32:05 +08:00
这个确定不是 yy 的需求或者老板的需求?
听起来不怎么靠谱
YouTing
2022-12-14 15:46:52 +08:00
请求速度快的时候出现 loading ,而较快时不出现。月经问题了,淘宝在用 setTimeout ,缺点是一秒左右的 loading 体验不好,0.9 秒没有 loading ,1.1 秒 loading 一闪而过
likunyan
2022-12-14 15:51:46 +08:00
都被你们玩花了,该显示就显示,不显示就不要显示。
jorneyr
2022-12-14 16:21:10 +08:00
underscore 的 throttle 函数可以处理这个问题。
296727
2022-12-14 16:22:50 +08:00
。。。。一个 css 的 transiton 不就可以了,还要这么折腾
sanmaozhao
2022-12-14 16:31:44 +08:00
这题我做过。
分析一下题目:
>> 在还 vue 没渲染的时候显示 loading ,挂载渲染后隐藏 loading
这一条,把 loading 界面放到 vue 实例挂在的 DOM 元素里面就行了,挂载后组件渲染出来的 DOM 会替换原本的内容

>> 首页加载超过 1 秒才显示 loading ,1 秒内就不显示 loading
给上一条的 loading 界面加个 css 样式,透明度为 0 ,所以开始时看不到这个 loading 界面
然后再加个 css animation ,1s 后把透明度变为 1 ,所以这时就能看到了
样例代码:
@keyframes fadeIntLoading {
from {
opacity: 0;
}
to {
opacity: 1;
}
}

animation: fadeIntLoading 0.1s linear 1s forwards;
opacity: 0;
sanmaozhao
2022-12-14 16:33:29 +08:00
fadeIntLoading 不小心多打了个 t ,不过不影响功能
loolac
2022-12-14 16:36:47 +08:00
loading 添加渐显过渡动画,超过 1s 才全部显示出来,小于 1s 就是没全部显示就渐隐了
jeffwcx
2022-12-14 16:39:24 +08:00
这个一般放到 html 里面做,不放在 vue 里面做
sanmaozhao
2022-12-14 16:53:42 +08:00
写了个样例,直接就有效果

https://codepen.io/sanmao/pen/eYKwLRv

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/902320

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX