vue3手動封裝彈出框組件message的方法
更新時間:2021年09月26日 11:03:12 作者:沉迷...
這篇文章主要為大家詳細(xì)介紹了vue3手動封裝彈出框組件message的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了vue3手動封裝彈出框組件message的具體代碼,供大家參考,具體內(nèi)容如下
封裝組件
<template>
<Transition name="down">
<div class="xtx-message" :style="style[type]" v-show='isShow'>
<!-- 上面綁定的是樣式 -->
<!-- 不同提示圖標(biāo)會變 -->
<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 isShow = ref(false)
// 組件模板渲染成功后觸發(fā)
onMounted(() => {
isShow.value = true
})
return { style, isShow }
}
}
</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>
掛載到vue的原型對象上
// 如下的方法需要渲染一個提示效果
import { createVNode, render } from 'vue'
import XtxMessage from './xtx-message.vue'
// 動態(tài)創(chuàng)建一個DOM容器
const div = document.createElement('div')
div.setAttribute('class', 'xtx-meassage-container')
document.body.appendChild(div)
export default ({ text, type }) => {
let timer = null
// createVNode 用于創(chuàng)建一個虛擬節(jié)點
// 參數(shù)一支持組件
// 參數(shù)二表示傳遞給組件的選項
const vnode = createVNode(XtxMessage, { text, type })
// 把虛擬的節(jié)點渲染到頁面的DOM中即可
// render函數(shù)的參數(shù)
// 參數(shù)一:表示需要渲染的內(nèi)容(虛擬節(jié)點)
// 參數(shù)二:表示渲染的目標(biāo)位置(DOM元素)
render(vnode, div)
// 希望提示信息顯示1秒后消失
clearTimeout(timer)
timer = setTimeout(() => {
// 清空div中的內(nèi)容
render(null, div)
}, 1000)
}
// $message({ text: '登錄失敗', type: 'error'})
import Message from './Message'
export default {
install(app) {
// 如果你想掛載全局的屬性,能夠通過組件實例調(diào)用的屬性 this.$message
app.config.globalProperties.$message = Message // 原型函數(shù)
}
}
使用
一 .
import Message from '@/components/library/Message'
setup () {
// 觸發(fā)登錄
const handleLogin = async () => {
// 手動進行表單驗證
const flag = await target.value.validate()
if (flag) {
// 驗證通過,調(diào)用接口實現(xiàn)登錄
// 如果登錄失敗,就進行提示
Message({ type: 'error', text: '登錄失敗' })
}
}
mounted () {
this.$message({ type: 'error', text: '登錄失敗' })
}
}
二.
// 獲取組件的實例對象:類似于之前的this
const instance = getCurrentInstance()
// 點擊登錄
const handleLogin = async () => {
const valid = await target.value.validate()
if (valid) {
// 表單驗證通過,調(diào)用接口實現(xiàn)登錄
// Message({ text: '登錄失敗', type: 'error' })
instance.proxy.$message({ text: '登錄失敗', type: 'error' })
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
前端vue+element使用SM4國密加密解密的詳細(xì)實例
國密即國家密碼局認(rèn)定的國產(chǎn)密碼算法,主要有SM1,SM2,SM3,SM4,下面這篇文章主要給大家介紹了關(guān)于前端vue+element使用SM4國密加密解密的相關(guān)資料,需要的朋友可以參考下2023-03-03
一文掌握Pinia使用及數(shù)據(jù)持久化存儲超詳細(xì)教程
這篇文章主要介紹了Pinia安裝使用及數(shù)據(jù)持久化存儲的超詳細(xì)教程,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
vue如何使用router.meta.keepAlive對頁面進行緩存
這篇文章主要介紹了vue如何使用router.meta.keepAlive對頁面進行緩存問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05

