基于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 相关文章推荐
javascript 复杂的嵌套环境中输出单引号和双引号
May 26 Javascript
extjs 如何给column 加上提示
Jul 29 Javascript
Js与Jq 获取页面元素值的方法和差异对比
Apr 30 Javascript
javascript中类的定义方式详解(四种方式)
Dec 22 Javascript
AngularJS基础 ng-href 指令用法
Aug 01 Javascript
js代码延迟一定时间后执行一个函数的实例
Feb 15 Javascript
详解数组Array.sort()排序的方法
May 09 Javascript
详解webpack分离css单独打包
Jun 21 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
Jul 18 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
Dec 19 Javascript
vue中导出Excel表格的实现代码
Oct 18 Javascript
微信小程序进入广告实现代码实例
Sep 19 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
php模块memcache和memcached区别分析
2011/06/14 PHP
浅析PHP中的UNICODE 编码与解码
2013/06/29 PHP
PHP的基本常识小结
2013/07/05 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
BOOM vs RR BO3 第一场2.13
2021/03/10 DOTA
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
2013/03/11 Javascript
文本框水印提示效果的简单实现代码
2014/02/22 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
React Native仿美团下拉菜单的实例代码
2017/08/08 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
Python编程实现的简单神经网络算法示例
2018/01/26 Python
Python使用itertools模块实现排列组合功能示例
2018/07/02 Python
对python模块中多个类的用法详解
2019/01/10 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
python实现简单图书管理系统
2019/11/22 Python
python代码如何实现余弦相似性计算
2020/02/09 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
2018/01/10 HTML / CSS
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
宝宝周岁宴答谢词
2014/01/26 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
驾驶员培训方案
2014/05/01 职场文书
财务管理专业求职信
2014/06/11 职场文书
工作一年自我鉴定
2019/06/20 职场文书
JavaScript+HTML实现学生信息管理系统
2021/04/20 Javascript
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸
详解CSS中postion和opacity及cursor的特性
2022/08/14 HTML / CSS