mx-condition-dropdown.vue 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. <template>
  2. <scroll-view :scroll-x="x" :style="{zIndex: z}">
  3. <view class="bg-white h-[44px] text-xs text-main px-30" :class="layout">
  4. <mx-condition-dropdown-item v-for="c in conditions" :condition="c" :use-value-as-title="useValueAsTitle"/>
  5. </view>
  6. </scroll-view>
  7. <mx-condition-dropdown-popup ref="popup"/>
  8. <uv-line ref="bottom" :style="{zIndex: z}"/>
  9. </template>
  10. <script setup>
  11. /*TODO:暂不要给mx-condition-dropdown套uv-form,会导致zIndex失效,待改善*/
  12. import {ref, getCurrentInstance, onMounted} from 'vue';
  13. import {createPropDefine} from "@/utils";
  14. import {useInjectSearchModel} from "@/components/mx-condition/useSearchModelInjection";
  15. import MxConditionDropdownItem from "@/components/mx-condition-dropdown/mx-condition-dropdown-item.vue";
  16. import MxConditionDropdownPopup from "@/components/mx-condition-dropdown/mx-condition-dropdown-popup.vue";
  17. import {useProvideConditionDropdownPopup} from "@/components/mx-condition-dropdown/useConditionDropdownPopupInjection";
  18. import {findAncestorComponentByName} from "@/utils/uni-helper";
  19. const props = defineProps({
  20. border: createPropDefine(false, Boolean),
  21. layout: createPropDefine('fx-row fx-bet-cen'),
  22. useValueAsTitle: createPropDefine(false, Boolean),
  23. x: createPropDefine(false, Boolean),
  24. z: createPropDefine(20000, Number) // 防止被弹层遮挡
  25. })
  26. const bottom = ref(null) // 最底部的元素,用于定位弹层
  27. const popup = ref(null) // 弹层元素,将贴合bottom往下弹出
  28. // relative容器元素,确定弹出层的相对位置 // TODO:理论上这里应该使用外部的swiper
  29. const container = ref(null)
  30. const {conditions} = useInjectSearchModel()
  31. useProvideConditionDropdownPopup(popup, bottom, container)
  32. onMounted(() => {
  33. const instance = getCurrentInstance()
  34. const swiper = findAncestorComponentByName(instance, 'Swiper')
  35. container.value = swiper || document.getElementById('app')
  36. })
  37. defineExpose({terminate: () => popup.value.close(), getShow: () => popup.value.show})
  38. </script>
  39. <style scoped>
  40. </style>