Vue2手写一个全局命令式loading组件

06-27 1752阅读

实现效果:

.vue文件中,打开全局loading... 2s后关闭

 Vue2手写一个全局命令式loading组件

全局命令式loading,效果展示完,直接咱就是上代码

注册: 

  
  
    
      
        
        
          {{ msg }}
        
      
    
  


export default {
  data() {
    return {
      bgColor: 'rgba(43, 41, 39, 0.276)'
    }
  },
  props: {
    msg: {
      type: String,
      default: '数据加载中...'
    },
    loadingVisible: {
      type: Boolean,
      default: false
    }
  }
};


.zh-loading-mark {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  .zh-loading-body {
    margin: auto;
    margin-top: 35vh;
    text-align: center;
  }
  // transition标签样式添加
  .zhLoading-enter,
  .zhLoading-leave-to {
    opacity: 0;
  }
  .zhLoading-enter-active,
  .zhLoading-leave-active {
    transition: opacity 0.6s;
  }
}
// src/components/myLoading/index.js 
// 意思是从loading里面把loading的方法和变量继承下来,绑定到vue(全局上面),这样我们可以直接通过this去使用
// 相对于普通组件和全局组件,不需要引入组件html部分,可以直接调用方法传入值
/**
 * 1.vue继承组件的方法,拿到组件的变量和方法
 * 2.原型上绑定方法
 */
// 引入vue
import Vue from 'vue'
// 引入loading组件
import MyLoading from '../myLoading/index.vue';
// 通过Vue的extend方法继承这个引入的loading组件,继承后会返回一个vue子类,需要使用实例化即可??
// vue.extend传入数据,进行处理后,多了很多东西
const Dialog = Vue.extend(MyLoading);
// 创建实例并且挂载到一个div上??
// 相当于new 一个person,new Dialog()构造函数,挂到一个DOM上面
const app = new Dialog().$mount(document.createElement('div'))
// 打开弹框函数
function showDialog(options) {
  // 初始化调用传递过来的参数赋值更改组件内内部值
  for (let key in options) {
    // 把值传进来提取出来,然后赋值给实例上面
    app[key] = options[key];
  }
  // 让其显示
  app.loadingVisible = true
  // app就是一个vueComponent一个组件,相当于组件里面的this
  console.log('app--', app);
  // 并将其插入body中,$el用于获取app的所有的DOM元素
  document.body.appendChild(app.$el);
}
// 关闭弹框函数
function hideDialog() {
  // 因为是v-if去控制,所以将标识showLoading置为false,就会自动把弹框dom删掉
  app.loadingVisible = false
}
// 将打开函数和关闭函数都挂载到Vue原型prototype上,方便我们调用
Vue.prototype.$showDialog = showDialog;
Vue.prototype.$hideDialog = hideDialog;
// main.js
import Vue from 'vue'
import App from './App.vue'
// 全局引入,这样就可以在全局.this调用了
import './components/myLoading/index.js'
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')
使用:

  打开loading


export default {
  mounted() {
    console.log('1--', this.$el); // template里面的div所有内容
    console.log(this, '----');
  },
  methods: {
    openLoading() {
      this.$showDialog({
        msg: "努力加载鸭...",
      });
      setTimeout(() => {
        this.$hideDialog();
      }, 1500);
    }
  }
};

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]