仿Element-plus写一个自己的v-loading

具体步骤:

1.创建一个vue文件编写加载时的动画
2.封装一个加载指令(将组件挂载至实例中)
3.全局引入

第一步:编写一个加载插件

<template>
    <div class="loading">
        <!-- loading.html -->
        <div class="sk-cube-grid">
            <div class="sk-cube sk-cube-1"></div>
            <div class="sk-cube sk-cube-2"></div>
            <div class="sk-cube sk-cube-3"></div>
            <div class="sk-cube sk-cube-4"></div>
            <div class="sk-cube sk-cube-5"></div>
            <div class="sk-cube sk-cube-6"></div>
            <div class="sk-cube sk-cube-7"></div>
            <div class="sk-cube sk-cube-8"></div>
            <div class="sk-cube sk-cube-9"></div>
        </div>
    </div>
</template>
<script lang="ts" setup></script>
<style lang="scss" scoped>
    .loading {
        position: absolute;
        width: 100%;
        height: 100%;
        left: 0;
        top: 0;
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        background-color: rgba(255, 255, 255, 1);
        z-index: 99999;
        /* loading.css */
        .sk-cube-grid {
            width: 50px;
            height: 50px;
            margin: auto;
            background-color: #fff;
        }
        .sk-cube {
            width: calc(50px / 3);
            height: calc(50px / 3);
            background-color: var(--el-color-primary);
            float: left;
            animation: sk-cube-grid-scale-delay 1.3s infinite ease-in-out;
        }
        .sk-cube-1 {
            animation-delay: 0.2s;
        }
        .sk-cube-2 {
            animation-delay: 0.3s;
        }
        .sk-cube-3 {
            animation-delay: 0.4s;
        }
        .sk-cube-4 {
            animation-delay: 0.1s;
        }
        .sk-cube-5 {
            animation-delay: 0.2s;
        }
        .sk-cube-6 {
            animation-delay: 0.3s;
        }
        .sk-cube-7 {
            animation-delay: 0s;
        }
        .sk-cube-8 {
            animation-delay: 0.1s;
        }
        .sk-cube-9 {
            animation-delay: 0.2s;
        }
        @keyframes sk-cube-grid-scale-delay {
            0%,
            70%,
            100% {
                transform: scale3D(1, 1, 1);
            }
            35% {
                transform: scale3D(0, 0, 1);
            }
        }
    }
</style>

第二步:封装加载指令

import { createApp } from 'vue'
// 引入编写好的加载动画组件
import loadingCom from '@/components/loadingCom.vue'

const loading = {
    mounted(el: any, binding: any) {
        // 创建一个组建的实例
        const app = createApp(loadingCom)
        // 创建一个标签,将实例挂载到标签上
        const instance = app.mount(document.createElement('div'))
        // 把实例赋给将要使用的标签上,以后再需要使用时不需要重新挂载
        el.instance = instance
        el.positionStyle = el.style.position
        binding.value && appendEl(el)
    },
    updated(el: any, binding: any) {
        if (binding.value !== binding.oldValue) {
            binding.value ? appendEl(el) : removeEl(el)
        }
    }
}

function appendEl(el: any) {
    if (el.style.position === 'static' || !el.style.position) {
        el.style.position = 'relative'
    }
    el?.appendChild(el.instance.$el)
}

function removeEl(el: any) {
    el.style.position = el.positionStyle
    const $el = el.instance.$el
    el.contains($el) && el.removeChild($el)
}

const loadingPlugin = {
    install(app: any) {
        app.directive('loadingCom', loading)
    }
}

export default loadingPlugin

第三步:在main.js 中全局引入

import loadingCom from '@/utils/loadingDirectives'
app.use(loadingCom)
写在最后

1.动画的组件可以自定义,网上有许多可ctrl + c, ctrl+v
2.细心的同学可以发现,在挂载组建(createApp)的时候,我没有向组件传递prop,根据官网介绍是可以传递的,这样对于想写进度条动画的同学是很友好的,但是我一直没有更好的办法解决后续更改prop值的办法,望可以解决此问题的同学不吝赐教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
vscodeElementUI代码提⽰智能提⽰问题 vs code 中有很多安装包,通过包安装,我是⽤ Element UI Snippets,来达到智能提⽰ElementUI 输⼊关键字 对应智能提⽰ No. No. Trigger Key Trigger Key Element Tag Element Tag 1. elrow <el-row> 2. elcol <el-col> 3. elcon <el-container> 4. elas <el-aside> 5. elhe <el-header> 6. elma <el-main> 7. elfo <el-footer> 8. elcb #409EFF 9. elcs #67C23A 10. elcw #E6A23C 11. elcd #F56C6C 12. elci #909399 13. eltypo font-family: "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅⿊",Arial,sans-serif; 14. elb el-button Form Part No. No. Trigger Key Trigger Key Element Tag Element Tag 1. elr <el-radio> 2. elrg <el-radio-group> 3. elc <el-checkbox> 4. elcg <el-checkbox-group> 5. eli <el-input> 6. elit <el-input type="textarea"> 7. elin <el-input-number> 7. elin <el-input-number> 8. elsel <el-select> 9. elop <el-option> 10. elca <el-cascader> 11. elsw <el-swtich> 12. elsl <el-slider> 13. eltp <el-time-picker> 14. elts <el-time-select> 15. eldp <el-date-picker> 16. eldtp <el-date-picker type="datetime"> 17. elu <el-upload> 18. elra <el-rate> 19. elcp <el-color-picker> 20. eltr <el-transfer> 21. elf <el-form> 22. elfi <el-form-item> No. No. Trigger Key Trigger Key Element Tag Element Tag Data Part No. No. Trigger Key Trigger Key Element Tag Element Tag 1. elta <el-table> 2. eltac <el-table-column> 3. eltag <el-tag> 4. elpr <el-progress> 5. elprc <el-progress type="circle"> 6. eltree <el-tree> 7. elpa <el-pagination> 8. elba <el-badge> Notice Part No. No. Trigger Key Trigger Key Element Tag Element Tag 1. elal <el-alert> 2. elloads element-loading-* 3. elme this.$message({}) 4. elmebox this.$msgbox({}) 5. elmeal this.$alert({}) 6. elmecon this.$confirm({}) 7. elmepro this.$prompt({}) 8. elnoti this.$notify({}) 8. elnoti this.$notify({}) No. No. Trigger Key Trigger Key Element Tag Element Tag Navigation Part No. No. Trigger Key Trigger Key Element Tag Element Tag 1. elmen <el-menu> 2. elsubmen <el-submenu> 3. elmeni <el-menu-item> 4. eltabs <el-tabs> 5. eltabp <el-tab-pane>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值