欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解使用Vue實現(xiàn)Context-Menu的思考與總結

 更新時間:2019年03月09日 14:31:07   作者:PJHubs  
這篇文章主要介紹了使用Vue實現(xiàn)Context-Menu的思考與總結,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

簡介

先來看最終成果:


操作邏輯為:

  • 點擊 ... 彈出 context-menu;
  • 點擊非 context-menu 區(qū)域,隱藏 context-menu;
  • 點擊 context-menu 中的任何一個選項,隱藏 context-menu;

思考

項目是基于 vux 做的,本想著偷懶直接在 vux 庫翻組件用,但看了一圈下來,居然這么通用的組件在 vuex 中沒有!接著又去翻開源的解決方案,看了幾個庫還算 ok,但此時前端小哥來了,說實現(xiàn)這個菜單不需要用到這么重的東西,直接寫就行了。

當時我的腦海中在思考了把 context-menu 封裝成一個 component ,通過數(shù)據(jù)配置的方式動態(tài)拓展菜單選項。但沒想到前端小哥直接給我干了回來,沒必要進行封裝,這個組件對頁面依賴性太強,就算封裝完了下次也不一定能直接用,PM 的思路又這么清奇。

所以,最后的做法就直接硬上了。

實現(xiàn)

調(diào)整操作邏輯

該頁面是一個通俗意義上的列表展示頁,使用了 vux 的 swipeout 表單組件,給用戶提供了側滑操作,需要把原先寫好的側滑功能刪除。

調(diào)整 UI

在調(diào)整 UI 的過程中我感到了 CSS 滿滿的惡意,當然說是這么說,但實際上還是因為太久沒有用而導致的不夠熟悉。非常費勁的終于調(diào)整了好了新 UI,此時已經(jīng)過去了整整一天了,非常懷念 autoLayout 。

context-mune

在正式開始寫之前,上文已經(jīng)說了我一直在翻開源庫,主要是不懂得如何下手去寫。距離上一次寫 vue 已經(jīng)過去快兩個月了,而且也沒搞清楚如何寫一個組件,所以中間有一段時間浪費在了這上。最后的解決思路讓我感到意外:

<div class="more-menu-wrapper">
 <ul v-show="item.showOption">
  <li>更換分類</li>
  <li>向上移動</li>
  <li>移至頂部</li>
  <li>取消收藏</li>
 </ul>
</div>

沒想到使用無序列表就可以完成了~在 iOS 中,我會在 UITableView 和 UIStackView 中糾結。當然只有這樣是不行的,當又調(diào)整了 UI 后,發(fā)現(xiàn) ... 和 context-menu “融合”在了一起,沒有設計圖中的“懸浮”效果,最后的解決方法是:

.more-wrapper {
 /* ... */
 position: absolute;
 .more-menu-wrapper {
  position: relative;
  /* ... */
 }
}

當繼續(xù)調(diào)整 CSS 時又發(fā)現(xiàn) context-menu 的會被其父組件擋住, context-menu 的顯示范圍會限制于其父組件的顯示高度,最后得知是 overflow 這個屬性在最底層的父組件中設置了 overflow: hidden; ,刪除掉,使其為默認的 visible 即可顯示為 context-menu 高度溢出的效果。

事件綁定

UI 都調(diào)整完后開始綁定事件。因為只是改造 UI,并沒有涉及到多少的新邏輯,所以很快的就寫出了以下代碼:

<ul v-show="item.showOption">
 <li @click="moveItem(item)">更換分類</li>
 <li @click="moveUp(item)">向上移動</li>
 <li @click="setTop(item)">移至頂部</li>
 <li @click="deleteItem(item)">取消收藏</li>
</ul>

context-menu 的顯示依賴 v-show ,當頁面首次拉取到網(wǎng)絡數(shù)據(jù)時, data 中對每個 listData 的 item 新增了 context-menu 顯示隱藏的初始化標志位 item.showOption = false ,且在這四個入口方法中都控制了 item.showOption 的改變:

//...
moveUp(item) {
 item.showOption = false;
 // ...
}
//...

刷新頁面,很愉快的看到了 context-menu 的顯示,但在點擊菜單選項時沒有任何反應!一開始以為是標志位的問題,但看來看去沒有任何問題。

本來想去找前端小哥看一眼,但一直不在工位上,最后問了下同組的前端實習生,他認為是 item.showOption 字段在數(shù)據(jù)更新時沒有加上,導致后續(xù)直接讀取時不存在。

但我其實一直納悶如果 item.showOption 字段數(shù)據(jù)不存在的話,那第一次的頁面渲染實際上是有錯誤的。我們兩個人看了一會也沒發(fā)現(xiàn)具體是哪有問題,最后只能四處尋找前端小哥,沒想到他已經(jīng)被封閉起來做商業(yè)化了......

前端小哥在文件中加上了 debugger 進行調(diào)試,發(fā)現(xiàn)進入到 moveUp 等一類事件時雖然 item.showOption 被修改成功了,一旦出去事件周期外,又被改回去了。

最后發(fā)現(xiàn),問題出在被 冒泡 到了父組件中,調(diào)用了 ... 所綁定的 onMore 事件中,而在 onMore 事件中 item.showOption = true ,所以實際上是執(zhí)行了 context-menu 和 ... 的兩者所綁定的事件。解決的方法是:

<ul v-show="item.showOption">
 <li @click.stop="moveItem(item)">更換分類</li>
 <li @click.stop="moveUp(item)">向上移動</li>
 <li @click.stop="setTop(item)">移至頂部</li>
 <li @click.stop="deleteItem(item)">取消收藏</li>
</ul>

使用 @click.stop 來阻止冒泡事件。解決完問題后,前端小哥還好奇我做 iOS 怎么會不知道冒泡事件的問題,但實際上在 iOS 中跟前端的思路完全是反過來的。iOS 的事件響應鏈是逐級傳遞到子組件中,也就是向下傳遞,而不是像前端中的向上傳遞。所以在遇到這個問題時也就完全沒有往冒泡的方面去思考。

觸摸其它區(qū)域消失 context-menu

在 iOS 中,我會直接封裝出一個帶有 UIWindow 的組件。與 context-menu 有關的所有操作與主 window 沒有任何關系,更別說事件穿透了。所以最終我的做法是多加了一個遮罩層,顯示和隱藏的時機與 context-menu 的時機保持一致。

最后在我拿著最終的成果去找前端小哥復查時,他對這個做法不滿意,還是覺得要使用 outside-click 的做法。也就是使用 js 中的事件代理,通過 e.targe 去判斷。最后找到了可以使用 v-outside-click 進行。關于后續(xù)的細節(jié)就不展開了, v-outside-click 的使用也十分簡潔。

在使用 v-outside-click 這個庫的過程中遇到了一個比較大的問題。v-outside-click 此庫給我的感覺是用于單個組件,而不適用于多個組件。列表中的每一個 cell 都需要帶上一個單獨的 context-menu,如果給每一個 context-menu 都綁上一個單獨的 outside-click 事件,一旦用戶的觸摸范圍不在 context-menu 中,則視圖上的所有 context-menu 都會響應這個 outside-click 事件,列表數(shù)據(jù)一旦多起來,事件響應次數(shù)將線性增長。

這個問題跟前端小哥說過后,他說問題不大,那就這樣吧~接下來的問題就到了怎么在 outside-click 事件中標識出是哪個 context-menu 需要隱藏呢?剛開始就按照了以往的套路,直接使用了如下所示的方式:

<div v-click-outside="onClickOutside(item)">
 <!-- ... -->
</div>

然后開心看到了報錯 Binding value must be a function or an object。提示需要傳入一個方法?!翻了源碼后發(fā)現(xiàn)了這么一段:

function processDirectiveArguments(bindingValue) {
 const isFunction = typeof bindingValue === 'function'
 if (!isFunction && typeof bindingValue !== 'object') {
 throw new Error('v-click-outside: Binding value must be a function or an object')
 }

 // ...
}

回過頭去看之前寫的代碼,沒有問題??!思來想去還是沒弄明白,又去找了前端小哥請求幫忙,經(jīng)過了一番折騰了,他的結論是這個庫應該是有問題的。最后采取的解決方法是:

<div v-click-outside="onClickOutside">
 <p>…</p>
 <!-- 重點 -->
 <div :id="item.metricId" v-show="item.showOption">
  <ul>
   <li>更換分類</li>
   <!-- ... -->
  </ul>
 </div>
</div>
onClickOutside (event, el) {
 let queryInstance = el.querySelector('.more-menu-wrapper')   
 if (queryInstance) {
  let metricId = el.querySelector('.more-menu-wrapper').id;
  if (metricId != "") {
   this.listData.some((item) => {
    if (item.metricId == metricId) {
     item.showOption = false;
     return true;
    }
   });
  }
 } 
}

通過設置 context-menu 的 id 作為標識,然后在 v-outside-click 的指令方法中獲取 id,通過這個 id 去數(shù)據(jù)源中找到對應的 item,從而設置 item.showOption = false 來隱藏 context-menu。

總結

這算是轉大前端完成的第一個功能吧,因為不熟悉導致中間出現(xiàn)了一些好玩的事情。客戶端和前端的開發(fā)流程說大也不大,但要是說沒有是絕對不可能的。在一些小的問題上,沒有踩過坑或者沒有大佬帶一帶,真的會爬不起來或者就棄坑了,說到底其實還是需要多加學習啊!

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • vue?cli2?和?cli3去掉eslint檢查器報錯的解決

    vue?cli2?和?cli3去掉eslint檢查器報錯的解決

    這篇文章主要介紹了vue?cli2?和?cli3去掉eslint檢查器報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 14個Vue中易被攻擊的代碼位置小結

    14個Vue中易被攻擊的代碼位置小結

    在?Vue?框架中,哪些地方容易被攻擊呢?寫代碼的時候要注意什么呢?這篇文章中小編為大家總結了一些常見的容易受到攻擊的地方,希望對大家有所幫助
    2024-02-02
  • vue實現(xiàn)拖動調(diào)整左右兩側容器大小

    vue實現(xiàn)拖動調(diào)整左右兩側容器大小

    這篇文章主要為大家詳細介紹了vue實現(xiàn)拖動調(diào)整左右兩側容器大小,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Vue實現(xiàn)簡單的留言板

    Vue實現(xiàn)簡單的留言板

    這篇文章主要為大家詳細介紹了Vue實現(xiàn)簡單的留言板,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • vue3頁面加載完成后如何獲取寬度、高度

    vue3頁面加載完成后如何獲取寬度、高度

    這篇文章主要介紹了vue3頁面加載完成后如何獲取寬度、高度問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vue前端框架vueuse的useScroll函數(shù)使用源碼分析

    vue前端框架vueuse的useScroll函數(shù)使用源碼分析

    這篇文章主要為大家介紹了vueuse的useScroll函數(shù)源碼分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 解決iview多表頭動態(tài)更改列元素發(fā)生的錯誤的方法

    解決iview多表頭動態(tài)更改列元素發(fā)生的錯誤的方法

    這篇文章主要介紹了解決iview多表頭動態(tài)更改列元素發(fā)生的錯誤的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • vue如何獲取配置代理文件中的api地址值

    vue如何獲取配置代理文件中的api地址值

    這篇文章主要介紹了vue如何獲取配置代理文件中的api地址值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue項目導入字體文件的方法步驟

    Vue項目導入字體文件的方法步驟

    有些時候客戶希望產(chǎn)品使用他們公司要求的字體,這個時候我們需要將客戶提供的字體文件引入到項目中,下面這篇文章主要給大家介紹了關于Vue項目導入字體文件的方法步驟,需要的朋友可以參考下
    2024-03-03
  • vue相同路由跳轉強制刷新該路由組件操作

    vue相同路由跳轉強制刷新該路由組件操作

    這篇文章主要介紹了vue相同路由跳轉強制刷新該路由組件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08

最新評論