vue.js数据加载完成前显示原代码{{代码}}问题及解决

 更新时间:2023年07月03日 09:23:15   作者:美奇开发工作室  
这篇文章主要介绍了vue.js数据加载完成前显示原代码{{代码}}问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

vue.js数据加载完成前显示原代码{{代码}}

分析原因

首先了解HTML的加载顺序:

解析html结构 → 加载外部脚本和样式表文件 → 解析并执行脚本代码 → 构造html dom模型 → 加载图片等外部文件 → 页面加载完毕

得出结论:

通过以上分析可知,当html加载的时候,就会把{{代码}} 当成文本加载出来,当vue初始化完成后,才会把{{代码}}解析成vue的语法。如果把引入vue.js的script放到head里面,那页面不会出现{{代码}},因为在body之前就把vue引入进来了,vue加载完成了。

解决方法 

1、方式一:使用 v-cloak指令

<div v-cloak>{{msg}}</div>

2、方式二:使用 v-html指令

<div v-html='msg'></div>

3、方式三:使用 v-text指令

<div v-text='msg'></div>

4、方式四:使用template标签将需要渲染的html包起来

HTML的 <template> 元素是一种用于保存客户端内容的机制,该内容在页面加载时不被渲染,但可以在运行时使用JavaScript进行实例化。

<div id="app"></div>
<!--此处template标签必须在vue绑定的元素外面定义,并且在页面中不显示下面的template标签中的内容-->
<template id="demo">
    <div v-if="flag">{{msg}}<div>
    <div v-else>无数据<div>
</template>
<script src="./js/vue.js"></script>
<script>
    let vm = new Vue({
        el:"#app",
        data:{
            msg:"hello world",
            flag:true
        },
        template:"#demo"//通过该属性可以将自定义的template属性中的内容全部替换app的内容,并且会覆盖里面原有的内容,并且在查看dom结构时没有template标签
    });
</script>

vue数据未加载完成前显示loading遮罩

目的

在前后端分离项目中,由于页面请求和数据请求并非同步,所以导致页面和数据不能同时渲染,因此在实际过程中往往采用SSR即服务端渲染或者请求数据时采用遮罩(加载中)的方式提升用户体验。

下面我将使用loading遮罩的方式实现更加友好的数据加载

参考:https://codepen.io/bartezic/pen/ByqeNq

效果

代码

1.在App.vue中添加一个<div>

<div>
    <div id="appLoading">
      <div class='lmask'></div>
    </div>
    <div id="app">
      <router-view v-if="isRouterAlive"/>
    </div>
  </div>

2.以下是CSS样式

.lmask {
  position: absolute;
  height: 100%;
  width: 100%;
  background-color: #000;
  bottom: 0;
  left: 0;
  right: 0;
  top: 0;
  z-index: 9999;;
  opacity: 0.4;
  &.fixed {
    position: fixed;
  }
  &:before {
    content: '';
    background-color: rgba(0,0,0,0);
    border: 5px solid rgba(0,183,229,0.9);
    opacity: .9;
    border-right: 5px solid rgba(0,0,0,0);
    border-left: 5px solid rgba(0,0,0,0);
    border-radius: 50px;
    box-shadow: 0 0 35px #2187e7;
    width: 50px;
    height: 50px;
    -moz-animation: spinPulse 1s infinite ease-in-out;
    -webkit-animation: spinPulse 1s infinite linear;
    margin: -25px 0 0 -25px;
    position: absolute;
    top: 50%;
    left: 50%;
  }
  &:after {
    content: '';
    background-color: rgba(0,0,0,0);
    border: 5px solid rgba(0,183,229,0.9);
    opacity: .9;
    border-left: 5px solid rgba(0,0,0,0);
    border-right: 5px solid rgba(0,0,0,0);
    border-radius: 50px;
    box-shadow: 0 0 15px #2187e7;
    width: 30px;
    height: 30px;
    -moz-animation: spinoffPulse 1s infinite linear;
    -webkit-animation: spinoffPulse 1s infinite linear;
    margin: -15px 0 0 -15px;
    position: absolute;
    top: 50%;
    left: 50%;
  }
}
@-moz-keyframes spinPulse {
  0% {
    -moz-transform:rotate(160deg);
    opacity: 0;
    box-shadow: 0 0 1px #2187e7;
  }
  50% {
    -moz-transform: rotate(145deg);
    opacity: 1;
  }
  100% {
    -moz-transform: rotate(-320deg);
    opacity: 0;
  }
}
@-moz-keyframes spinoffPulse {
  0% {
    -moz-transform: rotate(0deg);
  }
  100% {
    -moz-transform: rotate(360deg);
  }
}
@-webkit-keyframes spinPulse {
  0% {
    -webkit-transform: rotate(160deg);
    opacity: 0;
    box-shadow: 0 0 1px #2187e7;
  }
  50% {
    -webkit-transform: rotate(145deg);
    opacity: 1;
  }
  100% {
    -webkit-transform: rotate(-320deg);
    opacity: 0;
  }
}
@-webkit-keyframes spinoffPulse {
  0% {
    -webkit-transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
  }
}

3.此时遮罩层显示,我们需要当App加载完成后取消遮罩层,即display: none

document.getElementById('app').style.display = 'block';
	document.getElementById('appLoading').style.display = 'none';

4.如何在我们需要的地方调用呢

我采用的方法是写一个loading和loaded函数,在分别在请求数据前和请求数据完成后调用,因为该功能可能会重复的使用,所以将其封装成为一个可以复用的模块

在App.vue中写两个方法:

provide() {
	    return {
	      loading: this.loading,
	      loaded: this.loaded
	    }
	  },
	  methods: {
		loading() {
		      document.getElementById('app').style.display = 'block';
		      document.getElementById('appLoading').style.display = 'block';
		},
	    loaded() {
	      document.getElementById('app').style.display = 'block';
	      document.getElementById('appLoading').style.display = 'none';
	    }
	  }

上面将这两个函数给暴露了出来,在我们需要的地方inject就好

5. 在需要使用的地方调用

export default {
  inject: ['loading', 'loaded'],
  name: "index",
  created() {
    this.getData()
  },
  methods: {
    getData() {
      this.loading()
      getUserInfo().then(res => {
        this.userInfo = res.data
      }).finally(() => {
        this.loaded()
      })
    }
  }
}

完成 !

实现思路非常简单,就是请求数据之前将遮罩显示,加载数据完成后将遮罩隐藏

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue实现生成本地Json文件功能方式

    Vue实现生成本地Json文件功能方式

    这篇文章主要介绍了Vue实现生成本地Json文件功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • vue对象拷贝,解决由于引用赋值修改原对象的方式

    vue对象拷贝,解决由于引用赋值修改原对象的方式

    这篇文章主要介绍了vue对象拷贝,解决由于引用赋值修改原对象的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • vue动态绑定多个类名方法详解(:class动态绑定多个类名)

    vue动态绑定多个类名方法详解(:class动态绑定多个类名)

    vue中可以通过:class=""这样来根据一定的条件来动态添加class,但是有时候需要判断的条件比较多,需要动态添加的class也比较多,下面这篇文章主要给大家介绍了关于vue动态绑定多个类名(:class动态绑定多个类名)的相关资料,需要的朋友可以参考下
    2022-11-11
  • 使用Axios拦截器中止Vue请求的步骤详解

    使用Axios拦截器中止Vue请求的步骤详解

    假设 App 的用户可以在短时间内进行多个 API 调用,但您只想显示上次调用的结果,之前正在进行的请求变得无关紧要,在这种情况下,您可以利用 Axios 拦截器,本文给大家介绍了如何使用Axios拦截器中止Vue请求,需要的朋友可以参考下
    2023-11-11
  • vue中json格式化显示数据(vue-json-viewer)

    vue中json格式化显示数据(vue-json-viewer)

    这篇文章主要给大家介绍了关于vue中json格式化显示数据(vue-json-viewer)的相关资料,Vue-json-viewer是一个Vue组件,用于在Vue应用中显示JSON数据的可视化工具,需要的朋友可以参考下
    2024-05-05
  • Vue注册组件命名时不能用大写的原因浅析

    Vue注册组件命名时不能用大写的原因浅析

    这段时间一直在弄vue,当然也遇到很多问题,这里就来跟大家分享一些注册自定义模板组件的心得 ,需要的朋友可以参考下
    2019-04-04
  • Vuex 单状态库与多模块状态库详解

    Vuex 单状态库与多模块状态库详解

    这篇文章主要介绍了Vuex 单状态库与多模块状态库详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • vue实现的微信机器人聊天功能案例【附源码下载】

    vue实现的微信机器人聊天功能案例【附源码下载】

    这篇文章主要介绍了vue实现的微信机器人聊天功能,结合实例形式分析了基于vue.js的微信机器人聊天相关界面布局、ajax交互等操作技巧,并附带源码供读者下载参考,需要的朋友可以参考下
    2019-02-02
  • vue3中如何使用d3.js绘制流程图(TS语法)

    vue3中如何使用d3.js绘制流程图(TS语法)

    这篇文章主要给大家介绍了关于vue3中如何使用d3.js绘制流程图的相关资料,D3.js是由javaScript语言编写绘图库,其原理是通过调用一系列内置函数,生成SVG,并在网页渲染,需要的朋友可以参考下
    2023-10-10
  • 一文带你深入理解Vue3中Composition API的使用

    一文带你深入理解Vue3中Composition API的使用

    Composition API 是 Vue 3 中的一项强大功能,它改进了代码组织和重用,使得构建组件更加灵活和可维护,本文我们将深入探讨 Composition API 的各个方面,希望对大家有所帮助
    2023-10-10

最新评论