Vue.js - Vue下使用perfect-scrollbar(在特定框架里使用一款并非为该框架定制的库/插件)

简介: Vue.js - Vue下使用perfect-scrollbar(在特定框架里使用一款并非为该框架定制的库/插件)


其实,如何在特定框架里使用一款并非为该框架定制的库/插件,只有两点:

1. 熟悉这个框架

2. 熟悉这个库/插件的工作原理

说完废话,进入正题。

perfect-scrollbar是一款轻量级的滚动插件,具体介绍详见其官网

你只需要知道它绝对不是为了vue设计的,和vue没半毛钱关系。那么如何完美的融合其中呢?


以下是我的步骤:

首先,安装包

npm install perfect-scrollbar --save

其次,引入包。为了能够在项目中信手拈来的使用而不是每个要用的组件都去引入一遍,我们应该在主入口引入并注册为自定义指令。

//main.js//引入核心框架importVuefrom'vue';
//插件的包importPerfectScrollbarfrom'perfect-scrollbar';
//对应的cssimport"perfect-scrollbar/css/perfect-scrollbar.css";
/*** @description 自动判断该更新PerfectScrollbar还是创建它* @param {HTMLElement} el - 必填。dom元素*/constel_scrollBar= (el) => {
//在元素上加点私货,名字随便取,确保不会和已有属性重复即可,我取名叫做_ps_if (el._ps_instanceofPerfectScrollbar) {
el._ps_.update();
    } else {
//el上挂一份属性el._ps_=newPerfectScrollbar(el, { suppressScrollX: true });
    }
};
//接着,自定义Vue指令,指令名你自己随便编一个,我们假定它叫scrollBarVue.directive("scrollBar", {
//使用inserted钩子函数(初次创建dom)获取使用自定义指令处的dominserted(el, binding, vnode) {
//判断其样式是否存在position 并且position为"fixed", "absolute"或"relative"//如果不符合条件,抛个错误。当然你也可以抛个警告然顺便给其position自动加上"relative"//为什么要这么做呢,因为PerfectScrollbar实现原理就是对dom注入两个div,一个是x轴一个是y轴,他们两的position都是absolute。//对css稍有常识的人都知道,absolute是相对于所有父节点里设置了position属性的最近的一个节点来定位的,为了能够正确定位,我们要给其设置position属性construles= ["fixed", "absolute", "relative"];
if (!rules.includes(window.getComputedStyle(el, null).position)) {
console.error(`perfect-scrollbar所在的容器的position属性必须是以下之一:${rules.join("、")}`)
        }
//el上挂一份属性el_scrollBar(el);
    },
//更新dom的时候componentUpdated(el, binding, vnode, oldVnode) {
try {
//vnode.context其实就是vue实例,这里其实无需实例也直接用Vue的静态方法//故而也可以写成Vue.nextTickvnode.context.$nextTick(
                () => {
el_scrollBar(el);
                }
            )
        } catch (error) {
console.error(error);
el_scrollBar(el);
        }
    }
})

至此,我们完成了PerfectScrollbar在vue的准备工作,接下来我们试试如何调用。

用法相当简单,在要用到的地方直接写一个v-scrollBar。

// 具体组件<template><divclass="container"><ulclass="list"v-scrollBar><li>巴拉巴拉</li><li>炫光舞法</li><!--想想这里有一堆li--><li>天舞台</li></ul></div></template><stylelang="less"scoped>.list{
position:relative;
/*不写高度说明高度自适应,既然高度都无限了根本就不会出现滚动条*/height:300px;
}
</style>

是不是很简单,只要在要用到滚动条的那个ul上面加一个v-scrollBar即可,其余什么都不用操心。

最后,还要注意一下兼容性。

perfect-scrollbar官网描述。它对ie的支持仅完美支持ie11,然后ie10勉强能用。那么vue是支持到ie9的。我们至少要让他在ie9上能用。那么现在的这个状态直接在ie9上试试。应该会得到一个类似于 Uncaught TypeError: Cannot read property 'add' of undefined 的报错。那么我们打开perfect-scrollbar的源码看看。image.png有.add的地方就这两处,都是classList的方法。那么classList是什么,参见mdn。ie9上没有对其实现,所以我们挂一个对其的垫片,再来安装一个包。

npm install classlist-polyfill --save

然后在引入perfect-scrollbar包之前(其实在它被实例化之前就行)引入它。

//main.js 头部引包部分改一下//引入核心框架importVuefrom'vue';
//classList的垫片import"classlist-polyfill";
//插件的包importPerfectScrollbarfrom'perfect-scrollbar';
//对应的cssimport"perfect-scrollbar/css/perfect-scrollbar.css";

至此大功告成~


附:简化版教程

在主入口完成(main.js)

importVuefrom'vue';
//自定义滚动条importPerfectScrollbarfrom'perfect-scrollbar';
//对应的cssimport"perfect-scrollbar/css/perfect-scrollbar.css";
/*** @description 为自定义滚动条全局注入自定义指令。自动判断该更新PerfectScrollbar还是创建它* @param {Element} el - 必填。dom元素*/constel_scrollBar= (el) => {
//在元素上加点私货,名字随便取,确保不会和已有属性重复即可,我取名叫做_ps_if (el._ps_instanceofPerfectScrollbar) {
el._ps_.update();
    } else {
//el上挂一份属性el._ps_=newPerfectScrollbar(el, { suppressScrollX: true });
    }
};
Vue.directive("anyNameYouLike",{
inserted(el, binding){
const { arg } =binding;
if(arg==="任何你喜欢的标记"){
el=el.querySelector(".el-table__body-wrapper");
if(!el){
returnconsole.warn("未发现className为el-table__body-wrapper的dom");
            }
        }
construles= ["fixed", "absolute", "relative"];
if (!rules.includes(window.getComputedStyle(el, null).position)) {
console.error(`perfect-scrollbar所在的容器的position属性必须是以下之一:${rules.join("、")}`)
            }
el_scrollBar(el);
    },
componentUpdated(el, binding, vnode) {
const { arg } =binding;
if (arg==="任何你喜欢的标记") {
el=el.querySelector(".el-table__body-wrapper");
if(!el){
returnconsole.warn("未发现className为el-table__body-wrapper的dom");
            }
        }
vnode.context.$nextTick(
            () => {
try {
el_scrollBar(el);
                } catch (error) {
console.error(error);
                }
            }
        )
    },
})

然后你使用起来就很简单了,如果是普通的元素。

<div v-anyNameYouLike>
    <!--巴拉巴拉-->
</div>

是不是很简单,效果拔群。

image.png

目录
相关文章
|
3月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
329 2
|
2月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
305 137
|
6月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
818 0
|
6月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
5月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
437 1
|
5月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
275 0
|
6月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
485 17
|
6月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
291 1
|
6月前
|
存储 JavaScript 前端开发
如何高效实现 vue 文件批量下载及相关操作技巧
在Vue项目中,实现文件批量下载是常见需求。例如文档管理系统或图片库应用中,用户可能需要一次性下载多个文件。本文介绍了三种技术方案:1) 使用`file-saver`和`jszip`插件在前端打包文件为ZIP并下载;2) 借助后端接口完成文件压缩与传输;3) 使用`StreamSaver`解决大文件下载问题。同时,通过在线教育平台的实例详细说明了前后端的具体实现步骤,帮助开发者根据项目需求选择合适方案。
556 0
|
6月前
|
JavaScript 前端开发 UED
Vue 项目中如何自定义实用的进度条组件
本文介绍了如何使用Vue.js创建一个灵活多样的自定义进度条组件。该组件可接受进度段数据数组作为输入,动态渲染进度段,支持动画效果和内容展示。当进度超出总长时,超出部分将以红色填充。文章详细描述了组件的设计目标、实现步骤(包括props定义、宽度计算、模板渲染、动画处理及超出部分的显示),并提供了使用示例。通过此组件,开发者可根据项目需求灵活展示进度情况,优化用户体验。资源地址:[https://pan.quark.cn/s/35324205c62b](https://pan.quark.cn/s/35324205c62b)。
274 0