亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue3.0如何實現下拉菜單的封裝

發布時間:2021-09-24 10:46:26 來源:億速云 閱讀:440 作者:小新 欄目:開發技術

小編給大家分享一下vue3.0如何實現下拉菜單的封裝,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

先看下我們要實現的效果

vue3.0如何實現下拉菜單的封裝

很常見的展開顯示菜單項的內容,在vue3.0里面怎么開發,這里樣式我們用的是bootstrap的默認樣式

思路一:

<DropDown :title="'退出'" :list="menuLists" />

思路二:

<drop-down :title="'退出'">
   <drop-dowm-item>新建文章</drop-down-item>
   <drop-dowm-item>編輯文章</drop-down-item>
   <drop-dowm-item>個人信息</drop-down-item>
</drop-down>

兩種思路都行,相比較而言,第二種思路比較清晰,使用的時候知道具體的層次,也是elementUI組件開發的模式.
現在就第二種組件開發思路進行分析

DropDown.ts

<template>
  <div class="dropdown" ref="dropDownRef">
    <a
      @click.prevent="toggleOpen"
      class="btn btn-secondary dropdown-toggle"
      href="#" rel="external nofollow" 
    >
      {{ title }}
    </a>
    <div class="dropdown-menu" : v-show="isOpen">
      <slot></slot>
    </div>
  </div>
</template>

js部分

<script lang="ts">
import { defineComponent, ref, onMounted, onUnmounted, watch } from "vue";
import useClickOutside from "../hooks/useClickOutside";
export default defineComponent({
  name: "DropDown",
  props: {
    title: {
      type: String,
      required: true,
    },
  },

  setup(context) {
    const isOpen = ref(false);
    //vue3.0獲取dom對象的引用
    const dropDownRef = ref<null | HTMLElement>(null);
    const toggleOpen = () => {
      isOpen.value = !isOpen.value;
    };
    const handleClick = (e: MouseEvent) => {
      console.log(e.target, "e");
      if (dropDownRef.value) {
        console.log(dropDownRef.value);
        if (
        //contains判斷節點是否包含節點
          !dropDownRef.value.contains(e.target as HTMLElement) &&
          isOpen.value
        ) {
          isOpen.value = false;
        }
      }
    };
    onMounted(() => {
    //注冊全局的點擊事件
      document.addEventListener("click", handleClick);
    });
    onUnmounted(() => {
    //解綁
      document.removeEventListener("click", handleClick);
    }); 
    return {
      isOpen,
      toggleOpen,
      dropDownRef,
    };
  },
});
</script>

DropDownItem.ts

<template>
  <li class="dropdowm-option" :class="{ 'is-disabled': disabled }">
    <slot></slot>
  </li>
</template>
<style scoped>

/* 此處是插槽需要穿透 */
.dropdowm-option.is-disabled >>> * {
  color: #6c757d;
  pointer-events: none;
  background-color: transparent;
}
</style>
<script lang="ts">
import { defineComponent } from "vue";

export default defineComponent({
  props: {
    disabled: {
      type: Boolean,
      default: false,
    },
  },
  setup() {
    return {};
  },
});
</script>

到這里這個組件就完成了。但是…我們可以看到點擊整個document隱藏這個事件與整個組件的關聯不大,因此我們可以抽取成一個hooks

useClickOutside.ts

import { ref, onMounted, onUnmounted,Ref } from 'vue'
const useClickOutside = (elementRef:Ref<null | HTMLElement>) => {
    const isClickOutside = ref(false)
    const handler = (e: MouseEvent) => {
        console.log(elementRef.value);
        if (elementRef.value) {
            if (elementRef.value.contains(e.target as HTMLElement)) {
                isClickOutside.value = false
            } else {
                isClickOutside.value = true
            }
        }
    }
    onMounted(() => {
      document.addEventListener("click", handler);
    });
    onUnmounted(() => {
      document.removeEventListener("click", handler);
    });
    return isClickOutside
}

export default useClickOutside

然后再改寫我們的DropDown.ts組件

//刪掉之前已有的事件邏輯
<script lang="ts">
... 
 const isClickOutside = useClickOutside(dropDownRef);
    /* console.log(isClickOutside.value, "isClickOutside"); */
    //引入監聽方法,數據變化時我們改變isOpen的值為false
    watch(isClickOutside, (newValue) => {
      if (isOpen.value && isClickOutside.value) {
        isOpen.value = false;
      }
    });
 ...
</script>

看完了這篇文章,相信你對“vue3.0如何實現下拉菜單的封裝”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南召县| 吴桥县| 淮南市| 乐清市| 西华县| 保德县| 祥云县| 东乡| 永春县| 余庆县| 怀远县| 隆回县| 夏河县| 叶城县| 定州市| 东丽区| 诸城市| 荣昌县| 南江县| 南康市| 浏阳市| 玉山县| 新和县| 鄱阳县| 手机| 南召县| 平顺县| 咸阳市| 四会市| 苏尼特右旗| 临湘市| 云林县| 新巴尔虎右旗| 昭苏县| 辉南县| 江西省| 永善县| 嘉义市| 木里| 措美县| 肇东市|