亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JS使用iView的Dropdown實現一個右鍵菜單

2024-05-06 16:50:33
字體:
來源:轉載
供稿:網友

前言

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

你可能需要對iView有一定的使用經驗

嘗試

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>

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

<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>

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

JS,iView,Dropdown,右鍵菜單

JS,iView,Dropdown,右鍵菜單

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

這可把我折騰了半天,也沒弄出個結果。抱著 極不情愿 一探究竟的心情,我打開了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里的內容位置,在初始化之后再怎么變化,都不會影響到組件的位置了(也有可能是position: fixed的影響)

調整

發現slot外層的div有一個ref="reference"的屬性

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

<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   // 創建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>

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

大功告成,現在Dropdown會根據鼠標所在的位置出現啦

JS,iView,Dropdown,右鍵菜單

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

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

總結

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国模在线视频| 亚洲色图13p| 97精品在线观看| 美女久久久久久久久久久| 亚洲小视频在线观看| 精品国偷自产在线视频99| 亚洲一区二区三区成人在线视频精品| 国产一区二区三区在线看| 亚洲成人久久久| 午夜精品久久久久久99热软件| 日韩欧美在线视频日韩欧美在线视频| 久久精视频免费在线久久完整在线看| 久久久免费观看| 国产精品亚洲欧美导航| yellow中文字幕久久| 96sao精品视频在线观看| 日韩美女免费线视频| 欧美激情欧美激情在线五月| 清纯唯美亚洲激情| 久久免费视频网站| www国产91| 国产精品∨欧美精品v日韩精品| 日韩中文字幕av| 欧美专区日韩视频| 国产成人亚洲综合| 亚洲欧美综合精品久久成人| 亚洲三级 欧美三级| 亚洲va久久久噜噜噜久久天堂| 亚洲一区二区三区香蕉| 伊人精品在线观看| 久久久久国产一区二区三区| 日韩欧美在线视频日韩欧美在线视频| 亚洲18私人小影院| 欧美性生交大片免网| 国产区精品在线观看| 欧美亚洲视频在线看网址| 日韩精品在线观看视频| 91免费高清视频| 国产成人在线一区二区| 理论片在线不卡免费观看| 91av在线播放视频| 日韩av一区二区在线| 国产成人精品久久二区二区| 中文字幕九色91在线| 欧美日韩在线一区| 欧美一级大胆视频| 色诱女教师一区二区三区| 欧美极品少妇xxxxⅹ喷水| 欧美丰满老妇厨房牲生活| 欧美华人在线视频| 日韩av有码在线| 亚洲影视中文字幕| 日韩av电影中文字幕| 国产视频久久久久久久| 原创国产精品91| 91欧美日韩一区| 欧美黄色三级网站| 久久国产精品久久久久| 亚洲国产日韩欧美在线动漫| 欧美理论电影在线观看| 51精品在线观看| 国产精品欧美一区二区| 国产精品久久久久久影视| 日韩av在线天堂网| 精品视频一区在线视频| 在线视频欧美性高潮| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲人成网7777777国产| 久久躁狠狠躁夜夜爽| 亚洲最大福利视频网| 97视频com| 亚洲精品成人久久| 亚洲人成网站777色婷婷| 国产婷婷成人久久av免费高清| 69**夜色精品国产69乱| 欧美性在线观看| 欧美日韩中文字幕日韩欧美| 中文字幕日韩精品有码视频| 欧美黄色三级网站| 欧美大片第1页| 91网站在线看| 亚洲最大福利网| 成人网中文字幕| 色综合久久久888| 久久久久久久亚洲精品| 91免费看国产| 中文字幕亚洲综合久久筱田步美| 国产精品av网站| 精品少妇一区二区30p| 欧美午夜丰满在线18影院| 色噜噜狠狠狠综合曰曰曰| 欧美成人全部免费| 久久不射热爱视频精品| 久久精品最新地址| 国产精品日韩av| 亚洲男人av电影| 久久免费国产视频| 亚洲大胆人体视频| 欧美午夜丰满在线18影院| 国产日韩欧美一二三区| 日韩av中文字幕在线免费观看| 中文字幕精品久久久久| www国产精品com| 欧美亚洲激情视频| 日韩在线观看免费全集电视剧网站| 欧美刺激性大交免费视频| 国产精品久久999| 日韩欧美国产激情| 国产综合在线看| 色樱桃影院亚洲精品影院| 日韩在线免费高清视频| 亚洲黄色av女优在线观看| 91久热免费在线视频| 午夜免费久久久久| 日韩av在线影视| 国产精品十八以下禁看| 欧美激情久久久久久| 日韩av电影在线免费播放| 国产精品久久久久久超碰| 97视频在线观看亚洲| 亚洲尤物视频网| 国产日韩换脸av一区在线观看| 91av在线国产| 久久影院模特热| 丝袜美腿精品国产二区| 色七七影院综合| 久久久久久久久网站| 国产精品白嫩美女在线观看| 亚洲欧洲日产国产网站| 国产精品久久一区| 精品久久久久久久久久久久久久| 一区二区日韩精品| 亚洲精品有码在线| 欧美日韩午夜激情| 影音先锋欧美在线资源| 国产精品视频中文字幕91| 亚洲国产97在线精品一区| 一本一本久久a久久精品牛牛影视| 97超级碰在线看视频免费在线看| 最新日韩中文字幕| 欧美极品少妇xxxxⅹ免费视频| 最近2019中文字幕在线高清| 精品久久中文字幕久久av| 欧美人成在线视频| 97国产精品人人爽人人做| 欧美第一黄色网| 国产精品一区二区三区免费视频| 97国产在线观看| 91精品在线看| 国产成人精品亚洲精品| 欧美一级大胆视频| 久久精品国产2020观看福利| 欧美成人三级视频网站| 国自在线精品视频| 欧美亚洲视频一区二区| 亚洲999一在线观看www| 欧美日韩裸体免费视频| 亚洲电影第1页| 中文字幕亚洲精品| 精品国产一区二区三区久久狼黑人| 亚洲一区二区中文| 欧美电影免费看| 九九精品在线播放| 国产一区二区av|