基于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 相关文章推荐
解决css和js的{}与smarty定界符冲突问题的两种方法
Sep 10 Javascript
JavaScript 作用域链解析
Nov 13 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
Mar 26 Javascript
JS实现向表格中动态添加行的方法
Mar 30 Javascript
js获取数组的最后一个元素
Apr 14 Javascript
全面解析Bootstrap中nav、collapse的使用方法
May 22 Javascript
文件上传的几个示例分享【推荐】
Dec 16 Javascript
你不知道的 javascript【推荐】
Jan 08 Javascript
详解vue-resource promise兼容性问题
Jun 20 Javascript
详解Vue.js项目API、Router配置拆分实践
Mar 16 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
Nov 25 Javascript
elementUI 动态生成几行几列的方法示例
Jul 11 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 syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
JavaScript加密解密7种方法总结分析
2007/10/07 Javascript
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
基于jQuery的js分页代码
2010/06/10 Javascript
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
基于javascript 闭包基础分享
2013/07/10 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
JS实现的左侧竖向滑动菜单效果代码
2015/10/19 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
使用Bootstrap + Vue.js实现添加删除数据示例
2017/02/27 Javascript
关于Bootstrap按钮组件消除黄框的方法
2017/05/19 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
2018/05/03 Javascript
vue中如何实现后台管理系统的权限控制的方法示例
2018/09/19 Javascript
微信小程序实现页面左右滑动
2020/11/16 Javascript
Python算法之栈(stack)的实现
2014/08/18 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
解决pycharm运行时interpreter为空的问题
2018/10/29 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
详解Pycharm安装及Django安装配置指南
2020/09/15 Python
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
阿玛尼美妆英国官网:Giorgio Armani Beauty英国
2019/03/28 全球购物
德国家具折扣店:POCO
2020/02/28 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
北京奥运会口号
2014/06/21 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
培训简讯范文
2015/07/20 职场文书
《西门豹》教学反思
2016/02/23 职场文书
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android