area.vue 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. <template>
  2. <div class="font-size-15 d-flex align-center color-666">
  3. <span>地&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;区:</span>
  4. <v-menu :close-delay="1" :open-delay="0" v-bind="$attrs" :close-on-content-click="false">
  5. <template v-slot:activator="{ props }">
  6. <div>
  7. <v-chip v-for="k in areaSelect" :key="k.id" class="mr-3" closable label size="small" @click:close="handleAreaClear(k)">{{ k.name }}</v-chip>
  8. <v-btn icon="mdi-plus" v-bind="props" variant="outlined" size="x-small"></v-btn>
  9. </div>
  10. </template>
  11. <AreaSelect :select="select" :currentData="areaSelect" :limit="false" showSelect @handleClick="handleArea"></AreaSelect>
  12. </v-menu>
  13. </div>
  14. </template>
  15. <script setup>
  16. defineOptions({ name: 'search-retrieval-area' })
  17. import { ref, watch } from 'vue'
  18. const emit = defineEmits(['select', 'clear'])
  19. const props = defineProps({
  20. isClear: Boolean
  21. })
  22. const select = ref([])
  23. const areaSelect = ref([])
  24. const handleArea = (list, arr) => {
  25. select.value = list
  26. areaSelect.value = arr
  27. emit('select', list)
  28. }
  29. const handleAreaClear = (k) => {
  30. select.value = select.value.filter(item => item !== k.id)
  31. const index = areaSelect.value.findIndex(item => item.id === k.id)
  32. if (index !== -1) areaSelect.value.splice(index, 1)
  33. emit('select', select.value)
  34. }
  35. watch(
  36. () => props.isClear,
  37. (val) => {
  38. if (!val) return
  39. select.value = []
  40. areaSelect.value = []
  41. emit('clear')
  42. }
  43. )
  44. </script>
  45. <style scoped lang="scss">
  46. </style>