Debug-012-el-popover 使用 doClose() 關閉窗口不生效的處理方案

?前言:

? ? ? ? 今天上午碰見一個非常奇怪的情況:一樣的方法實現的功能,效果卻不一樣。

兩個頁面都是使用的doClose()去關閉的el-popover,其中有一個就是不生效,找不同找了半天,始終不得其解。請看效果吧:

el-popover-doClose()-ok

視頻1(el-popover-doClose()-關閉成功的)

el-popover-doClose()-error

視頻2(el-popover-doClose()-關閉不成功)?

代碼完全一樣,我把第二個頁面的html部分copy到第一個頁面中也用的很流暢。請各位大佬如果碰見過,踩過坑就給分析分析,留個言哈。

其實仔細看視頻2,第一條數據確實是已經調接口刪除成功了的,但是問題是popover還是沒有關閉。

使用doClose()的原因:之前不知道el-popover上面有doClose()這個方法,也是百度查的。打印了一下它的REF才知道它上面確實有這個方法:

這個方法是可以替代v-model="visible"來控制顯示隱藏的(顯示用doShow()這個方法)主要還是因為是在table列表中,內容比較多,感覺用不了這個動態綁定v-model='visible + scope.row.id' 這種寫法,但我記得好像失敗了,最終才選擇了用doClose()的方案。

但這些不是重點,重點是兩個頁面同種寫法結果一個能關,另一個不能關,我就很費解。真的試了很久,依然不行,最終還是百度一下了。

看了好幾篇博文,基本用的都是一種方法,但是他們給出的原因都是表格懶加載導致,可是我也沒加這個屬性,所以不能說服我,還說VUE不能檢測到ref的值變化 不能觸發視圖更新(這個感覺靠點譜,但是視頻1為什么行呢?)。不過他們給出的方法倒是真的很有效:

handleConfirm() {document.body.click() // 模擬點擊頁面其它部分關掉彈層,因為該頁面列表使用懶加載導致doClose無效
}

在合適的位置添加一句document.body.click(),我的理解就是相當于模擬用戶在別的空白處觸發一個click()事件,這樣自然能實現關閉el-popover的效果。

真的是解決了這個問題。

然后我又去問通義靈碼:

全部答案我放在code中吧:

//問題:el-popover 使用 doClose() 關閉窗口為什么不生效在 Element UI 中,el-popover 組件通常通過綁定 v-model 或 visible 屬性來控制其顯示和隱藏狀態。當用戶希望在特定條件下關閉 el-popover 時,通常會觸發一個方法,比如 doClose,來改變 v-model 或 visible 的值。然而,如果你遇到 doClose 方法不起作用的情況,可能存在以下幾個原因:方法未正確綁定:確保 doClose 是一個在 Vue 實例中的方法,并且在模板中正確引用。
如果使用 ref 訪問 el-popover,確保 ref 已正確定義,例如 ref="popover",并且在方法中使用 this.$refs.popover.close() 調用。
事件觸發問題:如果 doClose 是在某個事件回調中觸發,如點擊事件,確保事件已正確綁定并且觸發條件正確。
異步更新隊列:Vue.js 使用異步更新隊列來處理數據變化。如果你在事件處理函數中直接改變 v-model 或 visible,可能需要使用 Vue.nextTick 或者 Promise.then 來確保在 DOM 更新之后關閉 el-popover。
懶加載導致的問題:如你所述,如果列表使用了懶加載,可能在某些情況下,doClose 方法不會被觸發,因為焦點仍然在列表的某個元素上,沒有真正離開觸發 el-popover 顯示的元素。在這種情況下,可能需要通過模擬點擊頁面其他部分(如 document.body.click())來強制關閉。
CSS 選擇器問題:如果 el-popover 的關閉按鈕或者觸發器被其他元素覆蓋,可能導致點擊事件無法正確傳播,從而影響 doClose 方法的調用。
組件實例問題:如果 el-popover 是動態生成的,可能需要確保每個實例都有唯一的 ref,以便正確地訪問和關閉相應的實例。
權限或角色問題:如果 doClose 包含了角色或權限檢查,而當前用戶沒有足夠的權限,那么方法可能不會執行。
解決這類問題通常需要檢查相關代碼以確定具體的原因。如果 doClose 是 Element UI 自帶的方法,確保你正確理解其用法,因為 Element UI 的官方文檔通常會提供正確的使用示例。如果 doClose 是自定義的方法,那么需要檢查該方法的實現和調用上下文。//問題:前端中document.body.click() 的作用在前端開發中,document.body.click()?這段代碼的作用是模擬一個點擊事件發生在頁面的body上。具體來說,這段代碼有以下幾點作用和考慮:觸發頁面默認行為:通過模擬點擊整個頁面的body,可以觸發瀏覽器或頁面上綁定的一些默認點擊處理邏輯。這可能包括關閉某些彈出層、菜單或者重置焦點等交互效果。解決特定場景問題:在您提供的Vue代碼片段中,提到是因為列表使用了懶加載機制導致原本的關閉方法(假設為doClose)未能正常工作。在這種情況下,直接觸發document.body.click()可能是一種變通方法,用來間接觸發表單、對話框或其他組件的關閉邏輯,這些邏輯可能依賴于頁面的點擊事件來觸發。重置狀態或焦點:在一些交互設計中,點擊頁面空白區域常用于重置當前界面狀態或返回到初始焦點位置,比如關閉一個模態窗口后讓頁面背景可交互。兼容性處理:在不同的瀏覽器和環境中,直接調用click()方法可能有兼容性問題,但通常在大多數現代瀏覽器中此操作是被支持的。不過,這種方式更多被視為一種hack手段,因為它繞過了正常的事件觸發流程。需要注意的是,這種做法雖然有時能解決特定問題,但并不總是最佳實踐。它可能會導致不可預知的副作用,比如意外觸發其他監聽在body上的點擊事件。在實際開發中,更推薦明確地管理組件的狀態和事件處理邏輯,盡量避免使用全局性的模擬點擊來控制UI行為。如果doClose方法無效,應該首先檢查并修復其背后的邏輯或監聽機制,而不是依賴于模擬點擊整個頁面body作為解決方案。

你別說還真挺專業的是吧,聽完還是有些收獲的,不過我感覺是其他因素導致的,不讓第一個視頻不會成功,目前我還沒有找到問題關鍵,將來會跟新吧(如果有時間調研一下)

補充一下:

不過我擔心確實點擊事件綁在body上不太好,所以我在頁面上單獨寫了一個用不到的DIV標簽:

<div id="qwer" />

然后使用document.getElementById("qwer").click(),把事件綁在這個上面依舊有效,可以達到關閉el-popover的效果

不過按照通義靈碼上講到的,我這算不算是一種hack行為呢?

還有就是請問視頻1為什么不用添加document.body.click()這種寫法doClose()就生效呢?

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

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

相關文章

Day 5:2785. 將字符串中的元音字母排序

Leetcode 2785. 將字符串中的元音字母排序 給你一個下標從 0 開始的字符串 s &#xff0c;將 s 中的元素重新 排列 得到新的字符串 t &#xff0c;它滿足&#xff1a; 所有輔音字母都在原來的位置上。更正式的&#xff0c;如果滿足 0 < i < s.length 的下標 i 處的 s[i] …

【第5章】SpringBoot整合Druid

文章目錄 前言一、啟動器二、配置1.JDBC 配置2.連接池配置3. 監控配置 三、配置多數據源1. 添加配置2. 創建數據源 四、配置 Filter1. 配置Filter2. 可配置的Filter 五、獲取 Druid 的監控數據六、案例1. 問題2. 引入庫3. 配置4. 配置類5. 測試類6. 測試結果 七、案例 ( 推薦 )…

理解磁盤分區與管理:U啟、PE、DiskGenius、MBR與GUID

目錄 U啟和PE的區別: U啟(U盤啟動): PE(預安裝環境)&#xff1a; 在DiskGenius中分區完成之后是否還需要格式化&#xff1a; 1.建立文件系統&#xff1a; 2.清除數據&#xff1a; 3.檢查并修復分區&#xff1a; 分區表格式中&#xff0c;MBR和GUID的區別&#xff1a; 1…

移動端開發 筆記01

目錄 01 移動端的概述 02 移動端的視口標簽 03 開發中的二倍圖 04 流式布局 05 彈性盒子布局 01 移動端的概述 移動端包括:手機 平板 便攜式設備 目前主流的移動端開發: 安卓設備 IOS設備 只要移動端支持瀏覽器 那么就可以使用瀏覽器開發移動端項目 開發移動端 使用…

怎么看外國的短視頻:四川鑫悅里文化傳媒有限公司

怎么看外國的短視頻&#xff1a;跨文化視角下的觀察與思考 隨著全球化進程的加速和網絡技術的飛速發展&#xff0c;外國短視頻逐漸走進了我們的視野。這些來自不同文化背景、語言體系和審美觀念的短視頻作品&#xff0c;為我們打開了一扇了解世界的窗口。然而&#xff0c;如何…

golang中的md5、sha256數據加密文件md5/sha256值計算步驟和運行內存圖解

在go語言中對數據計算一個md5&#xff0c;或sha256和其他語言 如java, php中的使用方式稍有不同&#xff0c; 那就是要加密的數據必須通過流的形式寫入到你創建的Hash對象中。 Hash數據加密步驟 1. 先使用對應的加密算法包中的New函數創建一個Hash對象&#xff0c;(這個也就是…

leetCode. 85. 最大矩形

leetCode. 85. 最大矩形 部分參考上一題鏈接 leetCode.84. 柱狀圖中最大的矩形 此題思路 代碼 class Solution { public:int largestRectangleArea( vector<int>& h ) {int n h.size();vector<int> left( n ), right( n );stack<int> st;// 求每個矩形…

vue/uniapp 企業微信H5使用JS-SDK

企業微信H5需要我們使用一些SDK方法如獲取外部聯系人userid 獲取當前外部聯系人userid 使用SDK前提是如何通過config接口注入權限驗證配置 使用說明 - 接口文檔 - 企業微信開發者中心 當前項目是vue項目&#xff0c;不好直接使用 引入JS文件&#xff0c;但我們可以安裝依賴…

使用nexus搭建的docker私庫,定期清理無用的鏡像,徹底釋放磁盤空間

一、背景 我們使用nexus搭建了docker鏡像&#xff0c;隨著推送的鏡像數量越來越多&#xff0c;導致nexus服務器的磁盤空間不夠用了。于是&#xff0c;我們急需先手動刪除一些過期的鏡像&#xff0c;可發現磁盤空間并沒有釋放。 那么&#xff0c;如何才能徹底釋放掉呢&#xff…

FreeRTOS學習 -- 任務 API 函數

函數 uxTaskPriorityGet() 此函數用來查詢指定任務的優先級&#xff0c;要使用此函數的話宏 INCLUDE_uxTaskPriorityGet 應該定義為 1。 函數 vTaskPrioritySet() 此函數用于改變某一個任務的任務優先級&#xff0c;要 使 用 此 函 數 的 話 宏 INCLUDE_vTaskPrioritySet 應…

一維數組操作(GOC常考類型)答案

第1題 宇航局招聘 時限&#xff1a;1s 空間&#xff1a;256m 宇航局準備招收一批科研人員從事月球探索的航空科研工作。這個職位來了很多應聘者&#xff0c;宇航局對眾多應聘者進行綜合素質考試&#xff0c;最終會選出x名綜合得分排名靠前應聘者。目前考試已經結束了&a…

Golang | Leetcode Golang題解之第102題二叉樹的層序遍歷

題目&#xff1a; 題解&#xff1a; func levelOrder(root *TreeNode) [][]int {ret : [][]int{}if root nil {return ret}q : []*TreeNode{root}for i : 0; len(q) > 0; i {ret append(ret, []int{})p : []*TreeNode{}for j : 0; j < len(q); j {node : q[j]ret[i] …

Java面試精粹:高級問題與解答集錦(一)

Java 面試問題及答案 1. 什么是Java的垃圾回收機制&#xff0c;它如何工作&#xff1f; 答案&#xff1a; Java的垃圾回收機制是一種自動內存管理功能&#xff0c;用于回收不再被應用程序使用的對象所占用的內存。它通過垃圾收集器&#xff08;Garbage Collector&#xff0c;…

js數據類型顯隱式轉換

在JavaScript中&#xff0c;數據類型的轉換可以分為兩種主要類型&#xff1a;顯式類型轉換&#xff08;Explicit Type Conversion&#xff09;和隱式類型轉換&#xff08;Implicit Type Conversion 或 Type Coercion&#xff09;。 顯式類型轉換&#xff08;Explicit Type Con…

React18+TypeScript搭建通用中后臺項目實戰02 整合 antd 和 axios

配置路徑別名 tsconfig.json {"compilerOptions": {"target": "ES2020","useDefineForClassFields": true,"lib": ["ES2020","DOM","DOM.Iterable"],"module": "ESNext&quo…

磁盤分區和掛載

磁盤分區和掛載 一、磁盤 業務層面&#xff1a;滿足一定的需求所是做的特定操作 硬盤是什么以及硬盤的作用 硬盤&#xff1a;計算器的存儲設備&#xff0c;一個或者多個磁性的盤片做成&#xff0c;可以在盤片上進行數據的讀寫 連接方式&#xff1a;內部設備&#xff0c;外…

深度揭秘:藍海創意云渲染農場的五大特色功能

在當今數字化時代&#xff0c;影視制作、效果圖設計等領域對于高質量的渲染需求日益增長。在這個背景下&#xff0c;云渲染平臺成為了行業中不可或缺的一部分&#xff0c;它為用戶提供了高效、靈活的渲染解決方案。藍海創意云渲染農場https://www.vsochina.com/cn/render藍海創…

軟件需求分析和軟件原型開發是一會事情嗎?

軟件需求分析和軟件原型開發是軟件開發過程中的兩個重要環節&#xff0c;它們各自承擔著不同的任務&#xff0c;但又緊密相連&#xff0c;共同影響著軟件項目的成功。下面將詳細解釋這兩個環節的定義、目的以及它們之間的關系。 一、軟件需求分析 定義&#xff1a;軟件需求分析…

C++學習日記 | LAB 6 static library 靜態庫

資料來源&#xff1a;南科大 余仕琪 C/C Program Design LINK&#xff1a;CPP/week06 at main ShiqiYu/CPP GitHub 一、本節內容 本節主要介紹靜態庫和動態庫。 1.1 靜態庫和動態庫的概念 靜態鏈接和靜態庫(也稱為存檔)是鏈接器將所有使用的庫函數復制到可執行文件的結果。靜…

Javascript中的定時器有哪些?他們的區別及用法是什么?

JavaScript 中有幾種常用的定時器函數,它們的區別主要在于執行方式和行為: setTimeout(callback, delay):作用:在指定的延遲時間后執行回調函數一次。用法:通常用于延遲執行某些操作。返回值:一個定時器 ID,可用于取消定時器。setInterval(callback, delay):作用:每隔指定的延…