基于Vue的側(cè)邊目錄組件的實(shí)現(xiàn)
最近要做一個(gè)側(cè)邊目錄的功能,沒有找到類似的組件,索性自己寫了一個(gè)供大家參考
vue-side-catalog
一個(gè)基于vue的側(cè)邊目錄組件。

源碼地址:https://github.com/yaowei9363/vue-side-catalog
安裝
npm install vue-side-catalog -S
開始
<template>
<div id="app">
<div class="demo">
<h1>JavaScript</h1>
<h2>歷史</h2>
<h3>肇始于網(wǎng)景</h3>
<h3>微軟采納</h3>
<h3>標(biāo)準(zhǔn)化</h3>
<h2>概論</h2>
<h2>特性</h2>
</div>
<side-catalog
v-bind="catalogProps"
></side-catalog>
</div>
</template>
import SideCatalog from 'vue-side-catalog'
import 'vue-side-catalog/lib/vue-side-catalog.css'
export default {
components: {
SideCatalog,
},
data() {
return {
catalogProps:{
containerElementSelector: '.demo',
},
};
},
}
注意: containerElementSelector 屬性是必需的,指定文章的容器。
效果如下圖:

示例
自定義目錄標(biāo)簽
組件默認(rèn)會(huì)把containerElementSelector元素的直接子集的header標(biāo)簽作為目錄內(nèi)容,
對(duì)應(yīng)規(guī)則為:
h2 => 一級(jí)目錄
h3 => 二級(jí)目錄
h4 => 三級(jí)目錄
h5 => 四級(jí)目錄
要修改這一規(guī)則可以使用 headList 屬性,這個(gè)屬性的默認(rèn)值為["h2", "h3", "h4", "h5"]對(duì)應(yīng)上述規(guī)則
注意:自定義題目標(biāo)簽?zāi)壳爸恢С?code>containerElementSelector元素的直接子集的html標(biāo)簽
data(){
return {
catalogProps:{
headList: ["h1", "h2", "h3", "h4", "h5"], // 使h1作為一級(jí)目錄
// headList: ["h3", "h1", "p", "span"], // 指定不同的標(biāo)簽為目錄
},
};
},

自定義目錄元素
跟上面的自定義目錄標(biāo)簽不同,自定義目錄元素可以支持任意層級(jí)的含有ref屬性的元素,也可以支持組件
需要用到 refList 屬性
<template> <h1>JavaScript</h1> <h2 ref="t1">歷史</h2> <h3 ref="t1-1">肇始于網(wǎng)景</h3> <h3 ref="t1-2">微軟采納</h3> <h3 ref="t1-3">標(biāo)準(zhǔn)化</h3> <h2 ref="t2">概論</h2> <h2 ref="t3">特性</h2> <version ref="t4"/> <!-- ... --> </template>
//...
import Version from './components/Version';
export default {
components: {
// ...
Version,
},
data() {
return {
catalogProps:{
containerElementSelector: '.demo',
refList:[
{
ref: 't1'
},
{
ref: 't1-1',
level: 2 // 指定為二級(jí)目錄
},
{
ref: 't1-2',
level: 2
},
{
ref: 't1-3',
level: 2
},
{
ref: 't2'
},
{
ref: 't3'
},
{
ref: 't4',
title: '版本' // 組件需要單獨(dú)設(shè)置title(默認(rèn)取innerText)
},
]
},
};
},
}
效果如下圖:

注意:headList和refList同時(shí)設(shè)置的話,會(huì)忽視headList
指定元素滾動(dòng)
也可以使用 scrollElementSelector 對(duì)固定元素的內(nèi)容生成目錄,如果不指定該屬性則默認(rèn)監(jiān)聽Window的scroll事件
data(){
return {
catalogProps:{
scrollElementSelector: '.demo',
},
};
},
.demo {
height: 400px;
overflow: auto;
}
效果如下圖:

在線示例
Props
| Name | Type | Default | Description |
|---|---|---|---|
| headList | Array | ["h2", "h3", "h4", "h5"] | 為每級(jí)目錄指定標(biāo)簽 |
| refList | Array | - | 為每級(jí)目錄指定ref元素,數(shù)組每項(xiàng)為對(duì)象,包含兩個(gè)屬性<ul><li>ref(必需)該行目錄對(duì)象的refName</li><li>title該行目錄的名稱(默認(rèn)取innerText)</li><li>level(默認(rèn)為1)該行目錄級(jí)別</li></ul> |
| containerElementSelector | String | - | (必需)指定文章的容器 |
| scrollElementSelector | String | Window | 需要添加scroll事件的css選擇器,默認(rèn)監(jiān)聽window的scroll事件 |
| openDomWatch | Boolean | false | 是否開啟dom監(jiān)聽,如果containerElementSelector中有dom變化會(huì)重新計(jì)算每級(jí)目錄的offsetTop |
Methods
| Name | Parameters | Description |
|---|---|---|
| initActive | - | 使目錄第一行處于active狀態(tài) |
| setRefList | - | 計(jì)算每級(jí)目錄的offsetTop |
Slot
| Name | Description |
|---|---|
| - | 目錄的題目 |
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于vue-cli vue-router搭建底部導(dǎo)航欄移動(dòng)前端項(xiàng)目
這篇文章主要介紹了基于vue-cli vue-router搭建底部導(dǎo)航欄移動(dòng)前端項(xiàng)目,項(xiàng)目中主要用了Flex布局,以及viewport相關(guān)知識(shí),已達(dá)到適應(yīng)各終端屏幕的目的。需要的朋友可以參考下2018-02-02
vue3?hook重構(gòu)DataV的全屏容器組件詳解
這篇文章主要為大家介紹了vue3?hook重構(gòu)DataV的全屏容器組件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Element?plus中el-input框回車觸發(fā)頁(yè)面刷新問題以及解決辦法
在el-form表單組件中el-input組件輸入內(nèi)容后按下Enter鍵刷新了整個(gè)頁(yè)面,下面這篇文章主要給大家介紹了關(guān)于Element?plus中el-input框回車觸發(fā)頁(yè)面刷新問題以及解決辦法,需要的朋友可以參考下2024-03-03

