摘要:使用在上面的實(shí)現(xiàn)方式中,第個(gè)里有個(gè)輸入框與標(biāo)簽雙向綁定,但是沒(méi)有效果,因?yàn)槭前阎械膬?nèi)容作為元素填充到頁(yè)面中的,并沒(méi)有作為的屬性綁定給。無(wú)論使用全局注冊(cè)還是局部注冊(cè)的組件,思路都是一樣的,我們暫時(shí)使用全局注冊(cè)的組件來(lái)實(shí)現(xiàn)。
原文地址:https://www.xiabingbao.com/vue/2017/07/02/vue-tab.html
在使用jQuery類(lèi)庫(kù)實(shí)現(xiàn)tab功能時(shí),是獲取鼠標(biāo)在mousenter或click時(shí)的index值,然后切換到當(dāng)前的標(biāo)題和內(nèi)容,把其他的標(biāo)題和內(nèi)容的狀態(tài)去掉:
$(".tab .title").find(".item") .removeClass("current").eq(index).addClass("current"); // 為index位置的title添加current $(".tab .content").find(".item") .hide().eq(index).show(); // 顯示index位置的內(nèi)容
那么在使用vue實(shí)現(xiàn)tab功能時(shí),就不是像jQuery這種直接操作DOM了。我這里總結(jié)了下實(shí)現(xiàn)tab功能的3個(gè)思路,僅供參考。
1. 切換content或者直接切換內(nèi)容這種思路下,我們首先把結(jié)構(gòu)搭建起來(lái),然后用一個(gè)變量selected表示tab當(dāng)前展示的位置,給li標(biāo)簽添加mouseenter或click事件,將當(dāng)前的index傳遞進(jìn)去:
html代碼:
- {{item.title}}
js代碼:
var app = new Vue({ el: "#app", data: { selected: 0, //當(dāng)前位置 list: [ { title: "11111", content: "11111content" }, { title: "22222", content: "222222content" }, { title: "33333", content: `hello world` } ] }, methods: { change(index) { this.selected = index; } } }){{message}}
綁定的change(index)事件,每次都將index給了selected,然后tab就會(huì)切換到對(duì)應(yīng)的標(biāo)簽?!静榭磳?shí)例1】
上面的代碼里,我們是通過(guò)切換div的顯示與隱藏來(lái)進(jìn)行執(zhí)行的。tab中的content里如果只有純html內(nèi)容,我們可以直接把list[selected].content展示到.bd中:
每次selected變換時(shí),bd的內(nèi)容都會(huì)發(fā)生變化。
2. 使用currentView在上面的實(shí)現(xiàn)方式中,第3個(gè)tab里有個(gè)輸入框與p標(biāo)簽雙向綁定,但是沒(méi)有效果,因?yàn)関ue是把list中的內(nèi)容作為html元素填充到頁(yè)面中的,message并沒(méi)有作為vue的屬性綁定給input。那么使用組建和currentView就能彌補(bǔ)這個(gè)缺陷。
無(wú)論使用全局注冊(cè)還是局部注冊(cè)的組件,思路都是一樣的,我們暫時(shí)使用全局注冊(cè)的組件來(lái)實(shí)現(xiàn)。
每個(gè)組件里展示的是一個(gè)tab里的內(nèi)容,先注冊(cè)3個(gè)組件:
// tab0 Vue.component("item0",{ template : "1111111content" }); // tab1 Vue.component("item1",{ template : "222222content" }) // tab2 Vue.component("item2",{ data(){ return{ message : "" } }, template : `hello world` }){{message}}
然后在html中使用component來(lái)展示對(duì)應(yīng)組件的內(nèi)容,title的展示方式不變:
- {{item.title}}
currentView屬性可以讓多個(gè)組件可以使用同一個(gè)掛載點(diǎn),并動(dòng)態(tài)切換:
var app = new Vue({ el: "#app", data: { selected: 0, currentView : "item0", list: [ { title: "11111" }, { title: "22222" }, { title: "33333" } ] }, methods: { change(index) { this.selected = index; this.currentView = "item"+index; // 切換currentView } } })
這樣 message 在組件里就是一個(gè)獨(dú)立的data屬性,能在tab里也使用vue綁定事件了【查看實(shí)例2】。
3. 使用slot方式等使用slot方式進(jìn)行內(nèi)容分發(fā)或者一個(gè)獨(dú)立的組件,可以讓我們把代碼整合到一塊,對(duì)外提供一個(gè)數(shù)據(jù)接口,只要按照既定的格式填寫(xiě)數(shù)據(jù)即可。
3.1 slot用slot方式寫(xiě)一個(gè)子組件:
Vue.component("my-slot-tab", { props : ["list", "selected"], template : `` });
父組件模板:
{{ props.text }}
父組件中slot="title"會(huì)替換子組件中name="title"的slot,父組件中slot="content"會(huì)替換子組件中name="content"的slot.最終渲染出來(lái)的tab結(jié)構(gòu)與上面之前的代碼一樣?!静榭磳?shí)例3-1】
3.2 其他組件方式還有一種方式就是把所有的模板都寫(xiě)到組件中。
子組件:
Vue.component("my-tab", { props : ["list"], template : ``, data(){ return{ selected:0 } }, methods : { change(index){ this.selected = index; } } });
- {{item.title}}
父組件:
這種只需要傳遞一個(gè)list即可。【查看實(shí)例3-2】
對(duì)比這兩種方法,slot中可以自定義更多的內(nèi)容,而下面的方法使用起來(lái)更加簡(jiǎn)單,只是自定義的東西比較少。
4. 總結(jié)上面講解了幾種實(shí)現(xiàn)tab功能的方式,沒(méi)有說(shuō)哪種方式最好,選擇最適合自己項(xiàng)目需求的方式就是最好的。文中有哪有錯(cuò)誤或不足,歡迎批評(píng)指正。
如果你覺(jué)得不錯(cuò),歡迎關(guān)注我的公眾號(hào):wenzichel
原文地址:https://www.xiabingbao.com/vue/2017/07/02/vue-tab.html
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/83800.html
摘要:第十一集從零開(kāi)始實(shí)現(xiàn)切換組件本集定位我們先來(lái)聊聊切換的意義不管是手機(jī)還是屏幕的大小是有限的人眼睛看到的范圍也是有限的人們看信息的時(shí)候并不喜歡跳轉(zhuǎn)這種操作或是我們要查某個(gè)知識(shí)點(diǎn)進(jìn)入網(wǎng)站之后看了幾眼沒(méi)有需要的相關(guān)信息也就理所當(dāng)然的退出去繼續(xù)搜索 第十一集: 從零開(kāi)始實(shí)現(xiàn)( tab切換組件 ) 本集定位: 我們先來(lái)聊聊 tab 切換的意義, 不管是手機(jī)還是pc, 屏幕的大小是有限的,...
摘要:總結(jié)來(lái)說(shuō),低效,所以現(xiàn)在想將幾個(gè)系統(tǒng)融合到一個(gè)里邊,并且每次切換系統(tǒng)的時(shí)候保留用戶(hù)的操作。我是用開(kāi)發(fā)的,所以切換的地方直接用了的切換組件。 前言 公司分好幾個(gè)后臺(tái)模塊,統(tǒng)一使用vue+elementUi框架開(kāi)發(fā),每一個(gè)后臺(tái)模塊都是單獨(dú)團(tuán)隊(duì)開(kāi)發(fā)的。并且?guī)讉€(gè)系統(tǒng)整體的風(fēng)格、布局一樣的,包括左側(cè)邊欄,上方的面包屑等用戶(hù)在使用的時(shí)候,可能要切換別的系統(tǒng)就要在瀏覽器里,新打開(kāi)窗口,再輸入網(wǎng)址,回...
摘要:最近的一個(gè)簡(jiǎn)單項(xiàng)目中正好要用到選項(xiàng)卡組件,由于項(xiàng)目簡(jiǎn)單也就沒(méi)有使用任何第三方庫(kù),于是就自己動(dòng)手寫(xiě)了個(gè)選項(xiàng)卡組件。 用過(guò)Element ui庫(kù)的童鞋肯定知道組件,簡(jiǎn)單、好用、可以自定義標(biāo)簽頁(yè),不知道廣大童鞋們?cè)趧傞_(kāi)始使用組件的時(shí)候有沒(méi)有想過(guò)它是如何實(shí)現(xiàn)的?我咋剛開(kāi)始使用組件的時(shí)候就有去想過(guò),也想去實(shí)現(xiàn)一個(gè)超級(jí)簡(jiǎn)單的tabs選項(xiàng)卡組件,無(wú)奈當(dāng)時(shí)功力不夠,未能實(shí)現(xiàn)。最近的一個(gè)簡(jiǎn)單項(xiàng)目中正好...
摘要:介紹是一套基于和的實(shí)現(xiàn)了一個(gè)基于的路由的單頁(yè)面多頁(yè)簽應(yīng)用程序我之前寫(xiě)這個(gè)項(xiàng)目的時(shí)候有寫(xiě)了一篇記一次基于的多頁(yè)簽實(shí)踐經(jīng)驗(yàn)然后就部分熱心網(wǎng)友就在下面回復(fù)了一些其他類(lèi)似的項(xiàng)目我逐一查看了一下發(fā)現(xiàn)基本都是基于和實(shí)現(xiàn)的這種實(shí)現(xiàn)方法有兩個(gè)比 介紹 vue-multi-tab 是一套基于 vue 和 element-ui 的 , 實(shí)現(xiàn)了 tab-router (一個(gè)基于 tab 的路由) 的 單頁(yè)面...
閱讀 1663·2021-08-13 15:03
閱讀 2096·2019-08-30 15:54
閱讀 3554·2019-08-26 10:30
閱讀 1030·2019-08-26 10:22
閱讀 2756·2019-08-23 14:42
閱讀 1815·2019-08-22 11:16
閱讀 1046·2019-08-21 18:33
閱讀 3172·2019-08-21 17:28