winbox-ui-next
Version:
We Design Vue 2.0: A Vue.js 3 UI Library
103 lines (102 loc) • 3.54 kB
JavaScript
import { defineComponent, computed, resolveComponent, openBlock, createElementBlock, normalizeClass, createBlock, renderSlot, createVNode, createCommentVNode, withDirectives, withCtx, createElementVNode, vShow } from "vue";
import { getPrefixCls } from "../_utils/global-config.js";
import Empty from "../empty/index.js";
import Spin from "../spin/index.js";
import Scrollbar from "../scrollbar/index.js";
import { useComponentRef } from "../_hooks/use-component-ref.js";
import _export_sfc from "../_virtual/plugin-vue_export-helper";
const _sfc_main = defineComponent({
name: "SelectDropdown",
components: {
Scrollbar,
Empty,
Spin
},
props: {
loading: Boolean,
empty: Boolean,
virtualList: Boolean,
bottomOffset: {
type: Number,
default: 0
},
onScroll: {
type: [Function, Array]
},
onReachBottom: {
type: [Function, Array]
}
},
emits: ["scroll", "reachBottom"],
setup(props, { emit, slots }) {
const prefixCls = getPrefixCls("select-dropdown");
const { componentRef: wrapperComRef, elementRef: wrapperRef } = useComponentRef("containerRef");
const handleScroll = (e) => {
const { scrollTop, scrollHeight, offsetHeight } = e.target;
const bottom = scrollHeight - (scrollTop + offsetHeight);
if (bottom <= props.bottomOffset) {
emit("reachBottom", e);
}
emit("scroll", e);
};
const cls = computed(() => [
prefixCls,
{
[`${prefixCls}-has-footer`]: Boolean(slots.footer)
}
]);
return {
prefixCls,
cls,
wrapperRef,
wrapperComRef,
handleScroll
};
}
});
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_spin = resolveComponent("spin");
const _component_empty = resolveComponent("empty");
const _component_Scrollbar = resolveComponent("Scrollbar");
return openBlock(), createElementBlock("div", {
class: normalizeClass(_ctx.cls)
}, [
_ctx.loading ? (openBlock(), createBlock(_component_spin, {
key: 0,
class: normalizeClass(`${_ctx.prefixCls}-loading`)
}, null, 8, ["class"])) : _ctx.empty ? (openBlock(), createElementBlock("div", {
key: 1,
class: normalizeClass(`${_ctx.prefixCls}-empty`)
}, [
renderSlot(_ctx.$slots, "empty", {}, () => [
createVNode(_component_empty)
])
], 2)) : createCommentVNode("v-if", true),
_ctx.virtualList && !_ctx.loading && !_ctx.empty ? renderSlot(_ctx.$slots, "virtual-list", { key: 2 }) : createCommentVNode("v-if", true),
!_ctx.virtualList ? withDirectives((openBlock(), createBlock(_component_Scrollbar, {
key: 3,
ref: "wrapperComRef",
class: normalizeClass(`${_ctx.prefixCls}-list-wrapper`),
onScroll: _ctx.handleScroll
}, {
default: withCtx(() => [
createElementVNode("ul", {
class: normalizeClass(`${_ctx.prefixCls}-list`)
}, [
renderSlot(_ctx.$slots, "default")
], 2)
]),
_: 3
}, 8, ["class", "onScroll"])), [
[vShow, !_ctx.loading && !_ctx.empty]
]) : createCommentVNode("v-if", true),
_ctx.$slots.footer && !_ctx.empty ? (openBlock(), createElementBlock("div", {
key: 4,
class: normalizeClass(`${_ctx.prefixCls}-footer`)
}, [
renderSlot(_ctx.$slots, "footer")
], 2)) : createCommentVNode("v-if", true)
], 2);
}
var SelectDropdown = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
export { SelectDropdown as default };