基于Vue的侧边目录组件的实现


Posted in Javascript onFebruary 05, 2020

最近要做一个侧边目录的功能,没有找到类似的组件,索性自己写了一个供大家参考

vue-side-catalog

一个基于vue的侧边目录组件。

基于Vue的侧边目录组件的实现

源码地址: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>肇始于网景</h3>
   <h3>微软采纳</h3>
   <h3>标准化</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 属性是必需的,指定文章的容器。

效果如下图:

基于Vue的侧边目录组件的实现

示例

自定义目录标签

组件默认会把containerElementSelector元素的直接子集的header标签作为目录内容,
对应规则为:
h2 => 一级目录
h3 => 二级目录
h4 => 三级目录
h5 => 四级目录
要修改这一规则可以使用 headList 属性,这个属性的默认值为["h2", "h3", "h4", "h5"]对应上述规则

注意:自定义题目标签目前只支持containerElementSelector元素的直接子集的html标签
data(){
  return {
   catalogProps:{
    headList: ["h1", "h2", "h3", "h4", "h5"], // 使h1作为一级目录
    // headList: ["h3", "h1", "p", "span"], // 指定不同的标签为目录
   },
  };
 },

基于Vue的侧边目录组件的实现

自定义目录元素

跟上面的自定义目录标签不同,自定义目录元素可以支持任意层级含有ref属性的元素,也可以支持组件
需要用到 refList 属性

<template>
  <h1>JavaScript</h1>
  <h2 ref="t1">历史</h2>
  <h3 ref="t1-1">肇始于网景</h3>
  <h3 ref="t1-2">微软采纳</h3>
  <h3 ref="t1-3">标准化</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 // 指定为二级目录
     },
     {
      ref: 't1-2',
      level: 2
     },
     {
      ref: 't1-3',
      level: 2
     },
     {
      ref: 't2'
     },
     {
      ref: 't3'
     },
     {
      ref: 't4',
      title: '版本' // 组件需要单独设置title(默认取innerText)
     },
    ]
   },
  };
 },
}

效果如下图:

基于Vue的侧边目录组件的实现

注意:headListrefList 同时设置的话,会忽视headList

指定元素滚动

也可以使用 scrollElementSelector 对固定元素的内容生成目录,如果不指定该属性则默认监听Window的scroll事件

data(){
  return {
   catalogProps:{
    scrollElementSelector: '.demo',
   },
  };
 },
.demo {
 height: 400px;
 overflow: auto;
}

效果如下图:

基于Vue的侧边目录组件的实现

在线示例

点击这里

Props

Name Type Default Description
headList Array ["h2", "h3", "h4", "h5"] 为每级目录指定标签
refList Array - 为每级目录指定ref元素,数组每项为对象,包含两个属性
  • ref(必需)该行目录对象的refName
  • title该行目录的名称(默认取innerText)
  • level(默认为1)该行目录级别
containerElementSelector String - (必需)指定文章的容器
scrollElementSelector String Window 需要添加scroll事件的css选择器,默认监听window的scroll事件
openDomWatch Boolean false 是否开启dom监听,如果containerElementSelector中有dom变化会重新计算每级目录的offsetTop

Methods

Name Parameters Description
initActive - 使目录第一行处于active状态
setRefList - 计算每级目录的offsetTop

Slot

Name Description
- 目录的题目

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
innerText和innerHTML 一些问题分析
May 18 Javascript
关于query Javascript CSS Selector engine
Apr 12 Javascript
DOM操作一些常用的属性汇总
Mar 13 Javascript
JavaScript中pop()方法的使用教程
Jun 09 Javascript
SublimeText自带格式化代码功能之reindent
Dec 27 Javascript
浅谈javascript的url参数parse和build函数
Mar 04 Javascript
详解使用vue实现tab 切换操作
Jul 03 Javascript
javaScript中封装的各种写法示例(推荐)
Jul 03 Javascript
关于JavaScript中的this指向问题总结篇
Jul 23 Javascript
浅谈Vue的响应式原理
May 30 Javascript
Vue路由切换页面不更新问题解决方案
Jul 10 Javascript
在vue中封装方法以及多处引用该方法详解
Aug 14 Javascript
Js视频播放器插件Video.js使用方法详解
Feb 04 #Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
Feb 04 #jQuery
JS代码优化的8点建议
Feb 04 #Javascript
9种方法优化jQuery代码详解
Feb 04 #jQuery
JS代码检查工具ESLint介绍与使用方法
Feb 04 #Javascript
使用typescript改造koa开发框架的实现
Feb 04 #Javascript
Vue解析剪切板图片并实现发送功能
Feb 04 #Javascript
You might like
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
我的论坛源代码(十)
2006/10/09 PHP
收集的DedeCMS一些使用经验
2007/03/17 PHP
php读取msn上的用户信息类
2008/12/05 PHP
PHP 页面跳转到另一个页面的多种方法方法总结
2009/07/07 PHP
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
javascript与CSS复习(三)
2010/06/29 Javascript
jQuery Mobile页面跳转后未加载外部JS原因分析及解决
2013/03/18 Javascript
javascript中取前n天日期的两种方法分享
2014/01/26 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
详解如何给React-Router添加路由页面切换时的过渡动画
2019/04/25 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
Vue toFixed保留两位小数的3种方式
2020/10/23 Javascript
[52:06]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
Python多线程原理与用法详解
2018/08/20 Python
python excel转换csv代码实例
2019/08/26 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
Python用dilb提取照片上人脸的示例
2020/10/26 Python
接口自动化多层嵌套json数据处理代码实例
2020/11/20 Python
什么是makefile? 如何编写makefile?
2013/01/02 面试题
小学生综合素质评语
2014/04/23 职场文书
环保倡议书500字
2014/05/15 职场文书
祖国在我心中演讲稿200字
2014/08/28 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
仓库保管员岗位职责
2015/02/09 职场文书
小学教师教学反思
2016/02/24 职场文书
使用vue判断当前环境是安卓还是IOS
2022/04/12 Vue.js