Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 531|回复: 0

解决vue更新默认值时出现的闪屏问题

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 802 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726006
    发表于 2021-5-31 10:02:51 | 显示全部楼层 |阅读模式

      在Vue项目中,对于一个展示用户个人信息的页面。有以下需求,需要判断用户个人信息是否填充过,如果填充过,需要在页面中展示已填充项(未填充项不展示);如果未填充过,需要在页面中显示另外一种元素(提示用“去完善”个人信息)。

      这时候,我们在页面中有如下元素

    <div v-if="userExist">
        // 这里展示用户已填充的信息内容
    </div>
    <div v-else>
        <img class="user-pic-tip" src="../../images/no_info.png"/>
        <div class="user-info-tip">
            <span>暂无基本资料数据</span>
            <router-link to="/editUser">
                <span class="data-link-to">去完善</span>
            </router-link>
        </div>
    </div>

      data中userExist有默认值——false:

    export default {
        name: "healthData",
        data() {
            return {
                userExist: false, // 标记用户是否已填充个人信息
            }
         };
    },
    

      而用户到底有没有填充过个人信息是需要在mounted中通过接口从后端获取数据才可以知道,这里如果是填充过,后端会返回状态码200;如果没有填充过,后端会返回状态码201。

    axios.get('/userInfo').then(res => {
        if (res.data.data && res.data.status == 200) {
            this.userExist = true
            // 这里填充对所返回用户数据的解析
        }
    }  
    

      在上面这种代码情况下,因为userExist默认值为false,所以默认需要展示无数据的页面元素。又因为userExist值得变更需要通过axios请求的方式获取,就会有延时问题,即产生页面闪烁的情况

      

    解决方式:

      这种问题我们就可以通过如下方式解决,因为无数据是页面中的元素较少,我们可以跟它们中的图片路径、文字等内容的初始值设置为空,请求结束时再为其重新赋值。

      页面元素部分:

    <div v-if="userExist">
        // 这里展示用户已填充的信息内容
    </div>
    <div v-else>
        <img class="user-pic-tip" :src="noDataTip.imgSrc"/>
        <div class="user-info-tip">
            <span>{{noDataTip.tipInfo}}</span>
            <router-link to="/editUser">
                <span class="data-link-to">{{noDataTip.jumpEditUser}}</span>
            </router-link>
        </div>
    </div>

      在data中进行声明:

    export default {
        name: "healthData",
        data() {
            return {
                userExist: false, // 标记用户是否已填充个人信息
                noDataTip: { // 用户未填写个人信息时要显示的页面元素的填充内容
                    imgSrc: '',
                    tipInfo: '',
                    jumpInfo: ''
                }
            }
         };
    },    
    

      重新赋值的过程:

    axios.get('/userInfo').then(res => {
        if (res.data.status == 10001) {
            return context.noDataTip = {
                imgSrc:  require('../../images/no_data.png'),
                tipInfo: '暂无基本资料数据',
                jumpInfo: '去完善'
            }
        }
        if (res.data.data && res.data.status == 200) {
            this.userExist = true
            // 这里填充对所返回用户数据的解析
        }
    }  
    

      通过这种方式,用户就不会看到闪烁的情况了。但是,上面这种方式有一个值得注意的地方,img标签的src属性如果想要通过属性绑定的方式给其动态赋值,有两种处理方式:1.通过上面代码中的 require('') 方式;2.通过书写绝对路径的方式。

     

      属性绑定相关内容可以查看这篇文章:https://www.cnblogs.com/belongs-to-qinghua/p/10939900.html

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-15 12:53 , Processed in 1.058025 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表