vue2 ant-design select組件自定義下拉框, dropdownRender 使用,以及遇到的坑

業務需求:下拉框需要滿足用戶可輸入篩選 和 點擊右側 字符按鈕 #A-Z進行用戶選擇

1、基礎頁面代碼

<div><a-selectstyle="width: 100%"placeholder="請選擇客戶"allow-clearshow-search:filter-option="false":not-found-content="fetching ? undefined : null":defaultActiveFirstOption="false":getPopupContainer="getPopupContainer"@search="searhcCust"@dropdownVisibleChange="dropdownVisibleChange">//dropdownRender 插件使用,自定義右邊<divslot="dropdownRender"slot-scope="menu"><div class="index-bar"><divv-for="letterItem in letter":key="letterItem"@click.prevent="scrollOn(letterItem)"class="index-letter"@mousedown="e => e.preventDefault()" // 阻止調用默認事件>{{ letterItem }}</div></div><v-nodes :vnodes="menu" /> // 注意要在components中定義</div><a-select-opt-groupv-for="(group, index) in peoArray":key="index"><spanslot="label"class="option-letter":id="'peo_' + componentId + group.key">{{group.key}}</span><a-select-optionv-for="option in group.list":key="option.custRowId":value="option.custRowId":title="option.custName"><span>{{ option.custName }}</span></a-select-option></a-select-opt-group></a-select></div>

2、script中的代碼

<script>
import { debounce } from 'lodash'
export default {props: {componentId: { // 設置不同的id,用于同頁面有多個此組件時錨點不生效type: String,default: ''}},components: {VNodes: {functional: true,render: (h, ctx) => ctx.props.vnodes,}},data() {return {dropOpen: false,searchValue: '',navBarHeight: '50px', // 導航欄高度letter: [], // 字母檢索列表peoArray: [], // 通訊錄列表custList: null,custRowId: undefined,fetching: false,debounceGetCustInfoKeyList: null,}},created() {this.getCustInfoKeyList()this.debounceGetCustInfoKeyList = debounce(this.getCustInfoKeyList, 500)},methods: {dropdownVisibleChange(open) {this.dropOpen = open},getPopupContainer(triggerNode) {if (this.modalSelect) {return triggerNode.parentNode} else {return document.body}},changeCust(val) {this.$emit('change', val)},getList(peoArray) {let newList = []peoArray.forEach(element => {newList.push(...element.list)})return newList},searhcCust(val) {this.searchValue = valthis.debounceGetCustInfoKeyList()},getCustInfoKeyList() {const params = {custName: this.searchValue,}this.$http.XXX(params).then(res => {if (res.code === 200) {this.custList = res.dataif (this.custList) {this.setList()} else {this.peoArray = []}this.fetching = false} else {this.$message.warn(res.msg)this.fetching = false}})},setList() {let list = []this.letter = []for (const key in this.custList) {this.letter.push(key)list.push({key,list: this.custList[key]})}setTimeout(() => {this.peoArray = list})},// 字母檢索scrollOn(item) {let target = document.getElementById('peo_' + this.componentId + item) // 獲取每個字母通訊錄對象if (target) {const scrollDom = document.getElementsByClassName('ant-select-dropdown-menu')[0]scrollDom.scrollTo({behavior: 'smooth',top: target.offsetTop - 10})} else {this.$message.warn(`當前${item}元素下暫無客戶`)}}}
}
</script>

3、基礎CSS代碼


.index-bar {position: absolute;z-index: 99;right: 10px;top: 50%;transform: translateY(-50%);display: flex;flex-direction: column;align-items: center;
}.index-letter {margin: 0;cursor: pointer;color: #1677ff;font-weight: 500;font-size: 12px;line-height: 20px;
}
.option-letter {font-weight: 600;color: rgba(0, 0, 0, 0.45);
}

4、遇到的坑是什么呢?
就是在同一個頁面,渲染同一個組件時,在點擊前一個組件后,后面的組件右側按鈕滾動失效。
造成這個問題的原因就是 dropdownRender 渲染不會銷毀,導致scrollOn獲取到的DOM是同一組數據,解決方法有兩種:

	// 1、在 dropdownRender 插件的地方<divv-if="dropOpen"slot="dropdownRender"slot-scope="menu">// 2、scrollOn 中修改查詢Dom方法let target = document.getElementById('peo_' + this.componentId + item) // 獲取每個字母通訊錄對象if (target) {const parentDom = document.getElementById(offsetParent.id)const scrollDom = parentDom.children[0]scrollDom.scrollTo({behavior: 'smooth',top: target.offsetTop - 10})} else {this.$message.warning(`當前${item}元素下暫無客戶`)}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45671.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45671.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45671.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機硬件---如何更新自己電腦的BLOS

1找官網 例如“我使用的是HP&#xff08;惠普&#xff09;品牌的電腦”我只需要在瀏覽器上搜索“惠普官網”或“惠普-blos更新” 就可以看到&#xff0c;來自官網中更新blos的信息 2.有些品牌要查序列號該怎么辦呢&#xff1f; 有許多方法可以查詢&#xff0c;例如&#xf…

android13 frameworks里面常用的保存信息或者版本判斷的方法

總綱 android13 rom 開發總綱說明 目錄 1.前言 2. 數據庫 2.1 代碼讀取用法參考 3.prop 屬性配置 3.1 property的key值有哪些特點 4.區別 5. 其他數據存儲 6.彩蛋 1.前言 frameworks 不像我們一般開發app那樣,很多應用保存的方法都無法使用。這里記錄我們系統rom開…

Java性能優化-if-else簡化技巧

場景 Java性能優化-switch-case和if-else速度性能對比&#xff0c;到底誰快&#xff1f;&#xff1a; Java性能優化-switch-case和if-else速度性能對比&#xff0c;到底誰快&#xff1f;-CSDN博客 如果單純是做情景選擇&#xff0c;建議使用switch&#xff0c;如果必須使用i…

關于java的反射

???反射是啥呀相信許多學java的同學非常困惑在學的時候&#xff0c;總是感覺懂了卻又沒懂或者直接忽略過去了&#xff0c;那么本文就帶大家探討一下什么是反射在java中以及它的機制和運用。 ??什么是反射&#xff1a; 首先我們知道一些知識&#xff1a; 維基百科的解釋 …

武漢市集成電路領域重點產業鏈研究咨詢服務機構申報條件、時間

武漢市集成電路領域重點產業鏈研究咨詢服務機構公開遴選有關內容如下&#xff0c;武漢市的企業單位可以了解一下 一、采購內容 &#xff08;一&#xff09;項目名稱 武漢市集成電路領域重點產業鏈研究咨詢服務項目。 &#xff08;二&#xff09;項目內容 為進一步推動我市…

springboot項目 導入 maven坐標 錯誤 Could not transfer artifact XXX

1.報錯原因 當時導入的是 redis坐標 &#xff0c;導入jar 包報錯&#xff08;當時是網速太慢了&#xff0c;一直卡著不動 就關了 idea 重新下載&#xff09;結果報錯 之前的redis 項目都可以的&#xff0c;網上找了一下 都沒解決 2.解決辦法 既然說不能傳輸&#xff0c; 就說…

有用的工具

一、appuploader Appuploader home -- A tool improve ios develop efficiency such as submit ipa to appstore and manage ios certificate這是一款p12證書查看的工具&#xff0c; 需要建立一個apple ID專用密碼&#xff1a;Manage your Apple ID

redis其他類型和配置文件

很多博客只講了五大基本類型&#xff0c;確實&#xff0c;是最常用的&#xff0c;而且百分之九十的程序員對于Redis只限于了解String這種最常用的。但是我個人認為&#xff0c;既然Redis官方提供了其他的數據類型&#xff0c;肯定是有相應的考量的&#xff0c;在某些特殊的業務…

C++相關概念和易錯語法(22)(final、純虛函數、繼承多態難點)

1.final final在繼承和多態中都可以使用&#xff0c;在繼承中是指不想將自己被繼承&#xff0c;在多態中是指不想該函數被重寫&#xff0c;比較簡單&#xff0c;下面是一些使用例子。 2.純虛函數 當我們需要抽象一個類的時候&#xff0c;我們就需要用到純虛函數。所謂抽象的類…

C# 4.0 等待線程結束

在C#中&#xff0c;如果你正在使用多線程編程&#xff0c;并且想要等待一個或多個線程完成它們的工作再繼續執行&#xff0c;有幾種方式可以實現。從C# 4.0開始&#xff0c;雖然直接用于等待線程結束的特性&#xff08;如Thread.Join()&#xff09;在之前的版本中也已經存在&am…

升級版凱撒密碼加密解密器

目錄 開頭程序程序的流程圖程序加密與解密的效果例1加密的過程加密之后的文本 例2解密之后的文本解密之后的文本 例3加密之后的文本加密之后的文本 結尾 開頭 大家好&#xff0c;我叫這是我58。今天&#xff0c;我們來看一下我用C語言編譯的升級版凱撒密碼加密解密器和與之相關…

小程序 - - - - - 實現漸隱漸顯(監聽滾動距離版)

代碼如下&#xff1a; <!-- fixed-left --> <view class"fixed-box" animation"{{animationData}}">這里是漸隱漸顯的標簽 </view>.fixed-box {position: fixed;left: 0;top: 0;z-index: 999;background-color: #ccc;/* background-colo…

如何設計統計量及相關假設檢驗

一、如何設置H0和H1假設 誰做H0&#xff0c;誰做H1&#xff0c;在統計學的假設檢驗里是有約定俗成的規定的。即&#xff1a;status quo&#xff08;默認/現狀&#xff09;是H0&#xff0c;而新觀點或試圖challenge現狀的是H1。H1也叫research hypothesis&#xff0c;所以我們做…

【多個Python版本存在,使用pip+不同版本安裝庫時,windows彈出打開方式窗口的解決方法】

問題描述 電腦上存在python3.9&#xff0c;3.10&#xff0c;3.11&#xff0c;安裝順序也是先安裝3.9&#xff0c;然后3.10&#xff0c;最后3.11&#xff0c;那么直接使用pip安裝&#xff0c;會裝在3.11的位置&#xff0c;經過搜索可以通過pip版本&#xff0c;比如pip3.9 insta…

1.3- Zygote

第三節 Zygote 在Android系統中&#xff0c;Zygote是一個非常核心的組件&#xff0c;它扮演著孵化新應用程序進程的角色。Zygote是Android啟動過程中創建的第一個Java虛擬機&#xff08;JVM&#xff09;實例&#xff08;在Android中稱為Dalvik或ART虛擬機&#xff0c;取決于An…

如何在勒索軟件攻擊中幸存下來:最佳備份實踐、勒索攔截方案

無論身處什么業務或行業&#xff0c;數據都是您業務的關鍵資產。沒有針對數據進行安全可靠的備份保護&#xff0c;您將會受到許多“可能性”的威脅&#xff0c;無論數據丟失是由于在鍵盤上灑了飲料還是遭受到了勒索軟件的攻擊。 為了確保業務不被中斷&#xff0c;企業數據不會…

Python: 初識Python

文章目錄 1. Python的背景知識1.1 Python是咋來的?1.2 Python的特點1.3 Python能干啥?1.4 Python的缺點 2. 搭建Python環境2.1 安裝Python2.2 安裝PyCharm2.3 用pycharm編寫python程序 1. Python的背景知識 1.1 Python是咋來的? 由Guido van Rossum于1989年圣誕節為打發無…

一個用于管理多個 Node.js 版本的安裝和切換開源工具

大家好&#xff0c;今天給大家分享一個用于管理多個Node.js版本的工具 NVM&#xff08;Node Version Manager&#xff09;&#xff0c;它允許開發者在同一臺機器上安裝和使用不同版本的Node.js&#xff0c;解決了版本兼容性問題&#xff0c;為開發者提供了極大的便利。 在開發環…

路網雙線合并單線——ArcGISpro 解決方法

路網雙線合并成單線是一個在地圖制作、交通規劃以及GIS分析中常見的需求。雙線路網定義&#xff1a;具有不同流向、不同平面結構的道路。此外&#xff0c;車道數較多的道路&#xff08;例如&#xff0c;雙黃實線車道數大于4的道路&#xff09;也可以視為雙線路網&#xff0c;本…

iPhone 如何修改鎖屏密碼?修改密碼的具體步驟總結

修改 iPhone 鎖屏密碼 當你還記得當前設置的鎖屏密碼時&#xff0c;想要修改密碼就非常的簡單了&#xff0c;只需要簡單的點幾下就可以重新設置新密碼&#xff0c;下面是具體的操作步驟&#xff1a; 首先我們進入設置應用程序&#xff0c;然后找到“面容 ID 與密碼”。 然后需…