基于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 相关文章推荐
用js实现trim()的解决办法
Apr 16 Javascript
js防止DIV布局滚动时闪动的解决方法
Oct 30 Javascript
纯jquery实现模仿淘宝购物车结算
Aug 20 Javascript
基于jQuery实现表格的查看修改删除
Aug 01 Javascript
微信小程序链接传参并跳转新页面
Nov 29 Javascript
vue.js学习之UI组件开发教程
Jul 03 Javascript
jQuery简介_动力节点Java学院整理
Jul 04 jQuery
webpack4 处理SCSS的方法示例
Sep 03 Javascript
如何在Vue.js中实现标签页组件详解
Jan 02 Javascript
Swiper.js实现移动端元素左右滑动
Sep 08 Javascript
vue-i18n实现中英文切换的方法
Jul 06 Javascript
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
May 25 Vue.js
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
php中字符串和正则表达式详解
2014/10/23 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
PHP设计模式之工厂模式详解
2017/10/24 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
2019/08/30 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
你可能不再需要JQUERY
2021/03/09 Javascript
JavaScript 指导方针
2007/04/05 Javascript
基于jQuery的消息提示插件 DivAlert之旅(二)
2010/04/01 Javascript
在父页面得到zTree已选中的节点的方法
2015/02/12 Javascript
js实现时间轴自动排列效果
2017/03/09 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
2018/03/03 Javascript
WebSocket的通信过程与实现方法详解
2018/04/29 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
vuex存储token示例
2019/11/11 Javascript
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
Python实现Logger打印功能的方法详解
2017/09/01 Python
Python给你的头像加上圣诞帽
2018/01/04 Python
PyQt5每天必学之组合框
2018/04/20 Python
Python响应对象text属性乱码解决方案
2020/03/31 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
web字体加载方案优化小结
2019/11/29 HTML / CSS
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
赞美老师的演讲稿
2014/05/22 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
nginx 反向代理之 proxy_pass的实现
2021/03/31 Servers
Java输出Hello World完美过程解析
2021/06/13 Java/Android
手把手教你导入Go语言第三方库
2021/08/04 Golang
linux下安装redis图文详细步骤
2021/12/04 Redis
Spring中bean集合注入的方法详解
2022/07/07 Java/Android