Message 组件常用于主动操作后的反馈提示。下面是效果图
看完了效果图以后,我们再来看看看如何在页面中使用我们的Message
组件。
1 | <template> |
需求分析
Message 组件属性和方法
看完了上面的效果图以及调用Message
组件的方式以后,我们来分析一下它可能具备哪些属性和方法。我写了以下几个属性、方法:
- message 提示信息
- duration 延时关闭提示框的时间,如果为 0 则需要手动关闭
- showClose 是否显示关闭按钮
- transitionName 过渡动画的名称
- id 每一个 Message 组件实例的
id
- zIndex 每一个 Message 组件实例的
zIndex
- onDestory 每一个 Message 组件实例的销毁函数 从
body
中移除自己的 DOM - type 类型 不同的类型有不同的
css
风格
如何挂载和销毁
组件写好了,我们如何挂载到页面的<body></body>
的内容中去,同时还要思考在用户点击了关闭按钮或者自动关闭以后如何从<body></body>
中移除自身。在 vue 中提供了createApp
和render
两个函数,createApp
有些重量了,因为它返回的是一个应用;而我们这里只是需要将我们写好的组件挂载到页面中去。所以选择使用render
这个函数。 销毁自身的话可以调用组件内部的方法,实际上就是将控制组件显示、隐藏的变量visible
设置为 false。然后再调用render
将其相关的dom
从body
中去除。
如何获取组件实例信息
通过效果图我们可以看出,Message
组件之间是有一定距离的,这样显示的时候不会重叠在一起;那么我们就要思考如何在创建Message
组件的时候让它移动一定的偏移量。那么我们就要拿到Message
组件的实例信息。所以我们给每一个Message
组件赋一个唯一的id
,通过id
找到对应的组件实例。在编写组件的时候,通过defineExpose
向外导出需要用到的属性。比如组件底部的偏移量bottomOffset
和控制组件显示、隐藏的visible
。
如何添加动画效果
在Vue
中,添加动画使用<Transition></Transition>
标签。监听@afterLeave
和@enter
两个事件。在动画结束以后注销实例,在动画进入以后更新一下组件的高度,从而实现对应的css
样式,避免Message
组件之间重叠。
代码实现
在对Message
组件进行了一系列的分析之后,终于可以开始写代码了。我的思路是这样的:
- 第一步,我先实现一个
Message
组件的基本结构。 - 第二步,实现
CreateMessage
方法,可以将我们第一步写好的基本结构展示在页面上。 - 第三步,拿到组件实例信息,可以销毁自身。
- 第四步,当有多个
Message
组件在页面上的时候计算每一个组件的位置,使他们不重叠。 - 第五步,给
Message
组件添加动画效果。
编写组件基本结构
属性和方法
1 | import { type VNode } from 'vue' |
基本结构
1 | <template> |
编写 CreateMessage 方法
1 | import { render, h } from 'vue' |
1 | <script lang="ts" setup> |
获取实例信息、销毁自身
组件是挂载了,但是当它隐藏以后并没有从body
中消除,通过浏览器开发者工具我们可以清楚的看到它还存在于页面中。我们应该在它隐藏以后,将它从body
中去除。
1 | export type CreateMessageProps = Omit<MessageProps, 'onDestory' | 'id'> |
1 | import { render, h, shallowReactive } from 'vue' |
计算位置,添加 Css 样式
1 | <template> |
1 | import { computed, ref } from 'vue' |
1 | import { render, h, shallowReactive } from 'vue' |
添加动画效果并且监听事件
1 | <template> |