vue获取数据的两种方式实践+简单骨架屏实现

news/2024/7/10 3:25:46 标签: vue, 导航, 骨架屏

vue中获取数据有两种方式,引入尤大大的话就是:

  • 导航完成之后获取:先完成导航,然后在接下来的组件生命周期钩子中获取数据。在数据获取期间显示“加载中”之类的指示。
  • 导航完成之前获取导航完成前,在路由进入的守卫中获取数据,在数据获取成功后执行导航

从技术角度讲,两种方式都不错 —— 就看你想要的用户体验是哪种。那么我们来实践一下这两种获取数据的方式,以及用户体验优化的一点思考。

**一、首先是第一种:导航完成之后获取,**这种方式是我们大部分都在使用的,(因为可能一开始我们只知道这种方式V)。使用这种方式时,我们会马上导航和渲染组件,然后在组件的 created 钩子中获取数据。这让我们有机会在数据获取期间展示一个 loading 状态,还可以在不同视图间展示不同的 loading 状态。获取数据大家都会,这里说下用户体验的一些东西:

  • 在数据获取到之前,页面组件已经加载,但是数据没有拿到并渲染,所以在此过程中,我们不能加载页面内展示数据的那块组件,而是要有一个loading的加载中的组件或者骨架屏
  • 当页面数据获取失败,可以理解为请求超时的时候,我们要展示的是断网的组件。
  • 如果是列表页,还要考虑到空数据的情况,即为空提示的组件。

那么,我们的页面是要有这基本的三个部分的,放代码:

<template>
    <div class="list">
        <!--加载中或者骨架屏-->
        <div v-if="loading">
       
        </div>

        <!--请求失败,即断网的提示组件-->
        <div v-if="error">
      
        </div>

        <!--页面内容-->
        <div v-if="requestFinished" class="content">
            <!--页面内容-->
            <div v-if="!isEmpty">
                <!--例如有个列表,当然肯定还会有其他内容-->
                <ul></ul>
            </div>

            <!--为空提示组件-->
            <div v-else>空空如也</div>
        </div>
    </div>
</template>

这种获取数据的情况下,我们进来默认的是展示loading或者骨架屏的内容,然后如果获取数据失败(即请求超时或者断网),则加载error的那个组件,隐藏其他组件。如果数据请求成功,则加载内容的组件,隐藏其他组件。如果是列表页,可能在内容组件中还会有列表和为空提示两块内容,所以这时候也还要根据获取的数据来判断是加载内容还是加载为空提示。

二、第二种方式:导航完成之前获取

这种方式是在页面的beforeRouteEnter钩子中请求数据,只有在数据获取成功之后才会跳转导航页面。

beforeRouteEnter (to, from, next) {        
    api.article.articleDetail(to.query.id).then(res=> {            
        next(vm => {                
            vm.info = res.data;                
            vm.loadFinish = true            
        })        
    })    
},

  1. 大家都知道钩子中beforeRouteEnter钩子中this还不能使用,所以要想进行赋值操作或者调用方法,我们只能通过在next()方法的回调函数中处理,这个回调函数的第一个参数就代表了this,他会在组件初始化成功后进行操作。
  2. 我想,很多时候我们的api或者axios方法都是挂载到vue的原型上的,由于这里使用不了this,所以只能在页面组件内引入api或者我们的axios。
  3. 赋值操作也可以写在method方法中,但是调用这个赋值方法还是vm.yourFunction()的方式。
  4. 为空提示、断网处理等都和第一种方式一样,但是,由于是先获取到数据之后再跳转加载组件的,所以我们不需要在预期的页面内展示骨架屏或者loading组件。可以,我们需要在当前页面进入之前,即在上一个页面的时候有一个加载的提示,比如页面顶部的进度条。这样用户体验就比较友好了,而不至于因为请求的s速度慢一些导致半天没反应而用户又不知道的结果。全局的页面顶部进度条,可以在main.js中通过router.beforeEach(to, from, next) {}来设置,当页面路由变化时,显示页面顶部的进度条,进入新路由后隐藏掉进度条。

关于怎么添加进度条,因为在另一篇文章已经写了,这里直接送上链接吧,就不再重复浪费地方了。操作也比较简单,可自行查阅。

其实说到了这里,那么骨架屏的事情也就顺带已经解决了,一般页面骨架屏也就是一张页面骨架的图片,但是要注意这张图片要尽可能的小。


码字不易,觉得有帮助的小伙伴点个赞支持下~


http://www.niftyadmin.cn/n/189889.html

相关文章

【redis】redis分布式锁

目录一、为什么需要分布式锁二、分布式锁的实现方案三、redis分布式锁3.1 简单实现3.2 成熟的实现一、为什么需要分布式锁 1.在java单机服务中&#xff0c;jvm内部有一个全局的锁监视器&#xff0c;只有一个线程能获取到锁&#xff0c;可以实现线程之间的互斥 2.当有多个java服…

【数据库管理】⑥日志挖掘LogMiner

1. LogMiner的作用 LogMiner是Oracle数据库中的一个工具&#xff0c;它可以用于分析数据库的重做日志文件&#xff0c;以了解数据库的操作历史和数据变化情况。LogMiner可以将重做日志文件中的SQL语句提取出来&#xff0c;并将其转换成易于理解的格式&#xff0c;以便用户进行分…

Temu病毒式营销,如何在大红利时期快人一步?

从去年9月开始&#xff0c;拼多多推出海外版Temu&#xff0c;大手笔烧钱买量、大手笔补贴消费者&#xff0c;通过令人难以置信的超低价&#xff08;比如一件卫衣2.44美元&#xff0c;且包邮&#xff09;&#xff0c;在北美市场迅速打开局面&#xff0c;并引发海外网友“人传人”…

linux 判断字符包含关系

1、使用~符号 str1“code9527” str2“9527” if [[ $str1 ~ $str2 ]] then echo 包含 else echo 不包含 2、使用*做通配符 str1“code9527” str2“9527” if [[ str1∗str1 *str1∗str2* ]] then echo 包含 else echo 不包含 3、利用正则表达式 str1“code9527” str2“…

chatgpt:栅格化原理和代码

栅格化原理 reference: chatgpt 把某个点根据经纬度放在整数经纬度记录的格子里&#xff0c;并把格子编号与点对应起来。 第一步确定每个格子的长和宽&#xff0c;即经度变化量和纬度变换量&#xff1a; 假设测试点的经纬度是(114度, 22.5度) 划定栅格划分的经纬度范围&a…

Linux cmp 命令

Linux cmp 命令用于比较两个文件是否有差异。 当相互比较的两个文件完全一样时&#xff0c;则该指令不会显示任何信息。若发现有所差异&#xff0c;预设会标示出第一个不同之处的字符和列数编号。若不指定任何文件名称或是所给予的文件名为"-"&#xff0c;则cmp指令…

电容专题:电容直流充电 及其隔直通交原理(电容等效一个电池)

电容直流充、放电 绘制里一个如下的电容充放电电路 充电开关闭合&#xff0c;放电开关断开&#xff0c;对电容进行充电 充电 时间控制开关设置如下 &#xff08;非周期信号&#xff09; 充电开关断开&#xff0c;放电开关闭合&#xff0c;电容放电 放电 时间控制开关设置如下…

C#,码海拾贝(08)——埃特金(Aitken)逐步曲线插值算法,《C#数值计算算法编程》源代码升级改进版

埃特金逐步线性插值法&#xff08;Aitken successive linear interpolation method&#xff09;一种能逐步升阶的插值方法.用拉格朗日插值多项式计算函数近似值时&#xff0c;如果精度不满足要求&#xff0c;需增加插值节点以提高插值多项式次数时&#xff0c;原来算出的结果均…