日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Vue組件化開發(fā)之通用型彈出框的實(shí)現(xiàn)

瀏覽:197日期:2023-02-04 17:38:52

本文主要分享關(guān)于組件化開發(fā)的理解,讓剛?cè)腴T的小伙伴少走一些彎路,提高開發(fā)效率,作者本人也是新手,如有不當(dāng)之處,請大佬指出,感謝。

相信很多剛?cè)腴T的小伙伴,經(jīng)常會寫很多重復(fù)的代碼,而這些代碼一般情況下也都是大同小異,在這種情況下,如何讓開發(fā)和學(xué)習(xí)變得更加高效,組件化的思想就顯得尤為重要。這里通過設(shè)計(jì)一個(gè)簡單的彈出框,給小伙伴們分享組件化的應(yīng)用。

組件&組件化

組件化是對某些可以進(jìn)行復(fù)用的功能進(jìn)行封裝的標(biāo)準(zhǔn)化工作。組件一般會內(nèi)含自身的內(nèi)部UI元素、樣式和JS邏輯代碼,它可以很方便的在應(yīng)用的任何地方進(jìn)行快速的嵌入。組件內(nèi)部可以使用其他組件來構(gòu)成更復(fù)雜的組件。

在實(shí)際的開發(fā)中,我們應(yīng)該避免去編寫重復(fù)的代碼,將精力放在更加核心的部分,因此就需要將這些重復(fù)的代碼抽取出來,封裝成公共的組件,提高開發(fā)效率,但同時(shí)也要注意組件的健壯性和可復(fù)用性,讓它能夠盡可能適應(yīng)更多的場景。

基本結(jié)構(gòu)

首先是彈出框的基本結(jié)構(gòu)

<div class='modal'> <div class='mask'></div> <div class='modal-dialog'> <div class='modal-header'> <span>標(biāo)題</span> <a href='javascript:;' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' class='icon-close'></a> </div> <div class='modal-body'> <slot name='body'></slot> </div> <div class='modal-footer'> <a href='javascript:;' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' class='btn'>確定</a> <a href='javascript:;' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' class='btn btn-default'>取消</a> </div> </div> </div> </div>

​ 基本結(jié)構(gòu)很簡單,稍微注意一點(diǎn)的就是 slot 插槽,如果沒有提供name屬性,它將有一個(gè)隱含的名字default,并且在父組件如果沒有指定 slot 的 v-slot 屬性的話,內(nèi)容會傳給default插槽。

在這里定義了 slot 的name屬性 body ,這種的叫做具名插槽,會匹配 v-slot:body 的內(nèi)容。

注意,在父組件中調(diào)用需要用 <template> 包裹,并且 <template> 元素中的所有內(nèi)容都將被傳入相應(yīng)的插槽。

給彈出框加點(diǎn)樣式

.modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; .mask { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: #000000; opacity: 0.5; } .modal-dialog { position: absolute; top: 40%; left: 50%; width: 560px; height: auto; background-color: #ffffff; transform: translate(-50%, -50%); .modal-header { height: 60px; background-color: #F5F5F5; padding: 0 25px; line-height: 60px; font-size: 16px; .icon-close { position: absolute; top: 23px; right: 25px; width: 14px; height: 14px; background: url('/static/img/icon-close.png') no-repeat center; background-size: contain; } } .modal-body { padding: 42px 40px 54px; font-size: 14px; } .modal-footer { height: 82px; line-height: 82px; text-align: center; background-color: #F5F5F5; } }}

我這里使用的是 scss ,使用的時(shí)候別忘了安裝 node-sass 和 sass-loader ,現(xiàn)在我們的頁面是這個(gè)樣子了

Vue組件化開發(fā)之通用型彈出框的實(shí)現(xiàn)

雖然還是不太美觀,但是已經(jīng)基本上是一個(gè)彈出框的雛形了,并且我沒有給 a 標(biāo)記樣式,原因在后面。

SCSS函數(shù)

回過頭再看看上面的 css 代碼,這里重復(fù)寫了4次固定定位的代碼,而且隨著項(xiàng)目的推進(jìn),肯定還有更多類似的代碼,何不將這些部分抽取出來,進(jìn)行封裝呢? scss 提供了這個(gè)功能,將 css 封裝成函數(shù),這里的函數(shù)直接會返回函數(shù)體。我們在遇到類似的情況時(shí),就能夠直接復(fù)用。

在 assets 目錄下新建 scss 文件夾并在里面新建 mixin.scss ,在里面新建 position 函數(shù),代碼如下:

@mixin position($pos: absolute, $top: 0, $left: 0, $w: 100%, $h: 100%) { position: $pos; top: $top; left: $left; width: $w; height: $h;}

接著我們引入 mixin.scss ,用 position 函數(shù)替換我們原先的代碼

通過@include方式使用 scss 函數(shù): @include position(fixed); 括號里面的是參數(shù)。

關(guān)于按鈕

每一個(gè)網(wǎng)站都有很多按鈕,不過,同一個(gè)網(wǎng)站的按鈕風(fēng)格大多都是一樣,無非是大小不一。因此可以單獨(dú)在 scss 文件下新建 button.scss 然后在 App.vue 里面引入這個(gè)文件,在后面除了一些特別的樣式,其它就不需要給按鈕定義樣式了,這樣也便于維護(hù)。這里給出我的 button 文件,可以參考一下。

.btn { display: inline-block; width: 110px; line-height: 30px; text-align: center; background-color: #FF6600; color: #ffffff; border: none; cursor: pointer;}.btn-default { background-color: #b0b0b0; color: #d7d7d7;}.btn-large { width: 202px; height: 50px; line-height: 50px; font-size: 18px;}.btn-huge { width: 300px; height: 54px; line-height: 54px; font-size: 16px;}.btn-group { .btn { margin-right: 20px; &:last-child { margin-right: 0; } }}

為了復(fù)用

當(dāng)前這個(gè)彈出框還只是一個(gè)固定的結(jié)構(gòu),它并不能在其他地方復(fù)用,需要進(jìn)行一些處理,將所有可變部分抽取出來,例如標(biāo)題,按鈕,內(nèi)容。因?yàn)橛胁宀郏詢?nèi)容就不用考慮,需要關(guān)注的是標(biāo)題和按鈕,因?yàn)闃?biāo)題有可能是提示,警告等等,按鈕也有可能是確定、取消的一個(gè)或兩個(gè)都有。而這些信息都是從父組件傳遞過來,需要用 props 接收。

在 props 里面添加如下代碼,并給某些屬性指定默認(rèn)值:

props: { // 彈框標(biāo)題 title: String, // 按鈕類型: 1:確定按鈕 2:取消按鈕 3:確定取消 btnType: String, // 按鈕文本 sureText: { type: String, default: '確定' }, cancleText: { type: String, default: '取消' }, showModal: Boolean }

添加完之后,還需重新改寫代碼

<div v-show='showModal'> <div class='mask'></div> <div class='modal-dialog'> <div class='modal-header'> <span>{{title}}</span> <a href='javascript:;' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' @click='$emit(’cancle’)'></a> </div> <div class='modal-body'> <slot name='body'></slot> </div> <div class='modal-footer'> <a href='javascript:;' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' v-if='btnType==1'@click='$emit(’submit’)'{{sureText}}</a> <a href='javascript:;' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' v-if='btnType==2'@click='$emit(’cancle’)'>{{cancleText}}</a> <div v-if='btnType==3'> <a href='javascript:;' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' @click='$emit(’submit’)'>{{sureText}}</a> <a href='javascript:;' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='external nofollow' @click='$emit(’submit’)'>{{cancleText}}</a> </div> </div> </div> </div>

通過父組件傳遞的參數(shù),來實(shí)現(xiàn)代碼的重用,并且使用 $emit 來向外拋出自定義事件,然后在父組件實(shí)現(xiàn)自己的業(yè)務(wù)邏輯。

在 Home.vue 里面引入這個(gè)組件并調(diào)用

<modal sureText='確定' btnType='1' :showModal='showModal' @submit='go' @cancle='showModal=false' > <template v-slot:body> <p>給個(gè)小星星吧</p> </template> </modal>

這里的 @submit 和 @cancle 就是我們在組件里面自定義的事件

最終效果如下

Vue組件化開發(fā)之通用型彈出框的實(shí)現(xiàn)

實(shí)現(xiàn)完之后,感覺有點(diǎn)彈出時(shí)生硬,沒關(guān)系,我們給它加點(diǎn)動畫,在css3中有 transform 和 transition 可以實(shí)現(xiàn)動畫效果,但是我們這里使用 vue 內(nèi)置組件 <transition> ,讓彈出框有一個(gè)從上面彈出的效果。

transition組件

transition 組件可以為元素或組件添加過渡效果,只會把過渡效果應(yīng)用到其包裹的內(nèi)容上,而不會額外渲染 DOM 元素,也不會出現(xiàn)在可被檢查的組件層級中。它可以通過多種方式進(jìn)行過渡,在這里應(yīng)用 class的方式過渡。

Vue組件化開發(fā)之通用型彈出框的實(shí)現(xiàn)

這幅圖是 Vue 官方給出的圖,簡單來說,v-enter是動畫開始的狀態(tài),v-enter-active進(jìn)入過渡生效時(shí)的狀態(tài),v-enter-to是過渡的結(jié)束狀態(tài),leave同理,具體細(xì)節(jié)大家可以去 https://cn.vuejs.org/v2/guide/transitions.html查看。

當(dāng)沒有指定的name屬性時(shí),過渡的類名會默認(rèn)以v作為前綴,這里給transition指定name為

slide并用它包裹modal組件

<transition name='slide'> <div v-show='showModal'> ... ... </div> </transition>

在style代碼里面modal后面加上

&.slide-enter-active { top: 0; } &.slide-leave-active { top: -100%; } &.slide-enter { top: -100%; }

并且給modal指定需要過渡的屬性

transition: top 0.5s;

加完這個(gè)之后,彈出框就會有一個(gè)滑上滑下的動畫啦。

到此,我們的彈出框就完成啦。

你也可以根據(jù)自己的需求去做適當(dāng)?shù)恼{(diào)整,開發(fā)出適合自己項(xiàng)目的彈出框。

最后

在實(shí)際開發(fā)中,組件化是尤為重要的,它能夠幫助我們寫出更高質(zhì)量的代碼,也能夠讓我們的代碼更易于維護(hù),盡早的樹立組件化的思想,對寫代碼也是非常有幫助的。

附上https://github.com/anpeier/shop-online

到此這篇關(guān)于Vue組件化開發(fā)之通用型彈出框的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Vue 彈出框內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品精选| 欧美在线日韩| 日韩一区二区三区免费| 亚洲性色视频| 日韩激情啪啪| 激情不卡一区二区三区视频在线| 日本不卡免费高清视频在线| 欧美不卡在线| 欧美日韩99| 激情综合网址| 国产精品久久免费视频| 久久精品中文| 日韩国产在线观看一区| 新版的欧美在线视频| 婷婷综合国产| 欧美日韩精品一区二区视频| 亚洲精品国产日韩| 91日韩欧美| 色狠狠一区二区三区| 日韩中文在线电影| 国产精品主播| 亚洲精品在线观看91| 精品视频自拍| 国产视频一区免费看| 日韩精品久久久久久| 成人国产精品| 亚洲日韩视频| 色一区二区三区四区| 欧美精品观看| 尤物网精品视频| 在线看片国产福利你懂的| 青青伊人久久| 日本欧美在线看| 亚洲成人va| 精品女同一区二区三区在线观看| 午夜国产欧美理论在线播放| 裤袜国产欧美精品一区| 日韩av中文字幕一区二区| 午夜国产精品视频| 日本美女一区| 精品久久久久中文字幕小说| 国产日韩视频在线| 国产丝袜一区| 国产日韩一区二区三免费高清 | 日本国产亚洲| 亚洲区国产区| 免费欧美在线视频| 亚洲欧美日韩国产| 久久福利影视| 日本大胆欧美人术艺术动态| 日本大胆欧美人术艺术动态| 中文无码日韩欧| 日韩国产在线一| 欧美片第1页综合| 国产成人精品福利| 欧美日韩尤物久久| 视频一区在线视频| 欧美偷窥清纯综合图区| 欧美国产另类| 国产成人免费精品| 欧美精品一区二区久久| 美国三级日本三级久久99 | 日韩高清电影一区| 午夜电影亚洲| 日韩中文字幕1| 欧美精选一区二区三区| 欧美在线亚洲| 亚洲麻豆一区| 成人亚洲一区| 日韩一级精品| 欧美激情在线精品一区二区三区| 国产在线观看www| 午夜在线精品偷拍| 国产精品一区二区精品视频观看| 亚洲永久av| 日韩一二三区在线观看| 亚洲深夜视频| 日韩欧美中文字幕在线视频| 欧美aaaaaa午夜精品| 欧美精品九九| 红杏一区二区三区| 免费观看在线色综合| 国产一区二区三区不卡av| 亚洲少妇诱惑| 九九精品调教| 欧美激情五月| 蜜臀久久99精品久久久久宅男 | 精品三级在线观看视频| 在线观看免费一区二区| 日韩av成人高清| 巨乳诱惑日韩免费av| 99久久九九| 国产亚洲一区| 亚洲三区欧美一区国产二区| 久久影视一区| 最新中文字幕在线播放| 91精品在线免费视频| 欧美日韩三区| 日韩中文在线电影| 亚洲区第一页| 精品日韩视频| 久久久国产精品网站| 丝瓜av网站精品一区二区| 久久精品理论片| 国产毛片久久| 日韩精品1区| 美女性感视频久久| 亚洲深夜福利在线观看| 久久久久美女| 精品视频在线观看网站| 麻豆91精品| 欧美理论视频| 精品中文在线| 红桃视频国产精品| 欧美视频精品全部免费观看| 久久久精品国产**网站| 乱人伦精品视频在线观看| 日韩国产一区| 国产欧美日韩一区二区三区在线| 人人草在线视频| 国产乱人伦丫前精品视频| 99在线观看免费视频精品观看| 国产精品一区二区三区美女| 99国产精品99久久久久久粉嫩| 国产精品亚洲综合久久| 在线一区免费观看| 日韩欧美一区免费| 日韩激情一区二区| 欧美日韩国产探花| 精品入口麻豆88视频| 亚洲欧洲日韩| 在线精品视频一区| 欧美一级精品| 蜜桃视频在线网站| 青青草精品视频| 欧美肉体xxxx裸体137大胆| 在线精品一区| 在线亚洲精品| 免费观看不卡av| 欧美精品福利| 日韩精品视频在线看| 悠悠资源网久久精品| 亚洲婷婷在线| 欧美在线影院| 免费视频久久| 日韩午夜一区| 亚洲一级在线| 午夜日本精品| 鲁大师成人一区二区三区| 玖玖玖国产精品| 中文字幕日韩亚洲| 日韩欧美中文字幕一区二区三区| 亚洲人成网77777色在线播放 | 美女av在线免费看| 午夜av不卡| 日韩欧美精品综合| 国产一区二区视频在线看| 激情不卡一区二区三区视频在线| 精品国产18久久久久久二百| 亚洲www啪成人一区二区| 88xx成人免费观看视频库| 亚洲四虎影院| 婷婷亚洲综合| 欧美私人啪啪vps| 欧美香蕉视频| 免费欧美一区| 久久国产亚洲| 日韩中文字幕一区二区高清99| 久久国产免费看| 日本а中文在线天堂| 亚洲啊v在线| 久久亚洲视频| 成人污污视频| 蜜桃一区二区三区在线观看| 日韩精品1区2区3区| 国产精品自拍区| 国产va在线视频| 日韩av免费| 蜜桃久久精品一区二区| 国产精品视频一区二区三区| 精品福利久久久| 在线亚洲自拍| 日韩精品一区二区三区免费观影 | 91亚洲一区| 日本在线成人| 久久精品动漫| 精品无人区麻豆乱码久久久| 黑丝一区二区| 免费一二一二在线视频| 亚洲精品婷婷| 激情丁香综合| 亚洲成人精品| 日韩午夜av在线| 欧美久久天堂| 国产精品白丝av嫩草影院| 在线亚洲观看| 国产美女高潮在线| 欧美一区免费| 亚洲深爱激情| 亚洲制服少妇|