vue 如何实现 loading 读条,加载完成后显示页面?

2021-04-18 22:38:44 +08:00
 LeeReamond

以前都是做单个组件的 axios 回调绑定加载完成事件,感觉还比较简单,现在想做一个全局读条,不会做了

具体分为两个问题,其一是如何让用户在第一次打开页面时读一个条。比如用户第一次访问我的网站,而我的前端 spa 体积比较大,可能读个一两秒钟,这段时间我要在 vue 还没加载完成之前放一个 loading,然后等 vue 加载完成之后删掉这个 loading,没想好怎么做。

其二是 vue 加载完成之后,单个路由页面的 loading,比如用户默认打开 index.html 之后,这时候 vue 的 js 已经在本地了,现在想跳转到 catalogue 页面,这个页面需要再额外加载若干图片和 css/js 脚本,我希望资源全部加载完成之前不要展示页面,这种应该怎么做呢?

6393 次点击
所在节点    Vue.js
32 条回复
hm20062006ok
2021-04-19 13:48:06 +08:00
第一个问题, 如果“用户第一次访问我的网站”打开的是首页。下面有一个效果:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="renderer" content="webkit">

<title>WebSiteName</title>
<style type="text/css">body {
margin: 0;
padding: 0
}

.loading {
width: 100%;
height: 100%;
background: #fff;
position: absolute
}

.lodingco {
width: 200px;
height: 80px;
text-align: center;
z-index: 1;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto
}

.loading h2 {
color: #666;
margin: 0;
text-transform: uppercase;
letter-spacing: .1em;
font-size: 20px;
font-weight: 400;
font-family: cursive
}

.loading span {
display: inline-block;
vertical-align: middle;
width: .6em;
height: .6em;
margin: .19em;
background: #007DB6;
border-radius: .6em;
-webkit-animation: loading 1s infinite alternate;
animation: loading 1s infinite alternate;
animation: loading 1s infinite alternate
}

.loading span:nth-of-type(2) {
background: #008FB2;
-webkit-animation-delay: .2s;
animation-delay: .2s
}

.loading span:nth-of-type(3) {
background: #009B9E;
-webkit-animation-delay: .4s;
animation-delay: .4s
}

.loading span:nth-of-type(4) {
background: #00A77D;
-webkit-animation-delay: .6s;
animation-delay: .6s
}

.loading span:nth-of-type(5) {
background: #00B247;
-webkit-animation-delay: .8s;
animation-delay: .8s
}

.loading span:nth-of-type(6) {
background: #5AB027;
-webkit-animation-delay: 1s;
animation-delay: 1s
}

.loading span:nth-of-type(7) {
background: #A0B61E;
-webkit-animation-delay: 1.2s;;
animation-delay: 1.2s
}

@-webkit-keyframes loading {
0% {
opactty: 0
}
100% {
opacity: 1
}
}

@keyframes loading {
0% {
opacity: 0
}
100% {
opacity: 1;
}
}</style>
</head>
<body>

<div id="app">
<div class="loading">
<div class="lodingco"><h2>WebSiteName Loading</h2>
<span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div>
</div>
</div>

</body>


</script>
</html>
joesonw
2021-04-19 13:56:08 +08:00
@LeeReamond js 加载完后, 加载 img 的时候加一个 onload, 手动计数.
rozbo
2021-04-19 14:16:19 +08:00
slert
2021-04-19 14:58:57 +08:00
nuxt 的 spa 模式就自带这个效果
ToPoGE
2021-04-19 16:55:09 +08:00
在 index.html 的里写加载样式,
在 index.html 里写 window.onload 事件,取消加载样式
你在 vue 里写的加载,只能用于 vue.js 载入完成后才生效,不然之前就是白屏
其实说白了就是 index.html 加载完成,但是你 vue 及相关库没载入完成,之间的 loading 效果
LeeReamond
2021-04-19 18:56:14 +08:00
@ToPoGE 感觉可以操作,大佬请教一下 onload 怎么理解,它这个加载完成,是指 vue 将 dom 渲染完,还是说文件下载到本地( vue 还没执行 create 之前)就已经触发 onload 了?如果 vue 中又添加了新的依赖,应该怎么理解呢,比如下载了 vue 的文件,然后 vue 又要求某个 css,onload 会触发两次么
HiCode
2021-04-19 20:19:48 +08:00
这两个问题凑一起真是绝了!

https://v2ex.com/t/771311#reply23

楼主先把最基础的 html 和 js 学好了,这个问题就不是问题了。
LeeReamond
2021-04-19 21:19:55 +08:00
@HiCode 无非讨论一些实现上的惯例,我觉得跟学没学好基础没什么关系,而且本来前端也比较随意。看你的回复是觉得太简单了不屑于讨论这类问题?
HiCode
2021-04-19 23:49:05 +08:00
@LeeReamond 真有趣,等你基础补好了,你回头再看看你上面给其他人的回复,就知道我为什么会说是基础的问题。

这不是屑不屑的问题,而是说答案就在那里,有些人直接往答案的方向走,有些人选择 v2 上提问,前者事半功倍,后者事倍功半。

没有说哪种对哪种错,时间是自己的,开心就好!
LeeReamond
2021-04-20 00:06:45 +08:00
@rozbo 大佬,你这个方案我试了一下,在本地 dev 调试的话,每次刷新任何界面都会闪过 loading 界面,build 之后上传到远端以后反而不会了,大佬能讲下啥原因么
LeeReamond
2021-04-20 00:10:06 +08:00
@HiCode 确实挺有趣的,可能不是技术的问题,应该只是单纯的阅读理解问题。至于你说的上面其他人的回复,楼上提的 nprogress,路由守卫自定义,和 vue 接管前插入几个方案我都试了,没有找到特别完美的解决方案,我倒不是很懂你说的补好基础再回来看指看什么。
HiCode
2021-04-20 00:41:23 +08:00
第 5 楼:“思路是这么个思路,但是具体操作怎么做呢,是类似让 vue 搜索 loading 的 id 然后干掉这个 element 么。”

直接通过 dom 接口查找 loading 响应的节点,删掉,跟 vue 没关系,找个基本的 HTML DOM 教程看一下,最基本的就行。这个都可以说没有思路,感觉就不是做前端的了。

第 21 楼:“感觉可以操作,大佬请教一下 onload 怎么理解,它这个加载完成,是指 vue 将 dom 渲染完,还是说文件下载到本地( vue 还没执行 create 之前)就已经触发 onload 了?如果 vue 中又添加了新的依赖,应该怎么理解呢,比如下载了 vue 的文件,然后 vue 又要求某个 css,onload 会触发两次么”

他说的是“ window.onload ”,window 对象的 onload 事件,看 dom 教程吧……


看 dom 教程吧……
看 dom 教程吧……
看 dom 教程吧……
看 dom 教程吧……

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

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

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

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

© 2021 V2EX