基于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动态添加复选框Checkbox的实例方法
Apr 08 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
Nov 19 Javascript
Javascript让DEDECMS告别手写Tag
Sep 01 Javascript
jquery插件之文字间歇自动向上滚动效果代码
Feb 25 Javascript
Javascript中的数组常用方法解析
Jun 17 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
Jan 23 jQuery
微信小程序实现星级评价效果
Dec 28 Javascript
微信小程序生成分享海报方法(附带二维码生成)
Mar 29 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
Apr 11 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
Sep 11 Javascript
如何使用JavaScript策略模式校验表单
Apr 29 Javascript
JavaScript实现简单图片切换
Apr 29 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实现框架(一)
2006/10/09 PHP
ADODB的数据库封包程序库
2006/12/31 PHP
php 仿Comsenz安装效果代码打包提供下载
2010/05/09 PHP
解析PHP处理换行符的问题 \r\n
2013/06/13 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
2015/01/26 PHP
YiiFramework入门知识点总结(图文教程)
2015/12/28 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
javascript 动态加载 css 方法总结
2009/07/11 Javascript
jquery ajax 检测用户注册时用户名是否存在
2009/11/03 Javascript
JavaScript中的undefined学习总结
2013/11/30 Javascript
js中function()使用方法
2013/12/24 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
简单的Vue SSR的示例代码
2018/01/12 Javascript
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
2018/08/13 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
小程序实现锚点滑动效果
2019/09/23 Javascript
[02:17]2016国际邀请赛中国区预选赛VG战队领队采访
2016/06/26 DOTA
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
python中import学习备忘笔记
2017/01/24 Python
查看python安装路径及pip安装的包列表及路径
2019/04/03 Python
日期和时间问题
2015/01/04 面试题
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
2014/02/16 面试题
家长通知书家长评语
2014/04/17 职场文书
公司授权委托书样本
2014/09/15 职场文书
师德标兵先进事迹材料
2014/12/19 职场文书
教育实习指导教师评语
2014/12/31 职场文书
综合素质评价个性与发展自我评价
2015/03/06 职场文书
幼儿园六一儿童节演讲稿
2015/03/19 职场文书
导游词之青岛太清宫
2019/12/13 职场文书
解读Vue组件注册方式
2021/05/15 Vue.js
Vue3.0写自定义指令的简单步骤记录
2021/06/27 Vue.js
vue里使用create, mounted调用方法
2022/04/26 Vue.js