Vue下拉组件的写法
首先组件要足够语义化,就是开发者尽量少看文档描述也可以看出怎么用,以下是结构然后编写dropdown-item组件,此处的disabled控制item是否可选,里面的选项通过插槽的形式获取<template><liclass="dropdown-option":class="{'is-disabled': disabled}"><slot></slot&g
·
首先组件要足够语义化,就是开发者尽量少看文档描述也可以看出怎么用,
以下是结构
然后编写dropdown-item组件,此处的disabled控制item是否可选,里面的选项通过插槽的形式获取
<template>
<li
class="dropdown-option"
:class="{'is-disabled': disabled}"
>
<slot></slot>
</li>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
props: {
disabled: {
type: Boolean,
default: false
}
}
})
</script>
<style>
.dropdown-option.is-disabled * {
color: #6c757d;
pointer-events: none;
background-color: transparent;
}
</style>
编写dropdown组件
<template>
<div class="dropdown" ref="dropdownRef">
<a href="#" class="btn btn-outline-light my-2 dropdown-toggle" @click.prevent="toggleOpen">
{{title}}
</a>
<ul class="dropdown-menu" :style="{display: 'block'}" v-if="isOpen">
<slot></slot>
</ul>
</div>
</template>
<script lang="ts">
import { defineComponent, ref, watch } from 'vue'
import useClickOutside from '../hooks/useClickOutside'
export default defineComponent({
name: 'Dropdown',
props: {
title: {
type: String,
required: true
}
},
setup() {
const isOpen = ref(false)
const dropdownRef = ref<null | HTMLElement>(null)
const toggleOpen = () => {
isOpen.value = !isOpen.value
}
const isClickOutside = useClickOutside(dropdownRef)
watch(isClickOutside, () => {
if (isOpen.value && isClickOutside.value) {
isOpen.value = false
}
})
return {
isOpen,
toggleOpen,
dropdownRef
}
}
})
</script>
使用到控制展开收起下拉菜单的函数useClickOutside
该函数可以判断点击是否在元素内部
import { ref, onMounted, onUnmounted, Ref } from 'vue'
const useClickOutside = (elementRef: Ref<null | HTMLElement>) => {
const isClickOutside = ref(false)
const handler = (e: MouseEvent) => {
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 :title="`你好 ${user.nickName}`">
<dropdown-item><a href="#" class="dropdown-item">新建文章</a></dropdown-item>
<dropdown-item><a href="#" class="dropdown-item">我的专栏</a></dropdown-item>
<dropdown-item disabled><a href="#" class="dropdown-item">编辑资料</a></dropdown-item>
<dropdown-item><a href="#" class="dropdown-item">退出登陆</a></dropdown-item>
</dropdown>
更多推荐
已为社区贡献1条内容
所有评论(0)