vue?perfect-scrollbar(特定框架里使用非該框架定制庫(kù)/插件)
正文
其實(shí),如何在特定框架里使用一款并非為該框架定制的庫(kù)/插件,只有兩點(diǎn):
1.熟悉這個(gè)框架
2.熟悉這個(gè)庫(kù)/插件的工作原理
說(shuō)完廢話(huà)。進(jìn)入正題。
perfect-scrollbar是一款輕量級(jí)的滾動(dòng)插件,具體介紹詳見(jiàn)其官網(wǎng)你只需要知道它絕對(duì)不是為了vue設(shè)計(jì)的,和vue沒(méi)半毛錢(qián)關(guān)系。
那么如何完美的融合其中呢?
以下是我的步驟
PerfectScrollbar在vue的準(zhǔn)備工作
首先,安裝包
npm install perfect-scrollbar --save
其次,引入包。為了能夠在項(xiàng)目中信手拈來(lái)的使用而不是每個(gè)要用的組件都去引入一遍,我們應(yīng)該在主入口引入并注冊(cè)為自定義指令。
//main.js
//引入核心框架
import Vue from 'vue';
//插件的包
import PerfectScrollbar from 'perfect-scrollbar';
//對(duì)應(yīng)的css
import "perfect-scrollbar/css/perfect-scrollbar.css";
/**
* @description 自動(dòng)判斷該更新PerfectScrollbar還是創(chuàng)建它
* @param {HTMLElement} el - 必填。dom元素
*/
const el_scrollBar = (el) => {
//在元素上加點(diǎn)私貨,名字隨便取,確保不會(huì)和已有屬性重復(fù)即可,我取名叫做_ps_
if (el._ps_ instanceof PerfectScrollbar) {
el._ps_.update();
} else {
//el上掛一份屬性
el._ps_ = new PerfectScrollbar(el, {
// 要配什么屬性自己看官網(wǎng),此處不會(huì)解釋任何其配置項(xiàng)的含義
suppressScrollX: true,
});
}
};
//接著,自定義Vue指令,指令名你自己隨便編一個(gè),我們假定它叫scrollBar
Vue.directive("scrollBar", {
//使用inserted鉤子函數(shù)(初次創(chuàng)建dom)獲取使用自定義指令處的dom
inserted(el, binding, vnode) {
//判斷其樣式是否存在position 并且position為"fixed", "absolute"或"relative"
//如果不符合條件,拋個(gè)錯(cuò)誤。當(dāng)然你也可以?huà)亗€(gè)警告然順便給其position自動(dòng)加上"relative"
//為什么要這么做呢,因?yàn)镻erfectScrollbar實(shí)現(xiàn)原理就是對(duì)dom注入兩個(gè)div,一個(gè)是x軸一個(gè)是y軸,他們兩的position都是absolute。
//對(duì)css稍有常識(shí)的人都知道,absolute是相對(duì)于所有父節(jié)點(diǎn)里設(shè)置了position屬性的最近的一個(gè)節(jié)點(diǎn)來(lái)定位的,為了能夠正確定位,我們要給其設(shè)置position屬性
const rules = ["fixed", "absolute", "relative", "sticky"];
if (!rules.includes(window.getComputedStyle(el, null).position)) {
console.error(`perfect-scrollbar所在的容器的position屬性必須是以下之一:${rules.join("、")}`)
}
//el上掛一份屬性
el_scrollBar(el);
},
//更新dom的時(shí)候
componentUpdated(el, binding, vnode, oldVnode) {
//vnode.context其實(shí)就是vue實(shí)例,這里其實(shí)無(wú)需實(shí)例也直接用Vue的靜態(tài)方法
//故而也可以寫(xiě)成Vue.nextTick
vnode.context.$nextTick(
() => {
el_scrollBar(el);
}
)
}
})至此,我們完成了PerfectScrollbar在vue的準(zhǔn)備工作
如何調(diào)用
用法相當(dāng)簡(jiǎn)單,在要用到的地方直接寫(xiě)一個(gè)v-scrollBar
//具體組件
<template>
<div class="container">
<ul class="list" v-scrollBar>
<li>巴拉巴拉</li>
<li>炫光舞法</li>
<!--想象這里有一堆li-->
<li>天舞臺(tái)</li>
</ul>
</div>
</template>
<style lang="less" scoped>
.list{
position:relative;
/*不寫(xiě)高度說(shuō)明高度自適應(yīng),既然高度都無(wú)限了根本就不會(huì)出現(xiàn)滾動(dòng)條*/
height:300px;
}
</style>是不是很簡(jiǎn)單,只要在要用到滾動(dòng)條的那個(gè)ul上面加一個(gè)v-scrollBar即可,其余什么都不用操心。
最后,還要注意一下兼容性
據(jù)perfect-scrollbar官網(wǎng)描述。它對(duì)ie的支持僅完美支持ie11,然后ie10勉強(qiáng)能用
那么vue是支持到ie9的。我們至少要讓他在ie9上能用
那么現(xiàn)在的這個(gè)狀態(tài)直接在ie9上試試。
應(yīng)該會(huì)得到一個(gè)類(lèi)似于Uncaught TypeError: Cannot read property 'add' of undefined的報(bào)錯(cuò)。
perfect-scrollbar 源碼
那么我們打開(kāi)perfect-scrollbar的源碼看看

有.add的地方就這兩處 都是classList的方法
再來(lái)安裝一個(gè)包
npm install classlist-polyfill --save
然后在引入perfect-scrollbar包之前(其實(shí)在它被實(shí)例化之前就行)引入它
//main.js 頭部引包部分改一下 //引入核心框架 import Vue from 'vue'; //classList的墊片 import "classlist-polyfill"; //插件的包 import PerfectScrollbar from 'perfect-scrollbar'; //對(duì)應(yīng)的css import "perfect-scrollbar/css/perfect-scrollbar.css";
至此大功告成
以上就是vue perfect-scrollbar(特定框架里使用非該框架定制庫(kù)/插件)的詳細(xì)內(nèi)容,更多關(guān)于vue使用perfect-scrollbar的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
electron實(shí)現(xiàn)靜默打印的示例代碼
這篇文章主要介紹了electron實(shí)現(xiàn)靜默打印的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
vue實(shí)現(xiàn)兩列水平時(shí)間軸的示例代碼
本文主要介紹了vue實(shí)現(xiàn)兩列水平時(shí)間軸的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
vue過(guò)渡和animate.css結(jié)合使用詳解
本篇文章主要介紹了vue過(guò)渡和animate.css結(jié)合使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
vue使用axios跨域請(qǐng)求數(shù)據(jù)問(wèn)題詳解
這篇文章主要為大家詳細(xì)介紹了vue使用axios跨域請(qǐng)求數(shù)據(jù)的問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
在Vue3中使用provide和inject進(jìn)行依賴(lài)注入的代碼詳解
在現(xiàn)代前端開(kāi)發(fā)中,Vue.js已經(jīng)成為了非常流行的框架之一,它提供了極大的靈活性和可維護(hù)性,今天我們要探討的是Vue?3中的provide和inject功能,這是一種用于在組件樹(shù)中進(jìn)行依賴(lài)注入的方法,需要的朋友可以參考下2024-06-06
Vue+Koa+MongoDB從零打造一個(gè)任務(wù)管理系統(tǒng)的詳細(xì)過(guò)程
這篇文章主要介紹了Vue+Koa+MongoDB從零打造一個(gè)任務(wù)管理系統(tǒng),本文通過(guò)圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08

