基于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 相关文章推荐
PJBlog插件 防刷新的在线播放器
Oct 25 Javascript
HTML DOM的nodeType值介绍
Mar 31 Javascript
jquery的flexigrid无法显示数据提示获取到数据
Jul 19 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
Aug 13 Javascript
ListBox实现上移,下移,左移,右移的简单实例
Feb 13 Javascript
一个简单的jquery的多选下拉框(自写)
May 05 Javascript
js图片处理示例代码
May 12 Javascript
原生js事件的添加和删除的封装
Jul 01 Javascript
js友好的时间返回函数
Aug 24 Javascript
Angular的自定义指令以及实例
Dec 26 Javascript
jQuery+PHP+Mysql实现抽奖程序
Apr 12 jQuery
jsonp格式前端发送和后台接受写法的代码详解
Nov 07 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 魔术函数使用说明
2010/02/21 PHP
推荐十款免费 WordPress 插件
2015/03/24 PHP
php源码的使用方法讲解
2019/09/26 PHP
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
javascript每日必学之条件分支
2016/02/17 Javascript
bootstrap使用validate实现简单校验功能
2016/12/02 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
浅谈Angular2 模块懒加载的方法
2017/10/04 Javascript
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
2019/08/16 Javascript
小程序自动化测试的示例代码
2020/08/11 Javascript
如何使用jQuery操作Cookies方法解析
2020/09/08 jQuery
Python实用日期时间处理方法汇总
2015/05/09 Python
python获取外网ip地址的方法总结
2015/07/02 Python
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
Python脚本获取操作系统版本信息
2016/12/17 Python
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
ubuntu安装mysql pycharm sublime
2018/02/20 Python
python3的输入方式及多组输入方法
2018/10/17 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
2018/11/23 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
python turtle 绘制太极图的实例
2019/12/18 Python
VScode连接远程服务器上的jupyter notebook的实现
2020/04/23 Python
香蕉共和国Banana Republic官网:美国GAP旗下偏贵族风格服饰品牌
2016/11/21 全球购物
泰国办公用品购物网站:OfficeMate
2018/02/04 全球购物
用Python写一个for循环的例子
2016/07/19 面试题
股票投资建议书
2014/05/19 职场文书
2014年乡镇人大工作总结
2014/11/25 职场文书
留学推荐信怎么写
2015/03/26 职场文书
goland 恢复已更改文件的操作
2021/04/28 Golang
Python 图片添加美颜效果
2022/04/28 Python