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

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

vue 插槽簡介及使用示例

瀏覽:124日期:2022-10-25 08:40:10

Vue的插槽,是一種內容分發機制,但是我感覺它更加像組件的一種占位符的概念,通過插槽,等待組件外部傳入復雜的內容。

使用插槽的好處

在以前的例子中todo-item插槽直接寫在了todo-list插槽中,其實是比較不合理的,它會導致todo-list插槽比較死板,無法重用更多的其他組件。

Vue.component('todo-list', { template: `<ul> <todo-item v-on:delete='handleDelete' v-for='item in list' data-wen='wen' :title='item.title' :del='item.del'></todo-item></ul> `, data: function() { return { }; }, methods:{ } });

通過插槽化改造,則可以允許使用todo-list組件的用戶自行的傳入想要使用的todo-item,而不是一個固定的內容。

插槽改造過程

改造示例:

將todo-item組件從todo-list組件中移除,放到頁面的html代碼中。 將todo-list組件中原todo-item的位置修改為 因為todo-item移到了頁面html代碼中,所以需要將todo-list的data中的list,移回全局vue中,防止組件找不到list導致v-for報錯;handleDelete同理也要移至全局vue中

<!DOCTYPE html><html lang='en'> <head> <meta charset='UTF-8' /> <meta name='viewport' content='width=device-width, initial-scale=1.0' /> <meta http-equiv='X-UA-Compatible' content='ie=edge' /> <title>Document</title> <script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script> </head> <body> <div id='app'> <todo-list> <todo-item v-on:delete='handleDelete' v-for='item in list' data-wen='wen' :title='item.title' :del='item.del'></todo-item> </todo-list> </div> <script> Vue.component('todo-list', { template: `<ul> <slot></slot></ul> `, data: function() { return { }; }, methods:{ } }); Vue.component('todo-item', { props: { title: String, del: { type: Boolean, default: false } }, template: ` <li> <span v-if='!del'>{{title}}</span> <span v-else style='text-decoration:line-through'>{{title}}</span> <button v-show='!del' @click='handleClick'>刪除</button> </li>`, data: function() { return {}; }, methods: { handleClick(){console.log('點擊刪除按鈕!');this.$emit(’delete’,this.title); } } }); var vm = new Vue({ el: '#app', data: { list: [ {title: '新課程1',del: false }, {title: '新課程2',del: true }, {title: '新課程3',del: false } ] }, methods: { handleDelete(vtitle){console.log('刪除工程!',vtitle) } } }); </script> </body></html>

效果和改造前是一模一樣的。

插槽的種類

處理默認插槽外,還有具名插槽,作用域插槽等等。

所謂的具名插槽就是指帶有名稱的插槽,解決的是一個組件中存在多個插槽的業務場景。比如有一個母版頁組件,希望區分頁頭,頁尾和頁面主體。實現如下效果:

<div class='container'> <header> <!-- 我們希望把頁頭放這里 --> </header> <main> <!-- 我們希望把主要內容放這里 --> </main> <footer> <!-- 我們希望把頁腳放這里 --> </footer></div>

那么這個組件應該這樣編寫

<div class='container'> <header> <slot name='header'></slot> </header> <main> <slot></slot> </main> <footer> <slot name='footer'></slot> </footer></div>

具體調用組件的位置,則有兩種寫法:

一種是2.6之前的寫法。

<組件名><p slot='header'>頭部段落</p><p>主段落</p><p slot='footer'>尾部段落</p></組件名>

一種是2.6之后的寫法

<組件名><template v-slot:header> <p>頭部段落</p></template><p>主段落</p><template v-slot:footer> <label>尾部段落</label></template></組件名>

按照2.6之后的寫法,我們嘗試將todo-item組件中增加一個前置lable和后置lable

在todo-item組件的template中的html中增加slot插槽,并標記名稱 html頁面的組件調用位置,使用template和v-slot的語法插入內容

<!DOCTYPE html><html lang='en'> <head> <meta charset='UTF-8' /> <meta name='viewport' content='width=device-width, initial-scale=1.0' /> <meta http-equiv='X-UA-Compatible' content='ie=edge' /> <title>Document</title> <script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script> </head> <body> <div id='app'> <todo-list> <todo-item v-on:delete='handleDelete' v-for='item in list' data-wen='wen' :title='item.title' :del='item.del'><template v-slot:pretext> <label>前置文字</label></template><template v-slot:suftext> <label>后置文字</label></template> </todo-item> </todo-list> </div> <script> Vue.component('todo-list', { template: `<ul> <slot></slot></ul> `, data: function() { return { }; }, methods:{ } }); Vue.component('todo-item', { props: { title: String, del: { type: Boolean, default: false } }, template: ` <li> <slot name='pretext'></slot> <span v-if='!del'>{{title}}</span> <span v-else style='text-decoration:line-through'>{{title}}</span> <button v-show='!del' @click='handleClick'>刪除</button> <slot name='suftext'></slot> </li>`, data: function() { return {}; }, methods: { handleClick(){console.log('點擊刪除按鈕!');this.$emit(’delete’,this.title); } } }); var vm = new Vue({ el: '#app', data: { list: [ {title: '新課程1',del: false }, {title: '新課程2',del: true }, {title: '新課程3',del: false } ] }, methods: { handleDelete(vtitle){console.log('刪除工程!',vtitle) } } }); </script> </body></html>

作用域插槽:作用域插槽可以接收子組件傳遞的值,并根據不同的值顯示不同的內容。如根據用戶根據返回的值控制樣式信息。

作用域插槽示例:

為todo-item的data屬性增加返回值vRandom

data: function() { return { vrandom:Math.random() };}, 在todo-item的template的html中通過v-bind綁定組件中的屬性。

template: ` <li> <slot name='pretext' :val='vrandom'></slot> <span v-if='!del'>{{title}}</span> <span v-else style='text-decoration:line-through'>{{title}}</span> <button v-show='!del' @click='handleClick'>刪除</button> <slot name='suftext'></slot> </li>`, 在使用組件時通過模板語法調用綁定的變量

<div id='app'> <todo-list> <todo-item v-on:delete='handleDelete' v-for='item in list' data-wen='wen' :title='item.title' :del='item.del'><template v-slot:pretext='{val}'> <label>前置文字{{val}}</label></template><template v-slot:suftext> <label>后置文字</label></template> </todo-item> </todo-list> </div>

全部html代碼為

<!DOCTYPE html><html lang='en'> <head> <meta charset='UTF-8' /> <meta name='viewport' content='width=device-width, initial-scale=1.0' /> <meta http-equiv='X-UA-Compatible' content='ie=edge' /> <title>Document</title> <script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script> </head> <body> <div id='app'> <todo-list> <todo-item v-on:delete='handleDelete' v-for='item in list' data-wen='wen' :title='item.title' :del='item.del'><template v-slot:pretext='{val}'> <label>前置文字{{val}}</label></template><template v-slot:suftext> <label>后置文字</label></template> </todo-item> </todo-list> </div> <script> Vue.component('todo-list', { template: `<ul> <slot></slot></ul> `, data: function() { return { }; }, methods:{ } }); Vue.component('todo-item', { props: { title: String, del: { type: Boolean, default: false } }, template: ` <li> <slot name='pretext' :val='vrandom'></slot> <span v-if='!del'>{{title}}</span> <span v-else style='text-decoration:line-through'>{{title}}</span> <button v-show='!del' @click='handleClick'>刪除</button> <slot name='suftext'></slot> </li>`, data: function() { return { vrandom:Math.random() }; }, methods: { handleClick(){console.log('點擊刪除按鈕!');this.$emit(’delete’,this.title); } } }); var vm = new Vue({ el: '#app', data: { list: [ {title: '新課程1',del: false }, {title: '新課程2',del: true }, {title: '新課程3',del: false } ] }, methods: { handleDelete(vtitle){console.log('刪除工程!',vtitle) } } }); </script> </body></html>

組件的插槽還有一種帶默認值的用法:在slot中增加默認內容

template: ` <li> <slot name='pretext' :val='vrandom'></slot> <span v-if='!del'>{{title}}</span> <span v-else style='text-decoration:line-through'>{{title}}</span> <button v-show='!del' @click='handleClick'>刪除</button> <slot name='suftext'>默認尾部</slot> </li>`,

如果調用組件時沒有在插槽位置插入內容,則html展示以默認內容進行填充,如果有插內容則以插入值填充。

<div id='app'> <todo-list> <todo-item v-on:delete='handleDelete' v-for='item in list' data-wen='wen' :title='item.title' :del='item.del'><template v-slot:pretext='{val}'> <label>前置文字{{val}}</label></template><template v-slot:suftext> <label>后置文字</label></template> </todo-item> </todo-list> </div>

效果

vue 插槽簡介及使用示例

<div id='app'> <todo-list> <todo-item v-on:delete='handleDelete' v-for='item in list' data-wen='wen' :title='item.title' :del='item.del'><template v-slot:pretext='{val}'> <label>前置文字{{val}}</label></template><template v-slot:suftext></template> </todo-item> </todo-list> </div>

或者

<div id='app'> <todo-list> <todo-item v-on:delete='handleDelete' v-for='item in list' data-wen='wen' :title='item.title' :del='item.del'><template v-slot:pretext='{val}'> <label>前置文字{{val}}</label></template> </todo-item> </todo-list> </div>

vue 插槽簡介及使用示例

以上就是vue 插槽簡介及使用示例的詳細內容,更多關于vue 插槽的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
主站蜘蛛池模板: 游泳池设备安装工程_恒温泳池设备_儿童游泳池设备厂家_游泳池水处理设备-东莞市君达泳池设备有限公司 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 西安文都考研官网_西安考研辅导班_考研培训机构_西安在职考研培训 | 接地电阻测试仪[厂家直销]_电缆故障测试仪[精准定位]_耐压测试仪-武汉南电至诚电力设备 | 煤粉取样器-射油器-便携式等速飞灰取样器-连灵动 | 洁净化验室净化工程_成都实验室装修设计施工_四川华锐净化公司 | 电子厂招聘_工厂招聘_普工招聘_小时工招聘信息平台-众立方招工网 | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 烟雾净化器-滤筒除尘器-防爆除尘器-除尘器厂家-东莞执信环保科技有限公司 | 武汉宣传片制作-视频拍摄-企业宣传片公司-武汉红年影视 | 媒介云-全网整合营销_成都新闻媒体发稿_软文发布平台 | MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 慢回弹测试仪-落球回弹测试仪-北京冠测精电仪器设备有限公司 | 烟台游艇培训,威海游艇培训-烟台市邮轮游艇行业协会 | 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 | 物流公司电话|附近物流公司电话上门取货 | 影视模板素材_原创专业影视实拍视频素材-8k像素素材网 | 扒渣机厂家_扒渣机价格_矿用扒渣机_铣挖机_撬毛台车_襄阳永力通扒渣机公司 | 安徽净化工程设计_无尘净化车间工程_合肥净化实验室_安徽创世环境科技有限公司 | 清水混凝土修复_混凝土色差修复剂_混凝土色差调整剂_清水混凝土色差修复_河南天工 | 济南品牌设计-济南品牌策划-即合品牌策划设计-山东即合官网 | 电子书导航网_电子书之家_电子书大全_最新电子书分享发布平台 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 石栏杆_青石栏杆_汉白玉栏杆_花岗岩栏杆 - 【石雕之乡】点石石雕石材厂 | 防堵吹扫装置-防堵风压测量装置-电动操作显示器-兴洲仪器 | 没斑啦-专业的祛斑美白嫩肤知识网站-去斑经验分享 | 天津热油泵_管道泵_天津高温热油泵-天津市金丰泰机械泵业有限公司【官方网站】 | 双效节能浓缩器-热回流提取浓缩机组-温州市利宏机械 | 滑石粉,滑石粉厂家,超细滑石粉-莱州圣凯滑石有限公司 | 我车网|我关心的汽车资讯_汽车图片_汽车生活! | 医学模型生产厂家-显微手术模拟训练器-仿真手术模拟训练系统-北京医教科技 | 爱科技iMobile-专业的科技资讯信息分享网站 | 杭州中策电线|中策电缆|中策电线|杭州中策电缆|杭州中策电缆永通集团有限公司 | 螺钉式热电偶_便携式温度传感器_压簧式热电偶|无锡联泰仪表有限公司|首页 | 电竞学校_电子竞技培训学校学院-梦竞未来电竞学校官网 | 振动时效_振动时效仪_超声波冲击设备-济南驰奥机电设备有限公司 北京宣传片拍摄_产品宣传片拍摄_宣传片制作公司-现像传媒 | 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 | 青岛球场围网,青岛车间隔离网,青岛机器人围栏,青岛水源地围网,青岛围网,青岛隔离栅-青岛晟腾金属制品有限公司 | 上海乾拓贸易有限公司-日本SMC电磁阀_德国FESTO电磁阀_德国FESTO气缸 | 山东钢衬塑罐_管道_反应釜厂家-淄博富邦滚塑防腐设备科技有限公司 |