欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue.js的提示組件

 更新時間:2017年03月02日 16:48:06   作者:aryu  
這篇文章主要為大家詳細(xì)介紹了vue.js實(shí)現(xiàn)一個漂亮、靈活、可復(fù)用的提示組件,具有一定的參考價值,感興趣的小伙伴們可以參考一下

這次的教程里,我們要把組件化進(jìn)行到底!最近半年的幾個項(xiàng)目中,都遇到了需要使用Toast或者Notification組件的情況。在目前已有的一些基于Vue.js開發(fā)的組件庫,都沒有找到太合適的,所以自己重頭實(shí)現(xiàn)了一個。歷經(jīng)幾個項(xiàng)目的磨練,這個提示組件的功能已經(jīng)越來越完善,這次就分享一下組件以及其實(shí)現(xiàn)思路吧。

GitHub 倉庫: https://github.com/Yuyz0112/vue-notie

Demo 地址: http://lab.myriptide.com/vue-notie/


深入組件化,組件的拆分、整合與復(fù)用

Vue.js的組件化可以說是其招牌特性之一,而在實(shí)際應(yīng)用時,并非一味地追求組件顆粒越小越好,而是需要根據(jù)項(xiàng)目的實(shí)際需求,來分析自己需要什么級別的組件。

例如在一個SPA中,我可能有主頁、文章列表頁、文章頁、個人中心頁4個主要的視圖,于是我將其分別對應(yīng)的寫成4個組件。

但是在實(shí)際編寫的過程中,發(fā)現(xiàn)他們共用了同一套側(cè)邊欄,而側(cè)邊欄對應(yīng)的代碼也在4個組件中重復(fù)書寫了4次。所以可以將側(cè)邊欄單獨(dú)寫成一個組件進(jìn)行復(fù)用。

之后,我們可能發(fā)現(xiàn)可以復(fù)用的還有一些表單、按鈕之類的內(nèi)容我們都可以復(fù)用成組件。但實(shí)際上,我們也會發(fā)現(xiàn)過度的組件化會導(dǎo)致代碼量上升、開發(fā)時間增加以及額外的數(shù)據(jù)傳遞等等。所以如果不打算制作一個完整的組件庫,那么在實(shí)際項(xiàng)目中做到按需拆分、整合即可,不用過分的追求每個可復(fù)用的部分都寫成單個組件。

為什么需要一個提示組件

因?yàn)閍lert大部分時間不能滿足我們的需求啊。往往項(xiàng)目里需要一個類似于alert的東西,用美觀、可定制的方式提示用戶一些信息,因此這樣一個提示組件很有必要。

同時,我們也不希望同一時間出現(xiàn)多個提示混淆用戶,因此在設(shè)計(jì)上,我們將提示組件設(shè)定為具有 唯一性 ,整個應(yīng)用中各個視圖調(diào)用的都是同一個提示組件。

Show me the code

接下來,由簡入繁依次實(shí)現(xiàn)提示組件的各個功能。

基本功能

最基本的功能當(dāng)然是觸發(fā)后顯示,并且能夠以某種方式關(guān)閉。唯一需要自定義的部分,就是具體顯示的內(nèi)容。所以最開始組件長這樣:

<template>
 <div class="notification fixed"
 v-if="show"
 transition="slide">
 <div class="delete"
 @click="close()"></div>
 <div class="content">
 {{ options.content }}
 </div>
 </div>
</template>

<script>
export default {
 props: {
 options: {
 type: Object,
 default: () => {
 return {}
 }
 },
 show: {
 type: Boolean,
 default: false
 }
 },
 methods: {
 close () {
 this.show = false
 this.options = {}
 }
 }
}
</script>

<style scoped lang="sass">
 .slide-transition
 transition: all .3s ease
 transform: translate3d(0, 0, 0)
 .slide-enter,
 .slide-leave
 transform: translate3d(0, -100%, 0)
 .delete
 -moz-appearance: none
 -webkit-appearance: none
 background: rgba(51,51,51,0.2)
 cursor: pointer
 display: inline-block
 height: 24px
 position: relative
 vertical-align: top
 width: 24px
 float: right
 &:before,
 &:after
 background: #fff
 content: ""
 display: block
 height: 2px
 left: 50%
 margin-left: -25%
 margin-top: -1px
 position: absolute
 top: 50%
 width: 50%
 &:before
 transform: rotate(45deg)
 &:after
 transform: rotate(-45deg)
 &:hover
 background: rgba(51,51,51,0.5)
 .notification
 width: 100%
 line-height: 2
 z-index: 3
 position: fixed
 top: 0
 left: 0
 .content
 padding: .75rem 2rem
</style>

思路很簡單,props傳遞兩個數(shù)據(jù),show用于控制顯示,options傳入包括內(nèi)容在內(nèi)的自定義內(nèi)容。為了讓提示的顯示更加自然,添加了一個滑動進(jìn)入和離開的transition。

注意:這里的關(guān)閉按鈕是通過css實(shí)現(xiàn)的,如果在你的項(xiàng)目中有對應(yīng)的icon,可以將其替換掉。

在此處,也可以使用slot來進(jìn)行內(nèi)容的傳遞,但考慮到之后還有別的參數(shù)需要傳遞至組件內(nèi),一次用一個統(tǒng)一的對象options進(jìn)行傳遞。

自定義樣式

通常提示的內(nèi)容種類很多,有的是成功提示,有的是警告,有的則是報錯。因此我們需要定義不同的樣式以表達(dá)不同的內(nèi)容。方法很簡單,在options中傳入背景色和文字顏色兩個參數(shù),如果組件中檢測到了傳入的樣式參數(shù),就用其替換默認(rèn)樣式。

Vue.js在處理動態(tài)樣式時非常靈活,為了讓代碼更清晰,我沒有選擇將動態(tài)樣式內(nèi)聯(lián),而是單獨(dú)使用一個計(jì)算屬性setStyle進(jìn)行設(shè)定:

computed: {
 setStyle () {
 return {
 color: this.options.textColor || '#fff',
 background: this.options.backgroundColor || '#21e7b6'
 }
 }
}

這樣一來,只要在options中一并傳入textColor和backgroundColor兩個屬性,就可以輕松自定義提示樣式了。

自動關(guān)閉

很多時候,我們希望提示在一定時間之后可以自動關(guān)閉,因此組件也需要擴(kuò)展出一個自動關(guān)閉的模式。同樣的,在“數(shù)據(jù)驅(qū)動”的思想下,我們應(yīng)該提供一個數(shù)據(jù),用來表明這個提示是否自動關(guān)閉。

options中的autoClose屬性就是這個作用。同樣的,自動關(guān)閉的延遲時間顯然也要能夠自定義,因此還一同添加了showTime這一屬性。

自動關(guān)閉本身不太復(fù)雜,我們只需要使用setTimeout,定義一個計(jì)時器即可。

首先是監(jiān)聽提示組件的顯示。

在這里,我通過watch監(jiān)聽options的變化來處罰計(jì)時器。由于我們已經(jīng)定義了一個close方法用于關(guān)閉計(jì)時器,并且在關(guān)閉時重置了show和options的值,所以在options變化時,只需要判斷options中的autoClose是否為true,就能知道是否需要啟動計(jì)時器了。這里單獨(dú)使用一個countdown方法來處理定時器相關(guān)的操作。

新增代碼如下:

data () {
 return {
 timers: []
 } 
},
methods: {
 countdown () {
 if (this.options.autoClose) {
 const t = setTimeout(() => {
 this.close()
 }, this.options.showTime || 3000)
 this.timers.push(t)
 }
 }
},
watch: {
 options () {
 this.timers.forEach((timer) => {
 window.clearTimeout(timer)
 })
 this.timers = []
 this.countdown()
 }
}

細(xì)心地你肯定會發(fā)現(xiàn),這段代碼中,有一些奇怪的處理。我們定義了一個空數(shù)組timers,并且每次開始一個計(jì)時器的時候,就把計(jì)時器存入數(shù)組中,而每次options變化時,我們也從timers中遍歷所有計(jì)時器并取消,之后清空timers。

這個做法,主要是為了避免一個計(jì)時器還沒有結(jié)束時,又開始一個新的提示所引發(fā)的提示被提前關(guān)閉的清空。舉個例子,如果沒有這樣的處理,那么先發(fā)出一個自動關(guān)閉的提示,在其沒自動關(guān)閉之前,就再發(fā)出一個新的提示。那么第一個提示的定時器依然會錯誤的關(guān)閉新提示。

這樣的問題主要是由于我們所有的計(jì)時器都是在同一個組件中,本質(zhì)上都是同一個提示,因此需要清除計(jì)時器,避免沖突。許多組件庫中類似的功能組件,是采用每一條提示就新生成一個提示組件的方式來實(shí)現(xiàn)的。但是那樣在多個提示連續(xù)出現(xiàn)時,就會出現(xiàn)堆疊在一起,又各自離開的情況。

之前的版本中,我的提示組件也采用了類似的設(shè)計(jì)方式,但是在最近的一個項(xiàng)目中,需要實(shí)現(xiàn)半透明的提示組件,就出現(xiàn)了堆疊后看不清提示文字的現(xiàn)象,才使用了現(xiàn)在新的模式。

進(jìn)一步擴(kuò)展

緊接著,我拓展了一個自動關(guān)閉模式下的倒計(jì)時條功能。思路上沒有使用Vue.js的transition系統(tǒng),而是采用了Css3本身的動畫系統(tǒng)。在一個自動關(guān)閉的提示被初始化時,為計(jì)時條添加一個樣式,效果是向X軸負(fù)方向移動100%,transition時間則通過計(jì)算屬性對應(yīng)設(shè)定。具體實(shí)現(xiàn)可以參考源代碼,這里不多做贅述。

增強(qiáng)靈活性

最后則是讓提示組件更靈活。有的時候,我們想展示的可能是可以自定義樣式的文本、亦或是一個超鏈接甚至更多。而Vue.js實(shí)現(xiàn)起來不要太簡單。我們只需要將組件中用于渲染的 {{ options.content }} 變?yōu)?span style="color: #800000"> {{{ options.content }}} 即可,對于3重花括號的模板,Vue.js會將其中的HTML標(biāo)簽按照正常內(nèi)容渲染。

如此一來,我們就可以將任何HTML內(nèi)容放入提示中了。 當(dāng)然一定要注意避免將用戶輸入的內(nèi)容渲染到3重花括號的模板中,避免XSS攻擊。

結(jié)合vuex

很多時候,我們會把提示組件引入到App.vue這個根組件中,但是發(fā)出提示的可能是組件樹中的任何一個組件。如果不想代碼中遍布各種dispatch和broadcast,那么引入vuex來進(jìn)行管理是個很好的方案。

大致的思路如下:

// store.js
const state = {
 show: false,
 options: {
 autoClose: false,
 content: 'notice content'
 }
}

const mutations = {
 NEW_NOTICE (state, options) {
 state.show = true
 state.options = options
 },
 CLOSE_NOTICE (state) {
 state.show = false
 state.options = {}
 }
}

// actions.js

export const newNotice = ({dispatch}, options) => {
 dispatch('NEW_NOTICE', options)
}
export const closeNotice = ({dispatch}) => {
 dispatch('CLOSE_NOTICE')
}

// Notification.vue

vuex: {
 getters: {
 show: state => state.show
 options: state => state.options
 },
 actions: {
 close: closeNotice
 }
}

// 任意調(diào)用notice的組件

vuex: {
 actions: {
 notice: newNotice
 }
}

引入vuex后,按上述代碼進(jìn)行配置,就可以在任意一處組件中,使用 this.notice({options}) 傳遞數(shù)據(jù)。不過由于vuex的單項(xiàng)數(shù)據(jù)流動特性,所有對state數(shù)據(jù)的操作都必須經(jīng)過actions調(diào)用mutations實(shí)現(xiàn),包括提示組件中的close方法也要替換成actions中的closeNotice方法。

綜述

通過這個提示組件,我們更熟練的掌握了Vue.js的組件系統(tǒng)、數(shù)據(jù)傳遞、計(jì)算屬性、transition動畫等特性,另外此組件已經(jīng)可以直接用于生產(chǎn)環(huán)境中。

本文已被整理到了《Vue.js前端組件學(xué)習(xí)教程》,歡迎大家學(xué)習(xí)閱讀。

關(guān)于vue.js組件的教程,請大家點(diǎn)擊專題vue.js組件學(xué)習(xí)教程進(jìn)行學(xué)習(xí)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue實(shí)現(xiàn)權(quán)限控制路由(vue-router 動態(tài)添加路由)

    vue實(shí)現(xiàn)權(quán)限控制路由(vue-router 動態(tài)添加路由)

    今天小編就為大家分享一篇vue實(shí)現(xiàn)權(quán)限控制路由(vue-router 動態(tài)添加路由),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Vue2.0如何發(fā)布項(xiàng)目實(shí)戰(zhàn)

    Vue2.0如何發(fā)布項(xiàng)目實(shí)戰(zhàn)

    本篇文章主要介紹了Vue2.0如何發(fā)布項(xiàng)目實(shí)戰(zhàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • vue.js單頁面應(yīng)用實(shí)例的簡單實(shí)現(xiàn)

    vue.js單頁面應(yīng)用實(shí)例的簡單實(shí)現(xiàn)

    本篇文章主要介紹了vue.js單頁面應(yīng)用實(shí)例的簡單實(shí)現(xiàn),使用單頁應(yīng)用,沒有頁面切換,就沒有白屏阻塞,可以大大提高 H5 的性能,達(dá)到接近原生的流暢體驗(yàn)。
    2017-04-04
  • Vue實(shí)現(xiàn)路由過渡動效的4種方法

    Vue實(shí)現(xiàn)路由過渡動效的4種方法

    Vue 路由過渡是對 Vue 程序一種快速簡便的增加個性化效果的的方法,這篇文章主要介紹了Vue實(shí)現(xiàn)路由過渡動效的4種方法,感興趣的可以了解一下
    2021-05-05
  • vue+moment實(shí)現(xiàn)倒計(jì)時效果

    vue+moment實(shí)現(xiàn)倒計(jì)時效果

    這篇文章主要為大家詳細(xì)介紹了vue+moment實(shí)現(xiàn)倒計(jì)時效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Vue3系列教程之插槽slot詳解

    Vue3系列教程之插槽slot詳解

    插槽(slot)可以說在一個?Vue?項(xiàng)目里面處處都有它的身影,比如我們使用一些UI?組件庫的時候,我們通??梢允褂貌宀蹃碜远x我們的內(nèi)容,今天通過本文給大家介紹vue3插槽slot的相關(guān)知識,感興趣的朋友一起看看吧
    2022-08-08
  • 詳解Vue.js在頁面加載時執(zhí)行某個方法

    詳解Vue.js在頁面加載時執(zhí)行某個方法

    這篇文章主要介紹了詳解Vue.js在頁面加載時執(zhí)行某個方法的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • vue表單驗(yàn)證rules及validator驗(yàn)證器的使用方法實(shí)例

    vue表單驗(yàn)證rules及validator驗(yàn)證器的使用方法實(shí)例

    在vue開發(fā)中,難免遇到各種表單校驗(yàn),下面這篇文章主要給大家介紹了關(guān)于vue表單驗(yàn)證rules及validator驗(yàn)證器使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • VUE+elementui組件在table-cell單元格中繪制微型echarts圖

    VUE+elementui組件在table-cell單元格中繪制微型echarts圖

    這篇文章主要介紹了VUE+elementui組件在table-cell單元格中繪制微型echarts圖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • vue實(shí)現(xiàn)el-table點(diǎn)選和鼠標(biāo)框選功能的方法

    vue實(shí)現(xiàn)el-table點(diǎn)選和鼠標(biāo)框選功能的方法

    在Vue中我們經(jīng)常需要處理表格數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于vue實(shí)現(xiàn)el-table點(diǎn)選和鼠標(biāo)框選功能的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10

最新評論