消息提示框组件封装
思路
模版:图标+文字提示
父组件传入样式类型和文字
子组件内props接受
子组件内setup内定义一个对象,包含三种情况的样式:警告,错误,成功,对象key的就是类型字符串
v-show 绑定 visible 该组件默认是隐藏的,visible 默认值是false ,在生命周期钩子函数 onMounted 内 将visible 置为true
封装成一个消息提示函数方便以后使用,直接调用就行
<template> <transition name='down'> <div class="xtx-message" :style="style[type]" v-show='visible'> <!-- 上面绑定的是样式 --> <!-- 不同提示图标会变 --> <i class="iconfont" :class="[style[type].icon]"></i> <span class="text">{{text}}</span> </div> </transition> </template> <script> import { onMounted, ref } from 'vue' export default { name: 'XtxMessage', props: { text: { type: String, default: '' }, type: { type: String, // warn 警告 error 错误 success 成功 default: 'warn' } }, setup () { // 定义一个对象,包含三种情况的样式,对象key就是类型字符串 const style = { warn: { icon: 'icon-warning', color: '#E6A23C', backgroundColor: 'rgb(253, 246, 236)', borderColor: 'rgb(250, 236, 216)' }, error: { icon: 'icon-shanchu', color: '#F56C6C', backgroundColor: 'rgb(254, 240, 240)', borderColor: 'rgb(253, 226, 226)' }, success: { icon: 'icon-queren2', color: '#67C23A', backgroundColor: 'rgb(240, 249, 235)', borderColor: 'rgb(225, 243, 216)' } } // 控制动画 const visible = ref(false) onMounted(() => { visible.value = true }) return { style, visible } } } </script> <style scoped lang="less"> .down { &-enter { &-from { transform: translate3d(0, -75px, 0); opacity: 0; } &-active { transition: all 0.5s; } &-to { transform: none; opacity: 1; } } } .xtx-message { width: 300px; height: 50px; position: fixed; z-index: 9999; left: 50%; margin-left: -150px; top: 25px; line-height: 50px; padding: 0 25px; border: 1px solid #e4e4e4; background: #f5f5f5; color: #999; border-radius: 4px; i { margin-right: 4px; vertical-align: middle; } .text { vertical-align: middle; } } </style>
将组件封装成函数的步骤
导入组件
使用原生的方法 document.createElement('div') 创建一个 div 容器
使用原生的方法 setAttribute 给 div 设置一个类名
使用原生的方法添加这个div DOM元素 document.body.appendChild(div)
导出一个函数,接受一个对象作为参数
函数体内,使用 createVNode 方法创建一个虚拟 DOM
使用 render 函数将这个虚拟 DOM 渲染到页面上
优化:当函数调用时,消息提示框渲染在页面上,但是不能让一直在页面上显示,使用定时器做防抖,3秒后销毁组件,定时器内再次调用render函数,div容器内渲染内容为null,并在每次触发定时任务时,先清除定时器
// 封装一个消息提示函数 import XtxMessage from './xtx-message.vue' import { createVNode, render } from 'vue' // 提前准备好dom元素(动态创建一个然后添加到页面中) const div = document.createElement('div') div.setAttribute('class', 'xtx-message-container') document.body.appendChild(div) let timer = null // options = {type: 'success', info: '登录成功'} export default ({ type, text }) => { // 在HTML页面中渲染一个组件xtx-message即可 // 1、创建一个虚拟节点(基于组件) // 参数一:可以传入一个组件对象 // 参数二:提供给组件的属性 const vnode = createVNode(XtxMessage, { type, text }) // 2、把虚拟节点渲染到页面中 // 参数一:表示被渲染的虚拟节点 // 参数二:表示渲染的目标位置(DOM元素) render(vnode, div) // 3、要求3秒后,销毁提示信息 // 保证定时任务只能有一个存在 clearTimeout(timer) timer = setTimeout(() => { // 销毁提示信息 render(null, div) }, 3000) } // import Message from './Message.js'
使用
导入
Message函数调用,并传入对象作为参数
import Message from '@/components/library/Message.js' Message({ type :'success' , text:'成功' })