uni-app APP开发中对于菊花图的正确使用姿势

前言

在前端开发中,我们经常用菊花图用以提升用户体验。出现菊花图的原因,99%的可能性是用户处于弱网或无网状态,1%的可能性是服务端数据处理太费时间,导致不能尽快响应。从网速上说,PC端从早年间就很少使用菊花图,毕竟入户宽带的网速还是很稳定的,所以菊花图更多用于移动端,本文就围绕uni-app移动端项目来讲。

菊花图与骨架屏

菊花图跟骨架屏是二选一的解决方案,本文只讨论菊花图,但是也说明一下二者的使用场景区别:

1、是否需要提前撑开高度?

  • 需要撑开高度的场景,用骨架屏,比如一个页面的排除顶部导航、搜索条之外的主体内容,分为上中下三部分,那么此场景一定考虑使用骨架屏,因为上中下三部分的加载完成时间是不一定的,可能下部分最先加载完,上部分最后加载完,如果不使用骨架屏,那么上和中部分是0高度,你会先看到下部分的内容,然后“唰”的一下,上、中部分加载完成,又把下部分挤了下去,这就显得非常的业余,用户体验很差。

  • 相反的,不需要提前撑开高度的场景,用菊花图足矣。比如主体内容只有一部分,那么没必要提前撑开高度,菊花图足矣。

2、加载失败的话,是否有垫底内容?

  • 如果有垫底内容,当然用骨架屏,就比如APP首页第一屏通常是九宫格,如果加载失败,通常做法是使用垫底内容,也就是上一次打开APP时加载的九宫格会缓存到本地,这一次就作为垫底内容,同时,要弹出一个toast:网络不给力。

  • 没有垫底内容,当然使用菊花图。

3、是否是用户关注的内容?

  • 对于用户关注内容,可优先考虑菊花图,当然也不绝对。

  • 对于用户不关注的内容,可优先使用骨架屏,当然也不绝对。例如UI有一个横条,里面有头像、昵称、用户等级,这是用户不关注的内容,因为每次都是同样的头像、昵称、用户等级,用骨架屏而且是无动画骨架屏更好。

菊花图的正确使用姿势

零、不要使用全屏菊花图

无论如何不要使用全屏菊花图,你在业界大型APP的使用中,你发现谁采用全屏菊花图了吗?一个都没有。

APP的一大原则就是尽量加载,也就是说页面模块能分着加载的,优先考虑分着加载,避免一个接口管所有内容,能读取缓存的,就拿缓存当垫底内容,这样的话,页面总会有部分区域是有内容的,那么你用全屏菊花图,意味着全页面被遮挡,也无法进行别的操作,是错误的做法。

一、首先准备一个flag叫做loadingStatus

loadingStatus有几种可能的值:

  • 空串,发起ajax之前默认是空串,或者当有结果且结果有内容,也就是最正常的情况,也应重置为空串

  • 'pending',当ajax发起且未收到请求时,应设为'pending',然后提示菊花图和“加载中”即可。

  • 'empty',当ajax有结果且内容为空时,应设为'empty',然后提示“没有内容”即可。

  • 'error',当ajax有结果且出错时,应设为'error',然后提示“网络不给力”即可。

这里多说一句:可能当前业界流行的报错信息是:“服务器连接超时”、“服务器500错误”、“一串英文提示”等等,事实上纯属多余,因为你无需跟用户做具体解释,原因是用户根本看不懂,什么叫超时?什么叫500错误?还给我英文提示?用户看得懂吗?并且,即便用户看得懂也没有什么鸟用,就比如你看到Windows的蓝屏提示,即便你看得懂,你又能如何呢?服务器500错误,用户又能找谁呢?很多程序员没有用户思维,只为了自己调试方便,于是把错误信息显示在UI中,愚蠢啊。所以:

  • 网络连接超时:当然属于“网络不给力”,所以应该改成“网络不给力”。

  • 500错误:首先500错误就是程序员造成的bug,道理上说不应该在线上服务器出现,即便真的是服务器BUG导致了出错,也不能承认,也要归咎于网络不给力,反正无法提供正常服务了,现在就是要保全服务器的面子,该嘴硬就要嘴硬,明白吗?所以也要改成“网络不给力”。

  • 401错误:也就是用户权限过期,应当跳转到登录页。

  • 后端程序员专门写的各种提示:

    • 对于GET来讲,不要费心写提示!排除500错误的话,只剩下没有数据这一种可能性,前端还能不知道么?

    • 对于其他方法来讲,只需要简单提示,例如:删除失败,无此记录,即可!当然,这不在本文讨论范围内。

二、html架构和JS代码

以Vue为例,伪代码如下:

    <view v-if="loadingStatus === ''  || (noteList.length && loadingStatus === 'pending')">
      <view v-for="item in noteList" :key="item.id">
        <!-- item的内容 -->
      </view>
    </view>

    <view v-else>
      <u-loading-icon v-if="loadingStatus === 'pending'" text="加载中"></u-loading-icon>
      <view v-else-if="loadingStatus === 'error'">
        <text>网络不给力</text>
        <u-button text="重新加载" class="margin-top-20" @click="getNoteList"></u-button>
      </view>
      <u-empty v-else mode="list" text="暂无内容"></u-empty>
    </view>

解释一下:

  1. 发起ajax前,loadingResult是空串,所以模板显示最上方的分支,而最上方的分支有可能是白板,有可能是旧内容,都无所谓。

  2. 将ajax的超时时间设为11秒,因为人的舒适等待极限就是11秒。

  3. 发送请求前,loadingResult设为'pending'

  4. 假设11秒内拿到了响应,且数据有内容,那么loadingResult重置为空串,且v-for生效,于是看到了正确内容。

  5. 假设11秒内拿到了响应,但数据没内容,则loadingResult设为'empty',这时候模板显示下方分支,屏幕显示“暂无内容”的分支。

  6. 假设11秒内没有响应,或有响应且是出错响应,则loadingResult设为'error',提示“网络不给力”

  7. 相当重要的一点:在报错文字的下方,必须放上“重新加载”按钮,毕竟APP是没有浏览器的“刷新”按钮的。

JS伪代码如下:

getNoteList() {
  this.loadingStatus = 'pending';
  return this.$api.getNoteList().then(
    response => {
      if (response.rows && response.rows.length) {
        this.noteList = response.rows;
        this.loadingStatus = '';
      } else {
        this.loadingStatus = 'empty';
      }
    },
    () => {
      this.loadingStatus = 'error';
    }
  );
},

三、配置ajax库响应拦截器

结合上文的知识,除了1. 有内容正常响应、2. 无内容正常响应、3. 请重新登录之外,一律算出错,而报错文本一律使用“网络不给力”就完事,尤其是没有必要区分无网络、服务器连接超时、服务器内部错误。

对于“请重新登录”,直接跳转到登录页面即可,原页面显示什么已经无所谓,所以不需要做考虑。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,814评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,124评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,814评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,924评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,815评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,562评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,944评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,582评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,859评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,881评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,700评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,493评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,943评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,115评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,413评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,978评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,182评论 2 339

推荐阅读更多精彩内容