用Vue仿element-ui从0到1封装可复用的组件-dialog

用Vue仿element-ui从0到1封装可复用的组件-dialog

1.需要的前置知识

vue基础语法,组件通讯(sync,provide,inject),slot,v-model,computed和watch 过渡动画
1.1准备工作,引入全局
import vbDialog from "@/components/Dialog";
Vue.component(vbDialog.name, vbDialog);

父组件:App.vue
子组件:Dialog.vue

2.实现目标

在这里插入图片描述

	点击click按钮,出现弹出框,并且有一定的过度动画,而且弹出框的上部分的Tips,内容部分,
和下面的button部分都是可替换的,不是写死的。只有点击弹框外的部分和弹框内相关的按钮才会关闭。

参数部分:
在这里插入图片描述

3.实现思路:

3.1.首先是弹出框的设计,大部分的内容都是可替代的,所以我们用插槽来实现。

子组件:
在这里插入图片描述

主要分为三部分来填充,用了具名插槽,非常直观就看明白了

父组件:
在这里插入图片描述

在父组件中就直接找到相同名字的插槽,模板内的内容会直接渲染到子组件内的slot中
3.2.title内容这些可以直接在父组件写,width,top这几个属性就直接父组件用props传递到子组件,通过设置style也很简单就搞定了。

在这里插入图片描述

3.3.弹出框的关闭思路:设置一个Boolean类型的变量visible控制dialog的显示与隐藏
	在父组件中设置Boolean类型的dialogVisible为false 绑定在visible传给子组件,
点击按钮后改变dialogVisible为true,这样传给子组件的visible也为true,dialog显示

父组件:
在这里插入图片描述

子组件:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210717224717268.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81OTEwMTgxMA==,size_16,color_FFFFFF,t_70
@click事件函数:

methods: {
    handleClose() {
    //发送给父组件,改变visible的值,然后父组件又通过props传过来,控制dialog显示与隐藏
      this.$emit("update:visible", false);
    },
  },

这有个.sync和.self知识要补充:

.sync:
在这里插入图片描述

所以只要我们在子组件发送update:visible再带一个false参数就可以实现双向绑定了。

在这里插入图片描述
.self:

<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div>
	也就是函数仅激活自身,不会传递到子组件,刚刚演示的gif中,点击dialog区域外的部分会隐藏掉,
点击dialog内部的区域就不会触发,这就是它作用
3.4.dailog过渡动画的实现
vue官网提供了很多可以实现动画的样例,大家可以去自行尝试,这里选取了CSS过渡动画来实现
这里注意的点:
类名 
对于这些在过渡中切换的类名来说,如果你使用一个没有名字的 <transition>,
则 v- 是这些类名的默认前缀。如果你使用了 <transition name="my-transition">,
那么 v-enter 会替换为 my-transition-enter。

思路:在开始时位置偏移5%,最后的位置时是在原本的位置,这之间再设置动画,代码如下:
.vb-transistion-enter-active {
  animation: vb-transistion-in 0.3s;
}
//dialog消失的动画是弹出的反向即可
.vb-transistion-leave-active {
  animation: vb-transistion-in 0.3s reverse;
}
//在开始时向Y轴移动-5%,完成时在原本所在的位置。
@keyframes vb-transistion-in {
  0% {
    transform: translateY(-5%);
  }

  100% {
    transform: translateY(0);
  }
}
但是这样先移动5%,底部会有明显的空白

在这里插入图片描述
解决方案:
在css中先多预留高度,这样移动5%的时候就不会有明显的空白了。

height: 110%;

4.总结:这是指dialog的最基本的功能,还有很多的其他的参数还没开发,可以期待后面的进展,所有的源代码可以在gitee上下载到,欢迎大佬clone,star交流

5.项目地址:https://gitee.com/httpxiaobocom/vue-component-ui.git

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值