最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS使用iView的Dropdown實現(xiàn)一個右鍵菜單

 更新時間:2019年05月06日 10:47:43   作者:未覺雨聲  
這篇文章主要介紹了JS使用iView的Dropdown實現(xiàn)一個右鍵菜單功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

前言

前段時間在用iView做個項目,其中需要使用自定義的右鍵菜單,然后去官網(wǎng)找了一下,發(fā)現(xiàn)有個Dropdown的組件,便想著能不能用來做個右鍵菜單的組件

你可能需要對iView有一定的使用經(jīng)驗

嘗試

Dropdown的使用大概是這個樣子

<template>
 <Dropdown>
  <a href="javascript:void(0)" rel="external nofollow" >
   下拉菜單
   <Icon type="ios-arrow-down"></Icon>
  </a>
  <DropdownMenu slot="list">
   <DropdownItem>驢打滾</DropdownItem>
   <DropdownItem>炸醬面</DropdownItem>
   <DropdownItem disabled>豆汁兒</DropdownItem>
   <DropdownItem>冰糖葫蘆</DropdownItem>
   <DropdownItem divided>北京烤鴨</DropdownItem>
  </DropdownMenu>
 </Dropdown>
</template>
<script>
 export default {

 }
</script>

發(fā)現(xiàn)有個觸發(fā)元素slot,可以自定義的插入元素,我一想,只要把slot的內(nèi)容設(shè)置為position: fixed,在右鍵的時候給它實時設(shè)置一下鼠標所在的位置不就行了嘛,然后一頓搗騰

<template>
 <Dropdown
  transfer
  placement="right-start"
  trigger="custom"
  :visible="currentVisible"
  @on-clickoutside="handleCancel"
 >
  <div :style="locatorStyle"></div>
  <DropdownMenu slot="list">
   <DropdownItem>驢打滾</DropdownItem>
   <DropdownItem>炸醬面</DropdownItem>
   <DropdownItem disabled>豆汁兒</DropdownItem>
   <DropdownItem>冰糖葫蘆</DropdownItem>
   <DropdownItem divided>北京烤鴨</DropdownItem>
  </DropdownMenu>
 </Dropdown>
</template>
<script>
export default {
 data () {
  return {
   posX: 0,
   posY: 0,
   currentVisible: false
  }
 },
 computed: {
  locatorStyle () {
   return {
    position: 'fixed',
    left: `${this.posX}px`,
    top: `${this.posY}px`
   }
  }
 },
 methods: {
  handleContextmenu ({ button, clientX, clientY }) {
   if (button === 2) {
    if (this.posX !== clientX) this.posX = clientX
    if (this.posY !== clientY) this.posY = clientY
    this.currentVisible = true
   }
  },
  handleCancel () {
   this.currentVisible = false
  }
 },
 mounted () {
  document.addEventListener('contextmenu', this.handleContextmenu, true)
  document.addEventListener('mouseup', this.handleContextmenu, true)
 },
 destroyed () {
  document.removeEventListener('contextmenu', this.handleContextmenu, true)
  document.removeEventListener('mouseup', this.handleContextmenu, true)
 }
}
</script>

看上去很不錯,然后興高采烈地一試,發(fā)現(xiàn)無論怎么點,菜單始終定位在右上角

slot的元素位置確實發(fā)生了變化,然而菜單位置始終不變化

這可把我折騰了半天,也沒弄出個結(jié)果。抱著 極不情愿 一探究竟的心情,我打開了Dropdown的源碼

<template>
  <div
    :class="[prefixCls]"
    v-click-outside="onClickoutside"
    @mouseenter="handleMouseenter"
    @mouseleave="handleMouseleave">
    <!-- 注意此處 -->
    <div :class="relClasses" ref="reference" @click="handleClick" @contextmenu.prevent="handleRightClick"><slot></slot></div>
    <transition name="transition-drop">
      <Drop
        :class="dropdownCls"
        v-show="currentVisible"
        :placement="placement"
        ref="drop"
        @mouseenter.native="handleMouseenter"
        @mouseleave.native="handleMouseleave"
        :data-transfer="transfer"
        :transfer="transfer"
        v-transfer-dom><slot name="list"></slot></Drop>
    </transition>
  </div>
</template>
<script>
// 以下省略
</script>

可以看到標注的地方,slot的外層還有個div,而Dropdown的定位是依賴于外層的這個div的,所以無論你slot里的內(nèi)容位置,在初始化之后再怎么變化,都不會影響到組件的位置了(也有可能是position: fixed的影響)

調(diào)整

發(fā)現(xiàn)slot外層的div有一個ref="reference"的屬性

突然有了想法,我是不是可以直接通過Dropdown的refs直接把整個外層div替換掉,于是繼續(xù)搗騰,改造了一下

<template>
 <Dropdown
  transfer
  placement="right-start"
  trigger="custom"
  ref="contextMenu"
  :visible="currentVisible"
  @on-clickoutside="handleCancel"
 >
  <DropdownMenu slot="list">
   <DropdownItem>驢打滾</DropdownItem>
   <DropdownItem>炸醬面</DropdownItem>
   <DropdownItem disabled>豆汁兒</DropdownItem>
   <DropdownItem>冰糖葫蘆</DropdownItem>
   <DropdownItem divided>北京烤鴨</DropdownItem>
  </DropdownMenu>
 </Dropdown>
</template>
<script>
export default {
 data () {
  return {
   posX: 0,
   posY: 0,
   currentVisible: false,
   locator: null
  }
 },
 methods: {
  createLocator () {
   // 獲取Dropdown
   const contextmenu = this.$refs.contextMenu
   // 創(chuàng)建locator
   const locator = document.createElement('div')
   locator.style.cssText = `position:fixed;left:${this.posX}px;top:${this.posY}px`
   document.body.appendChild(locator)
   // 將locator綁定到Dropdown的reference上
   contextmenu.$refs.reference = locator
   this.locator = locator
  },
  removeLocator () {
   if (this.locator) document.body.removeChild(this.locator)
   this.locator = null
  },
  handleContextmenu ({ button, clientX, clientY }) {
   if (button === 2) {
    if (this.posX !== clientX) this.posX = clientX
    if (this.posY !== clientY) this.posY = clientY
    if (this.trigger !== 'custom') {
     this.createLocator()
     this.currentVisible = true
    }
   }
  },
  handleCancel () {
   this.currentVisible = false
   this.removeLocator()
  }
 },
 mounted () {
  document.addEventListener('contextmenu', this.handleContextmenu, true)
  document.addEventListener('mouseup', this.handleContextmenu, true)
 },
 destroyed () {
  document.removeEventListener('contextmenu', this.handleContextmenu, true)
  document.removeEventListener('mouseup', this.handleContextmenu, true)
 }
}
</script>

根據(jù)鼠標的位置實時創(chuàng)建一個position: fixed的div,通過給Dropdown添加ref屬性,獲取到Dropdown對象之后再通過$ref屬性將div賦值到reference

大功告成,現(xiàn)在Dropdown會根據(jù)鼠標所在的位置出現(xiàn)啦

最后把一些點擊的回調(diào)方法補全,就是一個像樣的右鍵菜單組件了

當然作為一個可以復(fù)用的組件,還需要把一些通用邏輯再提取出來,以及補全一些常用的API,具體代碼可以參考這個倉庫

總結(jié)

以上所述是小編給大家介紹的JS使用iView的Dropdown實現(xiàn)一個右鍵菜單,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • WEB開發(fā)之注冊頁面驗證碼倒計時代碼的實現(xiàn)

    WEB開發(fā)之注冊頁面驗證碼倒計時代碼的實現(xiàn)

    近期在搞一個H5+backbone 項目,驗證輸入手機號 驗證碼倒計時功能,代碼中包含了前端樣式布局代碼和后端邏輯實現(xiàn),思路明確,具有參考借鑒價值,需要的朋友參考下吧
    2016-12-12
  • JS實現(xiàn)頁面中所有img對象添加onclick事件及新窗口查看圖片的方法

    JS實現(xiàn)頁面中所有img對象添加onclick事件及新窗口查看圖片的方法

    這篇文章主要介紹了JS實現(xiàn)頁面中所有img對象添加onclick事件及新窗口查看圖片的方法,涉及JS頁面元素遍歷及屬性動態(tài)操作相關(guān)技巧,需要的朋友可以參考下
    2016-12-12
  • Unicode 編碼轉(zhuǎn)換器

    Unicode 編碼轉(zhuǎn)換器

    Unicode 編碼轉(zhuǎn)換器...
    2007-01-01
  • js前端實現(xiàn)圖片懶加載(lazyload)的兩種方式

    js前端實現(xiàn)圖片懶加載(lazyload)的兩種方式

    本篇文章主要介紹了js前端實現(xiàn)圖片懶加載(lazyload)的兩種方式 ,使用圖片懶加載可以提高網(wǎng)頁運行速度,有興趣的可以了解一下。
    2017-04-04
  • 使用TypeScript?V8來改進您的JavaScript代碼

    使用TypeScript?V8來改進您的JavaScript代碼

    TypeScript?V8是一個強大的JavaScript類型系統(tǒng),它可以幫助你發(fā)現(xiàn)JavaScript代碼中的錯誤和潛在問題,并在編譯時捕獲它們,以便您可以解決它們,TypeScript?V8為JavaScript提供一系列的類型注釋,包括自定義類型和其他高級功能
    2023-08-08
  • js中對象和面向?qū)ο笈cJson介紹

    js中對象和面向?qū)ο笈cJson介紹

    今天小編就為大家分享一篇關(guān)于js中對象和面向?qū)ο笈cJson介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 一文帶你深入了解JavaScript中的閉包

    一文帶你深入了解JavaScript中的閉包

    閉包(closure)是一個函數(shù)以及其捆綁的周邊環(huán)境狀態(tài)的引用的組合,就是讓開發(fā)者可以從內(nèi)部函數(shù)訪問外部函數(shù)的作用域,下面下面小編就來和大家深入聊聊它的使用吧
    2023-07-07
  • npm淘寶鏡像修改講解

    npm淘寶鏡像修改講解

    這篇文章主要介紹了npm淘寶鏡像修改講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 關(guān)于Bootstrap彈出框無法調(diào)用問題的解決辦法

    關(guān)于Bootstrap彈出框無法調(diào)用問題的解決辦法

    這篇文章主要介紹了關(guān)于Bootstrap彈出框無法調(diào)用問題的解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • JS實現(xiàn)的對象去重功能示例

    JS實現(xiàn)的對象去重功能示例

    這篇文章主要介紹了JS實現(xiàn)的對象去重功能,結(jié)合實例形式分析了javascript針對json對象的遍歷、判斷、運算實現(xiàn)去重功能相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06

最新評論

汶川县| 石渠县| 伊川县| 莫力| 临猗县| 大连市| 司法| 龙江县| 湘乡市| 广东省| 云梦县| 汉川市| 绥滨县| 静乐县| 长武县| 岑溪市| 九江县| 仙居县| 南汇区| 博乐市| 武鸣县| 华容县| 根河市| 马尔康县| 县级市| 屯留县| 子洲县| 汶川县| 大田县| 根河市| 赤壁市| 务川| 冷水江市| 通榆县| 汕头市| 拜城县| 洪江市| 墨脱县| 菏泽市| 桑日县| 怀柔区|