电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Vue組件化開發之通用型彈出框的實現

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

本文主要分享關于組件化開發的理解,讓剛入門的小伙伴少走一些彎路,提高開發效率,作者本人也是新手,如有不當之處,請大佬指出,感謝。

相信很多剛入門的小伙伴,經常會寫很多重復的代碼,而這些代碼一般情況下也都是大同小異,在這種情況下,如何讓開發和學習變得更加高效,組件化的思想就顯得尤為重要。這里通過設計一個簡單的彈出框,給小伙伴們分享組件化的應用。

組件&組件化

組件化是對某些可以進行復用的功能進行封裝的標準化工作。組件一般會內含自身的內部UI元素、樣式和JS邏輯代碼,它可以很方便的在應用的任何地方進行快速的嵌入。組件內部可以使用其他組件來構成更復雜的組件。

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

基本結構

首先是彈出框的基本結構

<div class='modal'> <div class='mask'></div> <div class='modal-dialog'> <div class='modal-header'> <span>標題</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>

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

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

注意,在父組件中調用需要用 <template> 包裹,并且 <template> 元素中的所有內容都將被傳入相應的插槽。

給彈出框加點樣式

.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 ,使用的時候別忘了安裝 node-sass 和 sass-loader ,現在我們的頁面是這個樣子了

Vue組件化開發之通用型彈出框的實現

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

SCSS函數

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

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

@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 函數替換我們原先的代碼

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

關于按鈕

每一個網站都有很多按鈕,不過,同一個網站的按鈕風格大多都是一樣,無非是大小不一。因此可以單獨在 scss 文件下新建 button.scss 然后在 App.vue 里面引入這個文件,在后面除了一些特別的樣式,其它就不需要給按鈕定義樣式了,這樣也便于維護。這里給出我的 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; } }}

為了復用

當前這個彈出框還只是一個固定的結構,它并不能在其他地方復用,需要進行一些處理,將所有可變部分抽取出來,例如標題,按鈕,內容。因為有插槽,所以內容就不用考慮,需要關注的是標題和按鈕,因為標題有可能是提示,警告等等,按鈕也有可能是確定、取消的一個或兩個都有。而這些信息都是從父組件傳遞過來,需要用 props 接收。

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

props: { // 彈框標題 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>

通過父組件傳遞的參數,來實現代碼的重用,并且使用 $emit 來向外拋出自定義事件,然后在父組件實現自己的業務邏輯。

在 Home.vue 里面引入這個組件并調用

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

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

最終效果如下

Vue組件化開發之通用型彈出框的實現

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

transition組件

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

Vue組件化開發之通用型彈出框的實現

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

當沒有指定的name屬性時,過渡的類名會默認以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;

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

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

你也可以根據自己的需求去做適當的調整,開發出適合自己項目的彈出框。

最后

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

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

到此這篇關于Vue組件化開發之通用型彈出框的實現的文章就介紹到這了,更多相關Vue 彈出框內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
主站蜘蛛池模板: 展厅设计-展馆设计-专业企业展厅展馆设计公司-昆明华文创意 | 水厂自动化|污水处理中控系统|水利信息化|智慧水务|智慧农业-山东德艾自动化科技有限公司 | 电动高压冲洗车_价格-江苏速利达机车有限公司 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 厂房出租_厂房出售_产业园区招商_工业地产&nbsp;-&nbsp;中工招商网 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | 滑板场地施工_极限运动场地设计_滑板公园建造_盐城天人极限运动场地建设有限公司 | 奥运星-汽车性能网评-提供个性化汽车资讯 | led全彩屏-室内|学校|展厅|p3|户外|会议室|圆柱|p2.5LED显示屏-LED显示屏价格-LED互动地砖屏_蕙宇屏科技 | 保温杯,儿童婴童奶瓶,运动水壶「广告礼品杯定制厂家」超朗保温杯壶 | 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 | 短信营销平台_短信群发平台_106短信发送平台-河南路尚 | 立式_复合式_壁挂式智能化电伴热洗眼器-上海达傲洗眼器生产厂家 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 污水提升器,污水提升泵,污水提升装置-德国泽德(zehnder)水泵系统有限公司 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 超声波乳化机-超声波分散机|仪-超声波萃取仪-超声波均质机-精浩机械|首页 | 耐腐蚀泵,耐腐蚀真空泵,玻璃钢真空泵-淄博华舜耐腐蚀真空泵有限公司 | 济南轻型钢结构/济南铁艺护栏/济南铁艺大门-济南燕翔铁艺制品有限公司 | 污水处理设备-海普欧环保集团有限公司| 深圳品牌设计公司-LOGO设计公司-VI设计公司-未壳创意 | 清水-铝合金-建筑模板厂家-木模板价格-铝模板生产「五棵松」品牌 | 杭州火蝠电商_京东代运营_拼多多全托管代运营【天猫代运营】 | 武汉森源蓝天环境科技工程有限公司-为环境污染治理提供协同解决方案 | 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | 泰国试管婴儿_泰国第三代试管婴儿_泰国试管婴儿费用/多少钱_孕泰来 | 江门流水线|江门工作台|江门市伟涛行工业设备有限公司 | 查分易-成绩发送平台官网 | 工业插头-工业插头插座【厂家】-温州罗曼电气 | 升降机-高空作业车租赁-蜘蛛车-曲臂式伸缩臂剪叉式液压升降平台-脚手架-【普雷斯特公司厂家】 | 石栏杆_青石栏杆_汉白玉栏杆_花岗岩栏杆 - 【石雕之乡】点石石雕石材厂 | 对辊破碎机-液压双辊式,强力双齿辊,四辊破碎机价格_巩义市金联机械设备生产厂家 | 四川职高信息网-初高中、大专、职业技术学校招生信息网 | 深圳法律咨询【24小时在线】深圳律师咨询免费 | 威实软件_软件定制开发_OA_OA办公系统_OA系统_办公自动化软件 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 舞台木地板厂家_体育运动木地板_室内篮球馆木地板_实木运动地板厂家_欧氏篮球地板推荐 | 高压无油空压机_无油水润滑空压机_水润滑无油螺杆空压机_无油空压机厂家-科普柯超滤(广东)节能科技有限公司 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 临海涌泉蜜桔官网|涌泉蜜桔微商批发代理|涌泉蜜桔供应链|涌泉蜜桔一件代发 | 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 |