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