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 脚本,我希望资源全部加载完成之前不要展示页面,这种应该怎么做呢?

6030 次点击
所在节点    Vue.js
32 条回复
lvdb
2021-04-18 22:42:56 +08:00
useEffect
joesonw
2021-04-18 23:29:08 +08:00
纯 html 放 loadong,加载完后再干掉。
echowuhao
2021-04-18 23:29:50 +08:00
freak118
2021-04-18 23:57:18 +08:00
@lvdb 能详细说说吗
ch2
2021-04-19 00:18:20 +08:00
在首屏的那个 html 里做 loading,等 js 啥的加载完了再让它消失
LeeReamond
2021-04-19 01:29:05 +08:00
@ch2
@joesonw
思路是这么个思路,但是具体操作怎么做呢,是类似让 vue 搜索 loading 的 id 然后干掉这个 element 么。

另外一个问题是 vue 怎么知道自己加载完成了,因为我用 vuetify 模板,还需要引入一些 google 字体和图标 css 之类的,可能还有图片
LeeReamond
2021-04-19 01:56:46 +08:00
@LeeReamond 试了一下往 index.html 里加东西。。结果变成不管哪个路由都会先闪过一下 loading 画面,感觉不太好
kmore
2021-04-19 08:07:38 +08:00
vue 生命周期函数 beforeCreate 实例初始化加入 loading,created 实例创建完成结束 loading,全局写个 mixin
yesC
2021-04-19 08:55:18 +08:00
如果用到 vue-router 的话可以看看路由守卫,可以配合组件 nprogress,这个效果和你说的需求很相似,可以参照着改改。
WEBUG
2021-04-19 08:56:49 +08:00
@LeeReamond 初次加载的 loading 写在 index.html 里面,写一个内部 css,在 index 最下方写 js 方法干掉 css 。其他阶段的 loading 就写在 vue 里面了。
plk403
2021-04-19 09:00:46 +08:00
我也有一个问题,怎样让当前路由的图片全部加载完之前显示 loading 呢? ? ? 就是判断图片全部加载完毕再显示页面...给跪了
lh900519
2021-04-19 09:05:48 +08:00
@LeeReamond 把 loading 的代码放到#app 元素里面,vue 开始渲染的时候,会把#app 里面的元素给替换掉
iplayio2019
2021-04-19 09:16:04 +08:00
我以前这么写过,写一个 loading 全局计数器,开始请求计数器加 1,请求完成计数器减 1,百分比增加百分 20,如果百分比小于 80%,直到计数器为 0 。
cyrbuzz
2021-04-19 09:46:05 +08:00
还有一个思路是用 SSR,Nuxt 里写 layout,这样就可以完全使用 Vue 的生命周期。
cereschen
2021-04-19 10:38:24 +08:00
都没说到点子上去 用异步组件 请阅读文档
emeab
2021-04-19 11:08:26 +08:00
v-cloak?
pouta
2021-04-19 11:13:35 +08:00
看官方文档,全局路由守卫
chouchoui
2021-04-19 11:15:19 +08:00
zhuweiyou
2021-04-19 11:40:45 +08:00
直接在 public/index.html 里面写 loading show
cereschen
2021-04-19 12:08:49 +08:00
我觉得直接说去看文档 确实有些不够负责任
我这里给出了示例代码 组件的加载完全由自己掌握

export default new Router({
routes: [
{
path: '/',
name: 'start-page',
component: () => ({
// 需要加载的组件 (应该是一个 `Promise` 对象)
component: new Promise(r => {
setTimeout(() => {
r(import('@/views/start'))
}, 2000);
}),
// 异步组件加载时使用的组件
loading: {
render(h) {
h('div', 'loading.....')
}
},
// 加载失败时使用的组件
error: {
render(h) {
h('div', 'error.....')
}
},
// 展示加载时组件的延时时间。默认值是 200 (毫秒)
delay: 5000,
// 如果提供了超时时间且组件加载也超时了,
// 则使用加载失败时使用的组件。默认值是:`Infinity`
timeout: 30000
})
}]
})

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

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

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

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

© 2021 V2EX