1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      Vue.directive如何實(shí)現(xiàn)元素scroll邏輯復(fù)用-創(chuàng)新互聯(lián)

      小編給大家分享一下Vue.directive如何實(shí)現(xiàn)元素scroll邏輯復(fù)用,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

      創(chuàng)新互聯(lián)是一家專業(yè)提供岐山企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、網(wǎng)站建設(shè)、H5場景定制、小程序制作等業(yè)務(wù)。10年已為岐山眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。

      繼上篇Vue 滾動觸底 mixins,將對于文檔滾動觸底的邏輯遷移到某個(gè)dom上,將會用到 Vue.directive 來實(shí)現(xiàn)代碼邏輯復(fù)用。

      元素滾動

      如何實(shí)現(xiàn)滾動

      元素實(shí)現(xiàn)滾動的條件有兩個(gè):

      • 有父子兩個(gè)元素

      • 子元素的高度 > 父元素的高度, 并且父元素設(shè)置 overflow:scroll / auto;

      Vue.directive如何實(shí)現(xiàn)元素scroll邏輯復(fù)用

      scrollHeight 計(jì)算

      Element.scrollHeight這個(gè)只讀屬性是一個(gè)元素內(nèi)容高度的度量,包括由于溢出導(dǎo)致的視圖中不可見內(nèi)容。

      可以簡單的理解為,滾動高度是元素可以滾動的大值,分為兩種情況

      滾動高度 = 當(dāng)前元素的 clientHeight = height + padding

      滾動高度 = 當(dāng)前元素的padding + 子元素的clientHeight + 子元素的(padding,margin,border) + 偽元素(:after,:before)
      scrollTop

      Element.scrollTop 屬性可以獲取或設(shè)置一個(gè)元素的內(nèi)容垂直滾動的像素?cái)?shù)。

      需要注意的是,scrollTop 是針對產(chǎn)生滾動條的元素而言,所以分為兩種情況

      • 不符合滾動條件, scrollTop 為0

      • 符合滾動條件,可以通過 Element.scrollTop 來獲取它的子元素的頂部到父級元素頂部的距離,不包括(border,padding)。

      判斷觸底

      為了簡單起見,假設(shè) father 和 child 都只設(shè)置了寬高。

      
       
      // 若為真說明觸底 father.clientHeight + father.scrollTop >= child.scrollHeight

      抽離成 Vue-directive

      基本語法

      參數(shù)1

      指令名稱,如focus 使用的時(shí)候就通過 v-focus 去綁定指定dom

      參數(shù)2

      options配置項(xiàng),包含以下的鉤子函數(shù),分別在對應(yīng)的生命周期觸發(fā)

      // 注冊一個(gè)全局自定義指令 `v-focus`
      Vue.directive('focus', {
       bind(){
       // 只調(diào)用一次,指令第一次綁定到元素時(shí)調(diào)用。在這里可以進(jìn)行一次性的初始化設(shè)置。
       },
       // 當(dāng)被綁定的元素插入到 DOM 中時(shí)……
       inserted: function (el) {
       // 聚焦元素
       el.focus()
       },
       update(){
       // 所在組件的 VNode 更新時(shí)調(diào)用
       },
       componentUpdated(){
       // 指令所在組件的 VNode 及其子 VNode 全部更新后調(diào)用。
       },
       unbind(){
       // 只調(diào)用一次,指令與元素解綁時(shí)調(diào)用。
       }
      })

      鉤子函數(shù)的回調(diào)參數(shù)

      上面的鉤子函數(shù)都接受 el、binding、vnode 和 oldVnode 這些回調(diào)參數(shù),對常用的參數(shù)做下解釋

      • el : 指令所 綁定的元素 ,可以用來直接操作 DOM 。

      • binding : { name,value ,arg}

      是綁定組件的data中的變量名

      來說下 value 和 arg 的區(qū)別,假設(shè)我們想向指令傳遞特定的數(shù)據(jù),可以通過下面的方式 arg傳遞值,和 value綁定值只能使用一種

      // 通過 binding.value 接收
      這里是測試
      // 通過 binding.arg 接收 測試2

      如何注冊指令

      全局注冊

      // 在單獨(dú)一個(gè)文件中單獨(dú)管理所有 directive 
      import Vue from 'vue'
      import inputClear from './input-clear'
      import forNested from './picker-item-for-nested'
      import copy from "./copy";
      
      const directives = {
       copy,
       'input-clear':inputClear,
       'for-nested':forNested
      }
      Object.keys(directives).forEach(key=>{
       Vue.directive(key,directives[key])
      })

      局部注冊,通過directives選項(xiàng)來注冊

      export default {
       directives:{
       // 自定義指令的名字
       autoFocus:{
        inserted(el){
        el.focus()
        console.log( 'inserted' );
        }
       }
       }
      }

      Vue.install的方式來安裝

      // directive.js
      export default {
       install(Vue){
       Object.keys(directives).forEach(key=>{
        Vue.directive(key,directives[key])
       })
       }
      }
      
      // main.js
      import Directives from "./directive/index";
      // Vue.use 通過注冊插件的方式來注冊指令 `Vue 插件中 install 函數(shù)接受 Vue構(gòu)造函數(shù)作為第一入?yún)
      Vue.use(Directives);

      Vue.use 源碼

      // 接收一個(gè) plugin 參數(shù)可以是 Function 也可以是 Object
       Vue.use = function (plugin: Function | Object) {
       // 如果傳入的是對象,需要有一個(gè)install 方法,并執(zhí)行該方法
       if (typeof plugin.install === 'function') {
        plugin.install.apply(plugin, args)
       // 如果傳入的是是函數(shù)則立即執(zhí)行
       } else if (typeof plugin === 'function') {
        plugin.apply(null, args)
       }
       }

      將scroll 邏輯添加到 v-directive 中

      如果子元素有多個(gè),需要計(jì)算每個(gè)子元素的 height + padding + border + margin 所以為了方便使用,滾動目標(biāo)的子元素有多個(gè)的情況下,用一個(gè)標(biāo)簽統(tǒng)一包裹

      function isBottom(el){
       const child = el.children[0]
       if(el.clientHeight + el.scrollTop >= child.scrollHeight){
       console.log('觸底了');
       }
      }
      Vue.directive('scroll',{
       bind(el){
       el.addEventListener('scroll',function(){
        isBottom(el)
       })
       },
       unbind(el){
       el.removeEventListener(isBottom)
       }
      })

      看完了這篇文章,相信你對“Vue.directive如何實(shí)現(xiàn)元素scroll邏輯復(fù)用”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


      本文名稱:Vue.directive如何實(shí)現(xiàn)元素scroll邏輯復(fù)用-創(chuàng)新互聯(lián)
      網(wǎng)站路徑:http://www.ef60e0e.cn/article/doegej.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        四子王旗| 犍为县| 丹棱县| 库车县| 新竹市| 综艺| 霍山县| 郧西县| 克什克腾旗| 肃宁县| 泽库县| 宝应县| 嫩江县| 潞城市| 信丰县| 洛宁县| 余庆县| 长汀县| 青铜峡市| 炎陵县| 鄄城县| 渭南市| 南康市| 孟津县| 那曲县| 资阳市| 横峰县| 英吉沙县| 前郭尔| 金坛市| 黄平县| 汉阴县| 卓资县| 凤冈县| 武定县| 京山县| 松江区| 乳源| 信丰县| 漠河县| 民和|