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

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

vue 插槽簡(jiǎn)介及使用示例

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

Vue的插槽,是一種內(nèi)容分發(fā)機(jī)制,但是我感覺(jué)它更加像組件的一種占位符的概念,通過(guò)插槽,等待組件外部傳入復(fù)雜的內(nèi)容。

使用插槽的好處

在以前的例子中todo-item插槽直接寫在了todo-list插槽中,其實(shí)是比較不合理的,它會(huì)導(dǎo)致todo-list插槽比較死板,無(wú)法重用更多的其他組件。

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:{ } });

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

插槽改造過(guò)程

改造示例:

將todo-item組件從todo-list組件中移除,放到頁(yè)面的html代碼中。 將todo-list組件中原todo-item的位置修改為 因?yàn)閠odo-item移到了頁(yè)面html代碼中,所以需要將todo-list的data中的list,移回全局vue中,防止組件找不到list導(dǎo)致v-for報(bào)錯(cuò);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('點(diǎn)擊刪除按鈕!');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>

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

插槽的種類

處理默認(rèn)插槽外,還有具名插槽,作用域插槽等等。

所謂的具名插槽就是指帶有名稱的插槽,解決的是一個(gè)組件中存在多個(gè)插槽的業(yè)務(wù)場(chǎng)景。比如有一個(gè)母版頁(yè)組件,希望區(qū)分頁(yè)頭,頁(yè)尾和頁(yè)面主體。實(shí)現(xiàn)如下效果:

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

那么這個(gè)組件應(yīng)該這樣編寫

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

具體調(diào)用組件的位置,則有兩種寫法:

一種是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組件中增加一個(gè)前置lable和后置lable

在todo-item組件的template中的html中增加slot插槽,并標(biāo)記名稱 html頁(yè)面的組件調(diào)用位置,使用template和v-slot的語(yǔ)法插入內(nèi)容

<!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('點(diǎn)擊刪除按鈕!');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>

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

作用域插槽示例:

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

data: function() { return { vrandom:Math.random() };}, 在todo-item的template的html中通過(guò)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>`, 在使用組件時(shí)通過(guò)模板語(yǔ)法調(diào)用綁定的變量

<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('點(diǎn)擊刪除按鈕!');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>

組件的插槽還有一種帶默認(rèn)值的用法:在slot中增加默認(rèn)內(nèi)容

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'>默認(rèn)尾部</slot> </li>`,

如果調(diào)用組件時(shí)沒(méi)有在插槽位置插入內(nèi)容,則html展示以默認(rèn)內(nèi)容進(jìn)行填充,如果有插內(nèi)容則以插入值填充。

<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 插槽簡(jiǎn)介及使用示例

<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 插槽簡(jiǎn)介及使用示例

以上就是vue 插槽簡(jiǎn)介及使用示例的詳細(xì)內(nèi)容,更多關(guān)于vue 插槽的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
97精品国产福利一区二区三区| 精品久久在线| 美女一区网站| 亚洲天堂av影院| 91日韩免费| 国产成人a视频高清在线观看| 美女久久久久久 | 日韩精品免费视频一区二区三区| 视频在线在亚洲| 亚洲视频二区| 91精品国产自产观看在线| 国产欧美自拍| 精品久久精品| 久久天堂精品| 在线国产一区二区| 老牛影视一区二区三区| 亚洲精品无播放器在线播放| 亚洲精品自拍| 国产精品黄网站| 福利片在线一区二区| 欧美精品日日操| 亚洲高清激情| 国产一区二区精品| 欧美片网站免费| 国产成人免费精品| 亚洲午夜久久久久久尤物| 偷拍欧美精品| 91精品福利观看| 国产精品毛片久久| 伊人精品视频| 国产伦乱精品| 日韩理论视频| 香蕉久久久久久久av网站| 亚洲精品福利| 久久尤物视频| 亚洲特级毛片| 丝袜脚交一区二区| 国产女人18毛片水真多18精品| 国产96在线亚洲| 欧美另类专区| 欧美一区久久| 国产理论在线| 男女精品网站| 久久精品一区二区国产| 亚洲国内精品| 欧美一区二区三区久久精品| 国产精品国产三级国产在线观看| 免费黄色成人| 欧美日韩亚洲一区二区三区在线 | 欧美激情久久久久久久久久久| 高清久久一区| 亚洲有吗中文字幕| 国产一区二区三区成人欧美日韩在线观看| 亚洲国产综合在线看不卡| 日韩精品第一| 日韩欧美网址| 午夜精品影视国产一区在线麻豆| 国产亚洲人成a在线v网站| 日韩精品水蜜桃| 日韩国产在线不卡视频| 国产精品99一区二区三| 国产精品婷婷| 国产va免费精品观看精品视频| 视频一区免费在线观看| 国产精品v亚洲精品v日韩精品| 一区在线视频观看| 国产成人精品一区二区免费看京| 免费在线观看视频一区| bbw在线视频| 亚洲精品乱码| 日韩欧美网址| 国产剧情一区| 免费国产亚洲视频| 日韩精品1区| 国产精品www.| 蜜臀精品一区二区三区在线观看| 日韩精品麻豆| 欧美国产中文高清| 中文视频一区| 亚洲爱爱视频| 国产精品白丝av嫩草影院| 蘑菇福利视频一区播放| 欧洲亚洲一区二区三区| 精品日韩一区| 日韩在线成人| 中文在线不卡| 日韩av福利| 国产精品日韩精品中文字幕| 日韩影院在线观看| 国产精品99免费看| 国产成人精品999在线观看| 日韩欧美高清一区二区三区| 9色精品在线| 日韩另类视频| 激情综合婷婷| 国产欧美大片| 日韩av网站在线观看| 在线视频亚洲| 久久精品国产亚洲夜色av网站| 国模大尺度视频一区二区| 国产日韩欧美三级| 日本在线视频一区二区| 久久成人亚洲| 亚洲作爱视频| 亚洲国产一区二区三区在线播放| 欧美一级鲁丝片| 激情综合婷婷| 国产精品任我爽爆在线播放 | 欧美日韩在线网站| 日韩精品中文字幕第1页| 麻豆久久久久久久| 国产精品亚洲成在人线| 欧美日本久久| 欧美影院视频| 欧美亚洲专区| 日本高清久久| 青青草伊人久久| 日韩精品乱码av一区二区| 亚洲欧美网站在线观看| 亚洲精品免费观看| 玖玖玖国产精品| 午夜宅男久久久| 欧美专区在线| 亚洲一区欧美| 日本在线不卡视频一二三区| 亚洲精选久久| 日韩欧美中文在线观看| 亚洲三级av| 日本免费新一区视频| 日韩激情中文字幕| 欧美交a欧美精品喷水| 国产传媒av在线| 色老板在线视频一区二区| 亚洲午夜精品久久久久久app| 精品一区免费| 好看的av在线不卡观看| 国产亚洲在线观看| 午夜天堂精品久久久久| 国产日产一区| 精品一区不卡| 伊人精品一区| 蜜桃一区二区三区在线| 天堂va在线高清一区| 国产欧美亚洲一区| 精品亚洲成人| 欧美日韩亚洲在线观看| 水蜜桃久久夜色精品一区的特点| 日韩精品欧美大片| 欧美激情三区| 1000部精品久久久久久久久| 亚洲深夜福利| 日本久久一区| 久久精品国产精品亚洲毛片| 中文在线免费视频| 91精品高清| 日本99精品| 国产一区二区精品久| 亚洲韩日在线| 日韩高清不卡一区二区| 国产a亚洲精品| 99日韩精品| 国产亚洲高清在线观看| 视频在线不卡免费观看| 影音先锋久久| 日本电影久久久| 久久久久久夜| 蜜乳av另类精品一区二区| 国产亚洲高清一区| 久久久一本精品| 香蕉视频成人在线观看| 国产精品成人一区二区网站软件| 色爱综合网欧美| 亚洲制服少妇| 国产精品18| 视频一区中文| 欧美在线看片| 99tv成人| 亚洲va久久| 国产资源在线观看入口av| 国产视频一区在线观看一区免费| 欧美影院视频| 欧美羞羞视频| 亚洲人成网站在线在线观看| 九九九精品视频| 日韩中文字幕区一区有砖一区| 精品国内亚洲2022精品成人| 免费欧美日韩| 成人美女视频| 欧美亚洲一区二区三区| 欧美一区二区三区高清视频| 国产欧美三级| 国产精品日韩久久久| 成人午夜毛片| 日韩欧美美女在线观看| 亚洲伦乱视频| 国产欧美日韩| re久久精品视频| 精品中国亚洲| 蜜桃视频在线观看一区| 中文字幕在线高清|