手写vue弹窗组件

弹窗类组件特点

一般独立于当前Vue实例之外,常挂载于body上;它是通过js动态创建的,不需要任何声明。
常见使用格式:
// Notice 组件名
this.create(Notice,{
title:‘标题’,
msg:‘内容’,
duration:1000}
).show()

首先创建create函数js文件

手写vue弹窗组件

用于动态创建指定组件实例并挂在到body上

代码如下:(关键部分本人全加上注释,且组件注重结构实现不注重样式,若有疑问请评论我看到就回复)

// 创建指定实例并挂载到body上
import Vue from "vue"

export default function create(Component, props) {
  // Component组件名  props组件的配置参数
  // 1 创建vue实例
  const vm = new Vue({
    render(h) {
      // render方法提供一个h方法,可以用来渲染虚拟dom(VNode)
      // 2 创建组件实例
      return h(Component, {props})
    }
  }).$mount() // $mount非常重要,用于挂载
  // 3通过 $children或$root获取该组件实例
  console.log('组件实例', vm);
  const comp = vm.$children[0]

  // 4将dom实例(注意不是组件实例comp)追加至body
  document.body.appendChild(vm.$el)

  // 5 清理实例,防止内存泄漏
  comp.remote = () => {
    // 从body中清除dom
    document.body.removeChild(vm.$el)
    // 当前vue组件实例也要销毁
    vm.$destroy()
  }

  // 返回组件实例
  return comp
}

}

notice弹窗组件

手写vue弹窗组件

<template>
  <div class="notice">
    <p>{{ title }}</p>
    <p>{{ msg }}</p>
  </div>
</template>

<script>
export default {
  props: {
    title: {
      type: String,
      default: "",
    },
    msg: {
      type: String,
      default: "",
    },
    // 存在时间
    duration: {
      type: Number,
      default: 2000,
    },
  },
  data() {
    return {
      // 是否显示弹窗
      isShow: false,
    };
  },
  methods: {
    // 展示
    show() {
      this.isShow = true;
       // 定时销毁
      setTimeout(() => {
        this.hide();
      }, this.duration);
    },
    // 隐藏并销毁组件
    hide() {
      this.isShow = false;
      // create里定义的销毁函数
      this.remote();
    },
  },
};
</script>

<style>
.notice {
  position: fixed;
  top: 10%;
  left: 50%;
  transform: translateX(-50%);
  height: 60px;
  line-height: 60px;

  width: 400px;
  border-radius: 10px;
  background-color: rgb(205, 255, 213);
  animation: 0.28s;
}
p {
  line-height: 30px;
  height: 30px;
  margin: 0;
  text-align: center;
}
</style>

调用实现

刚好在上个手写Form表单组件中调用,链接如下
手写Form表单组件记录

导入弹窗组件和create创建函数
手写vue弹窗组件

    login() {
      this.$refs.Xform.validate((isValid) => {
        if (isValid) {
          // alert("校验成功");
          create(Notice, {
            title: "登录",
            msg: "成功",
            duration: 5000,
          }).show();
        } else {
          // alert("校验失败");
          create(Notice, {
            title: "登录",
            msg: "校验失败",
            duration: 3000,
          }).show();
        }
      });
    },

成功!
手写vue弹窗组件
手写vue弹窗组件

作者:徐煜&煎包

上一篇:Vue_01(init)


下一篇:蓝桥云课linux入门2: