當前位置:
首頁 > 知識 > 使用vue實現tab操作

使用vue實現tab操作

在使用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

{{message}}

`
}
]
},
methods: {
change(index) {
this.selected = index;
}
}
})

綁定的change(index)事件,每次都將index給了selected,然後tab就會切換到對應的標籤。

上面的代碼里,我們是通過切換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綁定事件了。

3. 使用slot方式等

使用slot方式進行內容分發或者一個獨立的組件,可以讓我們把代碼整合到一塊,對外提供一個數據介面,只要按照既定的格式填寫數據即可。

3.1 slot

用slot方式寫一個子組件:

Vue.component("my-slot-tab", {
props : ["list", "selected"],
template : `

`
});

父組件模板:




父組件中slot="title"會替換子組件中name="title"的slot,父組件中slot="content"會替換子組件中name="content"的slot.最終渲染出來的tab結構與上面之前的代碼一樣。

3.2 其他組件方式

還有一種方式就是把所有的模板都寫到組件中。 子組件:

Vue.component("my-tab", {
props : ["list"],
template : `

  • {{item.title}}

`,
data{
return{
selected:0
}
},
methods : {
change(index){
this.selected = index;
}
}
});

父組件:

這種只需要傳遞一個list即可。

對比這兩種方法,slot中可以自定義更多的內容,而下面的方法使用起來更加簡單,只是自定義的東西比較少。

4. 總結

上面講解了幾種實現tab功能的方式,沒有說哪種方式最好,選擇最適合自己項目需求的方式就是最好的。文中有哪有錯誤或不足,歡迎批評指正。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

Backbone中父子view之間的值傳遞
Socket實現-Socket I/O
C++基礎之引用與指針的區別與聯繫、常引用使用時應注意的問題
Hugo快速搭建Blog
設計模式解密(3)-策略模式

TAG:科技優家 |

您可能感興趣

python使用pexpect實現ftp的操作
net core下對於Excel的一些操作及使用
binlog2sql 實現 MySQL 誤操作的恢復
Linux vmstat命令實際操作介紹
Google Analytics實際應用與Google編輯器的操作
高效!Illustrator實用操作分享
MapReduce實現之Reduce端重分區Join操作優化!
Redis-BitMap 「數據結構」可以實現對位的操作
Canonical推出新的Ubuntu操作系統
使用Group操作碼實現代幣化
使用PHP簡單操作Memcached
Google決定用gLinux取代Goobuntu Linux操作系統
自帶防丟失操作的耳機,Jabra Elite Active65t體驗
BlackBoard功能與操作
如何在Kubernetes中管理和操作Kafka集群
python列表list的操作
詳解 RestTemplate 操作
可視化數據平台 Tableau 推出了 Tableau Prep,提供自動化處理助力小白客戶一鍵操作
WebDriver 瀏覽器常用操作介紹
Fuchsia 操作系統將支持運行 Linux 應用程序