vue数据加载等待组件

 

关于loading组件的。

loading.vue

<template>
    <div class="loading">
        <div class="mock">数据加载中</div>
        <div class="loader-inner ball-pulse">
            <div></div>
            <div></div>
            <div></div>
        </div>
    </div>
</template>
<script>
    export default {
        data(){
            return{

            }
        }
    };
</script>

<style scoped>
  .loading{
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index:30;
    width: 100%;
    height: 100%;
    background-color: #ffffff;
    opacity: 0.6;
  }
  .loading .mock{
    height: 30px;
    position: absolute;
    top: 45%;
    left: 50%;
    transform: translateX(-50%);
    font-size: 25px;/*px*/
    color: #03a9f4;
    /*text-align: center;*/
    line-height: 30px;
  }
  .ball-pulse{
    position: absolute;
    top: 50%;
    left: 45%;
    transform: translateX(-22%);
  }
  .loading .ball-pulse div{
    background-color: #03a9f4;
    width: 30px;
    height: 30px;
    border-radius: 100%;
    margin: 2px;
    animation-fill-mode: both;
    display: inline-block;
  }
  .loading .ball-pulse div:nth-child(1){
    animation: scale 0.75s -0.24s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08);
  }
  .loading .ball-pulse div:nth-child(2){
    animation: scale 0.75s -0.12s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08);
  }
  .loading .ball-pulse div:nth-child(3){
    animation: scale 0.75s 0s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08)
  }


@-webkit-keyframes scale {
  0% {
    -webkit-transform: scale(1);
    transform: scale(1);
    opacity: 1;
  }
  45% {
    -webkit-transform: scale(0.1);
    transform: scale(0.1);
    opacity: 0.7;
  }
  80% {
    -webkit-transform: scale(1);
    transform: scale(1);
    opacity: 1;
  }
}
@keyframes scale {
  0% {
    -webkit-transform: scale(1);
    transform: scale(1);
    opacity: 1;
  }
  45% {
    -webkit-transform: scale(0.1);
    transform: scale(0.1);
    opacity: 0.7;
  }
  80% {
    -webkit-transform: scale(1);
    transform: scale(1);
    opacity: 1;
  }
}
</style>

 

转载于:https://www.cnblogs.com/WangXinPeng/p/9415448.html

<think> 我们之前讨论了时间转换,现在用户询问的是Vue组件重新加载的方法。 根据提供的引用,特别是引用[2]和引用[3],用户已经看到了几种重新加载组件的方法,包括: 1. 重新加载整个页面(不推荐) 2. 使用v-if(不推荐) 3. 使用$forceUpdate()(可以使用,但不会重置组件的状态,仅仅是强制重新渲染) 4. 使用组件的:key属性(推荐) 另外,引用[3]展示了一个使用v-if结合nextTick来重新加载组件的例子,但实际上它也是通过改变key值来重新创建组件的思路(因为改变key会销毁并重新创建组件)。 因此,重点介绍两种推荐方法: 方法一:使用`v-if`和`nextTick`(类似于引用[3]的方法) 步骤: 1. 在组件上使用v-if指令绑定一个布尔值,控制组件的显示与隐藏。 2. 当需要重新加载组件时,先将该布尔值设为false,然后在nextTick中再设为true。这样组件会被销毁然后重新创建。 方法二:使用`key`属性(推荐) 原理:给组件绑定一个key属性,当key的值改变时,Vue会认为这是一个新的组件,从而销毁旧组件并重新创建新组件。 步骤: 1. 在组件标签上添加`:key`属性,并绑定一个变量(例如`reloadKey`)。 2. 需要重新加载组件时,改变`reloadKey`的值(通常可以递增或者使用时间戳)。 下面通过代码示例详细说明: ### 方法一:使用`v-if`和`nextTick` ```vue <template> <button @click="reloadComponent">重新加载组件</button> <!-- 使用v-if控制组件显示/隐藏 --> <MyComponent v-if="showComponent" /> </template> <script> import MyComponent from './MyComponent.vue' import { nextTick, ref } from 'vue' export default { components: { MyComponent }, setup() { const showComponent = ref(true) const reloadComponent = async () => { // 先隐藏组件 showComponent.value = false // 等待一个tick,确保组件被销毁 await nextTick() // 再显示组件,重新创建 showComponent.value = true } return { showComponent, reloadComponent } } } </script> ``` ### 方法二:使用`:key`绑定(推荐,更简洁) ```vue <template> <button @click="reloadComponent">重新加载组件</button> <!-- 通过改变key来重新加载组件 --> <MyComponent :key="reloadKey" /> </template> <script> import MyComponent from './MyComponent.vue' import { ref } from 'vue' export default { components: { MyComponent }, setup() { const reloadKey = ref(0) const reloadComponent = () => { // 改变key的值,通常递增或使用时间戳 reloadKey.value += 1 // 或者 reloadKey.value = new Date().getTime() } return { reloadKey, reloadComponent } } } </script> ``` ### 注意事项 1. **重新加载组件的含义**:销毁当前组件实例,然后重新创建。这意味着组件的所有状态(包括data、生命周期等)都会重置。 2. **性能考虑**:如果组件较复杂,频繁重新加载可能会影响性能,应避免过度使用。 3. **与`$forceUpdate`的区别**:`$forceUpdate`只强制重新渲染组件,不会重置组件的状态(比如data中的数据不会重置);而上述两种方法会重置整个组件状态。 ### 相关问题 1. 重新加载组件时如何保存某些特定数据不被重置? 2. 在Vue2中如何实现组件的重新加载? 3. 使用`key`重新加载组件有什么潜在问题? 4. 有没有其他方法可以在不重新加载组件的情况下重置状态? </think> ### Vue组件重新加载的实现方法 在Vue中实现组件重新加载有以下几种推荐方法: #### 1. **`:key`绑定法(推荐)** 给组件添加动态key属性,当key变化时Vue会销毁并重建组件: ```vue <template> <button @click="reload">重新加载</button> <MyComponent :key="componentKey" /> </template> <script> export default { data() { return { componentKey: 0 } }, methods: { reload() { this.componentKey += 1; // 修改key触发重建 } } } </script> ``` **原理**:Vue通过key标识组件,key变化时会销毁旧组件并创建新实例[^2]。 #### 2. **`v-if` + `nextTick`组合法** 通过条件渲染控制组件销毁/重建: ```vue <template> <button @click="reload">重新加载</button> <MyComponent v-if="showComponent" /> </template> <script> export default { data() { return { showComponent: true } }, methods: { async reload() { this.showComponent = false; await this.$nextTick(); // 等待DOM更新 this.showComponent = true; } } } </script> ``` **注意**:确保使用`await this.$nextTick()`保证销毁完成后再重建[^3]。 #### 3. **`$forceUpdate`方法(不推荐重置状态)** 仅适用于强制重新渲染: ```javascript methods: { forceReload() { this.$forceUpdate(); // 仅重新渲染,不重置状态 } } ``` **局限**:不会重置组件的data状态,仅触发重新渲染[^2]。 #### 4. **路由重定向法(页面级刷新)** 通过路由跳转实现: ```javascript reloadPage() { // 保存当前路由 const currentRoute = this.$route.path; // 重定向到空路由再返回 this.$router.replace('/blank').then(() => { this.$router.replace(currentRoute); }); } ``` ### 方案对比 | 方法 | 状态重置 | 性能影响 | 推荐场景 | |------------------|----------|----------|------------------------| | key绑定法 | ✅ 完全重置 | 中等 | 通用场景(推荐) | | v-if + nextTick | ✅ 完全重置 | 中等 | 简单组件 | | $forceUpdate | ❌ 不重置 | 低 | 仅需重渲染(非重置) | | 路由重定向 | ✅ 完全重置 | 高 | 需要刷新整个页面时 | ### 最佳实践建议 1. **优先使用key绑定法**,代码简洁且能完全重置状态 2. 复杂组件需注意**性能优化**,避免频繁重建 3. 需要保留部分状态时,可结合Vuex进行状态管理 4. 异步组件加载场景参考引用[4]的懒加载实现 > 示例:使用key绑定法重置表单组件 > ```vue > <UserForm :key="formKey" /> > <button @click="formKey = Date.now()">重置表单</button> > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值