目前我采用的是常规的实现方式,在还 vue 没渲染的时候显示 loading ,挂载渲染后隐藏 loading ,首次效果不错,但是后续浏览器有缓存了,在加载很快的情况下,loading 的显示就会闪一下,感觉不是很爽,有办法实现我标题中的这种需求吗。。

强行假装 1 秒再展示即可。

这个我也想到了,延迟 1 秒在隐藏,看看其他兄弟有没有好办法,不行的话只能这么改咯。。

全屏 loading 的话可以强行多看几秒 loading

const timeoutId = setTimeout(() => this.loading = true, 1000)
try {
const res = await getResource()
} catch(err) {
console.log(err)
}
this.loading = false
clearTimeout(timeoutId)

骨架屏 / v-cloak

如果你的 loading 在实例中的话,可以用 defineAsyncComponent 定义一个入口的异步组件,在 loader 里面加载数据和其他组件,用 delay 控制 loadingComponent 的展示时机。

记一下平均耗时?超过一定范围才渲染 loading

强行显示 1 秒的 loading 呗,不然还有啥办法呢?毕竟你不能预知要加载多久啊😂

咋判断时间呢,我题目就是问这个的意思。。

#9 juejin.cn/post/6844903569900978189
参考这个?不是让你算现在这个页面加载多久再决定是否开启 loading
是让你算前面几个页面的平均值,小于一定值就禁用 loading

在 index.html 的 head 元素里用 js script 脚本设置个 1 秒的 timeout ,到了再显示 loading 。当在 vue 加载出来时判断这个 timeout 在不,如果在的话(加载时间小于 1 秒)取消掉。

刚好 1.1 秒加载完成呢,loading 不还是一闪而过吗,所以问题不在这

以前好像做过但是没用判断不出来 contentloaded 时间 伪 1S 感觉在浪费时间尽管人感受不出来速度。所以感觉没必要折腾完美。

300ms 内没加载完才显示 loading ,如果显示 loading ,至少显示 1s

1s 已经够久的了

我是强制显示 1 秒的 loading 。。

antd 的 Spin 就是这种设计, 但是我觉得, 直接展示 loading,至少展示 300ms 的逻辑更简单

直接显示加载指示器,给这个组件加上 1 秒的 opacity 从 0 到 100% 的 transtion

让你的 loading 延迟一秒展示

谁喜欢看 loading 啊,一闪而过代表网速性能好,是正反馈啊。

我就是这么用的,实现没用 js ,用的是 css animation 就有的延迟动画 1s 功能

我会选择用 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});

噢,没注意审题,想在 vue 运行时还没加载时就开始计时并显示 loading ,应该在 html 的 head 里尽早加载独立的 script 来控制骨架屏的显隐吧

强制至少 loading X 秒的体验会好一点,效果稳定。比如,至少 loading 0.3 秒,如果 0.3 秒后页面还没准备好,那就继续 loading 。

vue 没渲染的时候显示 loading ,是怎么整的?

这个叫 grace time 。一般的处理方式是:1. 增加一个延迟 2. 增加最短展示时间。
延迟时间内不显示 loading ,如果延迟时间内加载完毕,直接进入。如果延迟时间内没有加载完毕,显示 loading ,时间是 MIN(最短展示时间,实际时间)。

MIN => MAX

试试渐变显示 loading ,渐变退出 loading 的方案呢?
这样视觉上就是不是闪烁效果了.....

设置至少 loading 1 秒

进页展示一个透明 1s 后渐入 100%的动画 loading 。

这个确定不是 yy 的需求或者老板的需求?
听起来不怎么靠谱

请求速度快的时候出现 loading ,而较快时不出现。月经问题了,淘宝在用 setTimeout ,缺点是一秒左右的 loading 体验不好,0.9 秒没有 loading ,1.1 秒 loading 一闪而过

都被你们玩花了,该显示就显示,不显示就不要显示。

underscore 的 throttle 函数可以处理这个问题。

。。。。一个 css 的 transiton 不就可以了,还要这么折腾

这题我做过。
分析一下题目:

在还 vue 没渲染的时候显示 loading ,挂载渲染后隐藏 loading
这一条,把 loading 界面放到 vue 实例挂在的 DOM 元素里面就行了,挂载后组件渲染出来的 DOM 会替换原本的内容

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

animation: fadeIntLoading 0.1s linear 1s forwards;
opacity: 0;

fadeIntLoading 不小心多打了个 t ,不过不影响功能

loading 添加渐显过渡动画,超过 1s 才全部显示出来,小于 1s 就是没全部显示就渐隐了

这个一般放到 html 里面做,不放在 vue 里面做

写了个样例,直接就有效果

codepen.io/sanmao/pen/eYKwLRv

这个看起来和你说的异曲同工, baiyun.me/improve-the-user-experience-for-react-apps

这样行的不...

// 初始 loading 为 false

let timer = setTimeout(() => {
 loading = true
}, 1000)

// 在 App.vue 的 mounted 钩子中
loading = false // 假设加载资源已经超过 1s ,在挂载完成时取消 loading

clearInterval(loading) // 假设 1s 内已经挂载完成,取消 loading

如果用了 RxJS , 也可以实现, juejin.cn/post/7176943529057321017

不就普通的延时 Loading 么?

都是差不多的思路,一般是设置延迟 2~3 秒显示 Loading ,如果期间数据还没加载完,那就继续显示 Loading ;

如果 2~3 秒内已经加载完了,就取消 Loading

js 文件本身的加载时间是未知的,所以任何 js 层面的处理都达不到你想要的效果。如果这个误差你能接受,那随便挑一个方法都行。

关键词: setTimeout

试试用 tmpUI 做真加载进度
github.com/tmplink/tmpUI

特意登陆来回复你一下:
把 Loading 写在 HTML 模版中,页面开始加载时 setTimeout 计时一秒开始展示 Loading DOM
在 Vue 的初始化逻辑中加载完成时 remove 掉 Loading DOM 即可

/* 秒级响应不再显示 loading 弹窗 /
const delay = 1000
let timeoutId = setTimeout(() => {
if (loading) {
timeoutId = 0;
//
showLoading()
}
}, delay);

// 响应里面
if(timeoutId==0){
closeLoading()
}