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

Message組件實(shí)現(xiàn)發(fā)財(cái)U(kuò)I?示例詳解

 更新時(shí)間:2022年08月08日 10:29:31   作者:bald3r  
這篇文章主要為大家介紹了Message組件實(shí)現(xiàn)發(fā)財(cái)U(kuò)I的手寫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

最近在實(shí)現(xiàn)Message組件,就是會(huì)從屏幕頂端彈出的一個(gè)小提醒,過一會(huì)兒就消失了。我個(gè)人非常喜歡這個(gè)設(shè)計(jì),感覺在后續(xù)的復(fù)用性也很高,于是就打算自己手寫一個(gè)作為發(fā)財(cái)U(kuò)I的組件

支持的功能

目前的Message有四種類型:

普通提醒 normal

成功提醒 success

警告提醒 warning

錯(cuò)誤提醒error

同時(shí)還支持設(shè)置持續(xù)的時(shí)間:

使用方法

是不是非常簡(jiǎn)單??

<template>
  <div>
    <button @click="popNormalMsg">打開一個(gè)普通提醒</button>
  </div>
</template>
<script lang="ts">
import {popMessage} from "../../lib/popMessage";
export default {
  name: "Message1.demo",
  components: {Button},
  setup() {
    const popNormalMsg = () => {
      popMessage({
        message: '這是一個(gè)全局顯示的普通提醒',   //提醒內(nèi)容
        msgType: 'normal',   //提醒類型normal success error warning
        closeDelay: '2000',  //顯示的時(shí)長(zhǎng),以ms為單位
      })
    }
    return {popNormalMsg}
  }
}
</script>

實(shí)現(xiàn)過程

如何實(shí)現(xiàn)不同類型的切換?

其實(shí)切換類型只是切換圖標(biāo)而已哈哈哈

這里使用了IconPark圖標(biāo)庫,這里使用了一個(gè)投機(jī)取巧的辦法,把不同的圖標(biāo)命名為相應(yīng)的type,可以節(jié)省一些處理的步驟

  
href=#normalmsgType='normal'
href=#successmsgType='success'
href=#warningmsgType='warning'
href=#errormsgType='error'
const typeIndicator = `<use href="#${props.msgType}" rel="external nofollow"  rel="external nofollow" ></use>`
<template>
  <div ref="msgDiv" class="rich-message">
    <svg class="iconpark-icon" v-html="typeIndicator">
      //2??typeIndicator的內(nèi)容會(huì)原封不動(dòng)的跑到這里
    </svg>
    //3??最后和svg標(biāo)簽一起變成type對(duì)應(yīng)的圖標(biāo)
    <div class="rich-message-msgText">{{ message }}</div>
  </div>
</template>
<script lang="ts">
export default {
  name: "Message",
  props: {
    message: {
      type: String,
      required: true,
    },
    msgType: {
      type: String,
      default: 'normal',
    },
  },
  setup(props) {
    const typeIndicator = `<use href="#${props.msgType}" rel="external nofollow"  rel="external nofollow" ></use>`
    return {typeIndicator}
    //1??接受到傳來的type,然后typeIndicator會(huì)自動(dòng)變?yōu)橄鄳?yīng)的圖標(biāo)use標(biāo)簽
  }
}
</script>

如何實(shí)現(xiàn)Message的彈出和消失?

使用了CSS的transform,實(shí)際上就是Message在初始狀態(tài)下是藏在畫面外的,通過添加一個(gè).message-active的類來讓它顯示出來,在經(jīng)過closeDelay毫秒后移除.message-active類。

.rich-message {
  ...
  transform: translateY(-100px);
  transition: all 250ms;
  &.message-active {
    transform: translateY(0px);
    opacity: 1;
  }
}

如何實(shí)現(xiàn)往下排列而非堆疊?

為了讓他們能夠一個(gè)一個(gè)的排列下來而不是堆疊在一起,我想到了insertAdjacentElement()方法

element.insertAdjacentElement(position, element);

position有下面四種取值

'beforebegin': 在該元素本身的前面。

'afterbegin':只在該元素當(dāng)中,在該元素第一個(gè)子孩子前面。

'beforeend':只在該元素當(dāng)中,在該元素最后一個(gè)子孩子后面。

'afterend': 在該元素本身的后面。

不難發(fā)現(xiàn)這里似乎可以使用beforeend和afterend。經(jīng)過我的思考,為了保持DOM樹的整潔,我采用了創(chuàng)建一個(gè)msgContainer的div來存放所有的Message的方法,因此我也相應(yīng)的使用了beforeend

let msgContainer = document.getElementById('msgDiv')
if (msgContainer === null) {
  msgContainer = document.createElement('div')
  msgContainer.id = 'msgDiv'
  document.body.appendChild(msgContainer)
}
const div = document.createElement('div'); //這個(gè)div就是Message所在的div
msgContainer.insertAdjacentElement('beforeend', div)

給msgContainer一個(gè)CSS樣式

#msgDiv {
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

如何實(shí)現(xiàn)添加和移除.message-active類?

如果msgDiv在創(chuàng)建時(shí)就帶有.message-active類,那么將會(huì)閃現(xiàn)在頁面中,所以msgDiv應(yīng)該是在渲染后被添加了.message-active類,為了實(shí)現(xiàn)這個(gè)效果,使用了一個(gè)setTimeout()。

同時(shí)在closeDelay之后將這個(gè)類移除。

但是這樣存在一個(gè)問題,這個(gè)msgDiv只是看不見了,依然存在于DOM樹中。

setTimeout(() => {
    msgDiv.classList.add('message-active')
}, 0)
setTimeout(() => {
    msgDiv.classList.remove('message-active')
}, closeDelay * 1);

如何將隱藏的Message從DOM樹中移除

在Message的淡出動(dòng)畫結(jié)束后移除就好了,這里使用了.ontransitionendAPI,但是還存在問題,即如果有多個(gè)Message,他們會(huì)同時(shí)消失,原因是雖然每個(gè)Message在創(chuàng)建時(shí)都會(huì)有一個(gè)計(jì)時(shí)器,但是在移除時(shí)卻是所有的msgDiv一起移除,因此需要有區(qū)分的方法。

setTimeout(() => {
    msgDiv.classList.remove('message-active')
    msgDiv.ontransitionend = () => {
      app.unmount();
      div.remove();
    }
}, closeDelay * 1);

如何區(qū)分不同的Message?

在本項(xiàng)目中,我使用了隨機(jī)生成ID的方式,如此一番就能精準(zhǔn)的控制每個(gè)msgDiv

function randomLetter(len) {
  let str = '';
  for (let i = 0; i < len; i++) {
    str += String.fromCharCode(~~(Math.random() * 26 + 65));
  }
  return str;
}
const msgId = randomLetter(~~(Math.random() * 10 + 30)) //生成了一個(gè)隨機(jī)字符串
const app = createApp({
  render() {
    return h(Message, {
      message,
      msgType,
      id: msgId,
     });
  }
});
app.mount(div);
const msgDiv = document.getElementById(String(msgId))
setTimeout(() => {
    msgDiv.classList.add('message-active')
}, 0)
setTimeout(() => {
    msgDiv.classList.remove('message-active')
    msgDiv.ontransitionend = () => {
      app.unmount();
      div.remove();
    }
}, closeDelay * 1);

最后的一個(gè)小細(xì)節(jié)

我們使用了一個(gè)msgContainer將所有的Message包裹的起來,從而實(shí)現(xiàn)順序排列,但是在最后一個(gè)Message消失后,msgContainer會(huì)作為一個(gè)空的div仍然存在于DOM樹中,這很不環(huán)保,因此在最后一個(gè)Message消失后將msgContainer也一并移除

setTimeout(() => {
  msgDiv.classList.remove('message-active')
  msgDiv.ontransitionend = () => {
     app.unmount();
     div.remove();
     if (msgContainer.children.length === 0) {
       msgContainer.remove()
     }
  }
}, closeDelay * 1);

以上就是Message組件實(shí)現(xiàn)發(fā)財(cái)U(kuò)I 示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Message組件發(fā)財(cái)U(kuò)I 的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue編寫自定義Plugin詳解

    Vue編寫自定義Plugin詳解

    這篇文章主要介紹了Vue編寫自定義Plugin詳解,在Vue開發(fā)中,我們經(jīng)常需要使用一些第三方庫或功能性模塊,Vue插件就是一種將這些庫或模塊集成到Vue應(yīng)用中的方式,插件是Vue.js提供的一種機(jī)制,用于擴(kuò)展Vue的功能,需要的朋友可以參考下
    2023-08-08
  • vue導(dǎo)出報(bào)表至excel表格三種方式

    vue導(dǎo)出報(bào)表至excel表格三種方式

    這篇文章主要給大家介紹了關(guān)于vue導(dǎo)出報(bào)表至excel表格的三種方式,導(dǎo)出報(bào)表是實(shí)際開發(fā)的常見功能,前后端都可以實(shí)現(xiàn)表格導(dǎo)出,本文介紹的是用vue實(shí)現(xiàn),需要的朋友可以參考下
    2023-09-09
  • Vue中JS動(dòng)畫與Velocity.js的結(jié)合使用

    Vue中JS動(dòng)畫與Velocity.js的結(jié)合使用

    這篇文章主要介紹了Vue中JS動(dòng)畫與Velocity.js的結(jié)合使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-02-02
  • Element el-checkbox-group v-model不支持對(duì)象(object)解決方案

    Element el-checkbox-group v-model不支持對(duì)象(object)解決方案

    本文主要介紹了Element el-checkbox-group v-model不支持對(duì)象(object)解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Vue項(xiàng)目中使用WebUploader實(shí)現(xiàn)文件上傳的方法

    Vue項(xiàng)目中使用WebUploader實(shí)現(xiàn)文件上傳的方法

    WebUploader是由 Baidu WebFE(FEX) 團(tuán)隊(duì)開發(fā)的一個(gè)簡(jiǎn)單的以 HTML5為主 , FLASH為輔 的現(xiàn)代 文件上傳組件 。這篇文章主要介紹了在Vue項(xiàng)目中使用WebUploader實(shí)現(xiàn)文件上傳,需要的朋友可以參考下
    2019-07-07
  • 手把手教你創(chuàng)建vue3項(xiàng)目的最佳方式

    手把手教你創(chuàng)建vue3項(xiàng)目的最佳方式

    如今的Vue3已經(jīng)勢(shì)不可擋,當(dāng)然搭建一個(gè)全新的Vue3項(xiàng)目也有了全新的方式,下面這篇文章主要給大家介紹了關(guān)于如何手把手教你創(chuàng)建vue3項(xiàng)目的最佳方式,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • VUE3使用JSON編輯器的詳細(xì)圖文教程

    VUE3使用JSON編輯器的詳細(xì)圖文教程

    最近項(xiàng)目中有用到j(luò)son編輯器,我選用了這款vue的編輯器,看起來也是比較簡(jiǎn)潔,接下來就具體介紹一下它,下面這篇文章主要給大家介紹了關(guān)于VUE3使用JSON編輯器的詳細(xì)圖文教程,需要的朋友可以參考下
    2023-04-04
  • 詳解Vue項(xiàng)目中出現(xiàn)Loading chunk {n} failed問題的解決方法

    詳解Vue項(xiàng)目中出現(xiàn)Loading chunk {n} failed問題的解決方法

    這篇文章主要介紹了詳解Vue項(xiàng)目中出現(xiàn)Loading chunk {n} failed問題的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • 使用vue-infinite-scroll實(shí)現(xiàn)無限滾動(dòng)效果

    使用vue-infinite-scroll實(shí)現(xiàn)無限滾動(dòng)效果

    vue-infinite-scroll插件可以無限滾動(dòng)實(shí)現(xiàn)加載更多,其作用是是當(dāng)滾動(dòng)條滾動(dòng)到距離底部的指定高度時(shí)觸發(fā)某個(gè)方法。這篇文章主要介紹了用vue-infinite-scroll實(shí)現(xiàn)無限滾動(dòng)效果,需要的朋友可以參考下
    2018-06-06
  • Vue.js 實(shí)現(xiàn)tab切換并變色操作講解

    Vue.js 實(shí)現(xiàn)tab切換并變色操作講解

    這篇文章主要介紹了Vue.js 實(shí)現(xiàn)tab切換并變色操作講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評(píng)論

玛纳斯县| 塔城市| 墨竹工卡县| 丁青县| 绵竹市| 呼图壁县| 宜春市| 易门县| 无锡市| 东阿县| 吉木萨尔县| 姜堰市| 湛江市| 巴中市| 博白县| 红安县| 赫章县| 石渠县| 柳州市| 蓝田县| 乌鲁木齐县| 惠东县| 靖西县| 赣州市| 南京市| 涟水县| 乌拉特后旗| 乌拉特前旗| 朝阳县| 海兴县| 射洪县| 资溪县| 延庆县| 黔西县| 宜春市| 陆川县| 法库县| 清苑县| 孝昌县| 永宁县| 灌阳县|