最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3和vue2掛載實(shí)例到全局(自定義消息提示框組件方式)

 更新時(shí)間:2024年04月27日 15:50:54   作者:Jyann~  
這篇文章主要介紹了vue3和vue2掛載實(shí)例到全局(自定義消息提示框組件方式),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vue2

入口文件中引入JS文件及css樣式

//入口文件:main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import TMessage from '@/components/TMessage/TMessage.js';
 
import '@/assets/css/css.css'
 
Vue.config.productionTip = false
 
Vue.prototype.$message = TMessage;
 
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')
//TMessage.js文件
import { createApp, createVNode, render } from 'vue'
import TMessage from '@/components/TMessage/TMessage.vue'
 
// 用于儲(chǔ)存多個(gè)實(shí)例
let instances = [];
 
function Message(data) {
 
    // 使用該方法組件(如Login)傳過(guò)來(lái)的數(shù)據(jù)沒(méi)有傳的變量需要有默認(rèn)值,否則是undefined傳給TMessage
    if (typeof data === 'string') {
        // Message("這是錯(cuò)誤的"),除了message,其他的設(shè)置默認(rèn)值
        data = {
            message: data,
            type: 'info',
        }
    }
    data = {
        ...data,
        // 設(shè)置具體data參數(shù),根據(jù)傳入的顯示不同
        message: data.message ? data.message : '默認(rèn)提示信息',
        type: data.type ? data.type : 'info',
        center: data.center ? data.center : true,
        offset: data.offset ? data.offset : 20,
        duration: data.duration ? data.duration : 1000
    }
 
    // 用于處理所有消息提示框消失后,其他提示框的位置(需要在TMessage.vue中調(diào)用)
    data.onClose = function() {
        Message.close(msgNode);
 
    }
 
    // 處理多個(gè)實(shí)例之間間距
    let offset = data.offset || 20;
    // 用于改變后的offset值記錄
    let offsetTop = offset;
    console.log(instances.length);
 
    //  * 0: 20
    //  * 1: 20 40 20(第0個(gè)的offset + 第0個(gè)的div高度(offsetHeight) + 第1個(gè)的offset 20)
    instances.forEach((item) => {
        // 直接通過(guò)item獲取的實(shí)例offsetHeight不準(zhǔn)確
        offsetTop += item.offsetHeight + offset + 26;
    });
    // 設(shè)置offset及TMessage.vue中的top值
    data.offset = offsetTop;
 
    // 創(chuàng)建實(shí)例
    const app = createApp(TMessage, data);
    // 準(zhǔn)備dom容器
    const msgNode = document.createElement('div');
 
    // 添加到body上
    app.mount(msgNode);
    document.body.appendChild(msgNode);
 
    msgNode.style.top = offsetTop + 'px';
    msgNode.style.height = '20px';
 
    // 將當(dāng)前實(shí)例加入instances
    instances.push(msgNode);
}
 
// 消息類型:success,info,error,warning
['error', 'info', 'success', 'warning'].forEach(item => {
    Message[item] = function(data) {
        if (typeof data === 'string') {
            data = {
                message: data
            };
        }
 
        data.type = item;
        return Message(data);
    };
});
 
// 
//  * 獲取當(dāng)前這個(gè)instance的高度
//  * 把這個(gè)instance后面的所有實(shí)例的top減去這個(gè)高度,再減去偏移
//  * 
Message.close = function(msgNode) {
    // 獲取到DOM結(jié)構(gòu)中所有新創(chuàng)建的Node
    let curMessage = document.querySelectorAll("div.message");
 
    // 找到當(dāng)前div是在instances數(shù)組的下標(biāo)
    let index = instances.findIndex(item => item === msgNode);
    instances = instances.filter(item => item !== msgNode);
 
    // 獲取需要減去的高度(66=自身高度+offset高度);curMessage[0].offsetHeight才能得到真正解析后的高度
    let removeHeight = msgNode.offsetHeight + curMessage[0].offsetHeight;
 
    for (let i = index; i < curMessage.length; i++) {
        curMessage[i].style.top = parseInt(curMessage[i].style.top.split('px')[0]) - removeHeight + 'px';
    }
 
    // curMessage.length=1時(shí)是最后一次調(diào)用close方法,此時(shí)清空instances,則再次點(diǎn)擊offsetTop不會(huì)一直累加
    if (curMessage.length == 1) {
        instances = [];
    }
}
 
export default Message;
Message;
//TMessage.vue
<template>
  <!-- 動(dòng)畫效果 -->
  <transition name="message-fade">
    <!-- 使用數(shù)據(jù)綁定class -->
    <div
      v-if="!closed"
      :class="['message', 'message-' + type, center ? 'is-center' : '']"
      :style="{ top: offset + 'px' }"
    >
      <p class="message-content">{{ type }}:{{ message }}</p>
      <i class="icon icon-close" @click="closeTip"></i>
    </div>
  </transition>
</template>
<script>
export default {
  name: 'TMessage',
  props: {
    message: '默認(rèn)提示信息',
    type: 'info',
    center: true,
    offset: 20,
    duration: 2000,
    // 用于處理所有消息提示框消失后,其他提示框的位置
    onClose: null
  },
  data () {
    return {
      //   定時(shí)器
      timer: null,
      closed: false,
    }
  },
  mounted () {
    this.timer = setTimeout(() => {
      if (!this.closed) {
        this.close();
      }
    }, this.duration);
  },
  methods: {
    close () {
      this.closed = true;
      if (typeof this.onClose === 'function') {
        this.onClose();
      }
 
    }
  }
}
</script>

在任何其他組件中使用:通過(guò)this.即可簡(jiǎn)單使用

this.$message.error('用戶名和密碼不能為空');
 
 // this.$message({
        //   duration: 1000,
        //   message: '1111',
        //   type: 'warning',
        // })
        // this.$message({
        //   duration: 5000,
        //   message: '5555',
        //   type: 'error',
        // })
        // this.$message({
        //   duration: 3000,
        //   message: '3333',
        //   type: 'warning',
        // })
        // this.$message({
        //   duration: 4000,
        //   message: '4444',
        //   type: 'info',
        // })
        // this.$message({
        //   duration: 2000,
        //   message: '2222',
        //   type: 'success',
        // })

vue3

TMessage.js和TMessage.vue文件同上

//入口文件:main.js
import { createApp } from 'vue'
import App from './App.vue'
// css文件直接引入
import '@/assets/css/css.css'
import router from '@/route/route'
import store from '@/store/store'
import Message from '@/components/TMessage/TMessage.js'
 
// Vue3將自定義組件加載到全局方法
const app = createApp(App);
app.config.globalProperties.$message = Message;
 
// 4.創(chuàng)建一個(gè)vue應(yīng)用,將App組件和定義的路由放入到vue應(yīng)用,并掛載到模板頁(yè)面id為app的元素上。
app.use(router).use(store).mount('#app')

使用:

this直接引用

this.$message.error("這是測(cè)試錯(cuò)誤");

問(wèn)題:

消息提示框的消失有點(diǎn)問(wèn)題,點(diǎn)擊多個(gè)時(shí)不連續(xù)

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue-router next(false) 禁止訪問(wèn)某個(gè)頁(yè)面時(shí),不保留歷史訪問(wèn)記錄問(wèn)題

    vue-router next(false) 禁止訪問(wèn)某個(gè)頁(yè)面時(shí),不保留歷史訪問(wèn)記錄問(wèn)題

    這篇文章主要介紹了vue-router next(false) 禁止訪問(wèn)某個(gè)頁(yè)面時(shí),不保留歷史訪問(wèn)記錄問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Vue實(shí)現(xiàn)頁(yè)面刷新跳轉(zhuǎn)到當(dāng)前頁(yè)面功能

    Vue實(shí)現(xiàn)頁(yè)面刷新跳轉(zhuǎn)到當(dāng)前頁(yè)面功能

    在Vue.js應(yīng)用開發(fā)中,有時(shí)候我們需要實(shí)現(xiàn)頁(yè)面的刷新或跳轉(zhuǎn)到當(dāng)前頁(yè)面的功能,這種需求在某些特定場(chǎng)景下非常有用,本文將詳細(xì)介紹如何在Vue中實(shí)現(xiàn)頁(yè)面刷新和跳轉(zhuǎn)到當(dāng)前頁(yè)面的功能,并提供多個(gè)示例和使用技巧,需要的朋友可以參考下
    2024-10-10
  • Vue?github用戶搜索案例分享

    Vue?github用戶搜索案例分享

    這篇文章主要介紹了Vue?github用戶搜索案例分享,文章基于Vue的相關(guān)資料展開對(duì)主題的詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • vue Tab切換以及緩存頁(yè)面處理的幾種方式

    vue Tab切換以及緩存頁(yè)面處理的幾種方式

    這篇文章主要介紹了vue Tab切換以及緩存頁(yè)面處理的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • setTimeout在vue中的正確使用方式

    setTimeout在vue中的正確使用方式

    這篇文章主要介紹了setTimeout在vue中的正確使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Vue+Element UI實(shí)現(xiàn)下拉菜單的封裝

    Vue+Element UI實(shí)現(xiàn)下拉菜單的封裝

    這篇文章主要為大家詳細(xì)介紹了Vue+Element UI實(shí)現(xiàn)下拉菜單的封裝代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Vue中使用JsonView來(lái)展示Json樹的實(shí)例代碼

    Vue中使用JsonView來(lái)展示Json樹的實(shí)例代碼

    這篇文章主要介紹了Vue之使用JsonView來(lái)展示Json樹的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • VUE v-for循環(huán)中每個(gè)item節(jié)點(diǎn)動(dòng)態(tài)綁定不同函數(shù)的實(shí)例

    VUE v-for循環(huán)中每個(gè)item節(jié)點(diǎn)動(dòng)態(tài)綁定不同函數(shù)的實(shí)例

    今天小編就為大家分享一篇VUE v-for循環(huán)中每個(gè)item節(jié)點(diǎn)動(dòng)態(tài)綁定不同函數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • vue3中使用百度地圖的簡(jiǎn)單步驟

    vue3中使用百度地圖的簡(jiǎn)單步驟

    最近項(xiàng)目要用到百度地圖api,好久沒(méi)用到地圖,就百度了一番,下面這篇文章主要給大家介紹了關(guān)于vue3中使用百度地圖的簡(jiǎn)單步驟,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • 圖文講解vue的v-if使用方法

    圖文講解vue的v-if使用方法

    在本篇文章里我們給大家分享了關(guān)于vue的v-if使用方法的相關(guān)知識(shí)點(diǎn),有興趣的朋友們跟著學(xué)習(xí)下。
    2019-02-02

最新評(píng)論

苗栗县| 银川市| 巴塘县| 永嘉县| 务川| 庄河市| 读书| 台中县| 肥东县| 滦平县| 青海省| 定西市| 石嘴山市| 彝良县| 万安县| 德清县| 根河市| 贵南县| 洱源县| 香港| 赫章县| 富蕴县| 蒙城县| 蓬安县| 突泉县| 东莞市| 兴国县| 醴陵市| 衡水市| 乌海市| 朝阳区| 象山县| 南平市| 永修县| 海林市| 河津市| 张家港市| 宁蒗| 铜梁县| 郓城县| 汝城县|