select-meeting-tpl-page.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <template>
  2. <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width" :z-index="1002">
  3. <div class="ov-hd">
  4. <el-row :gutter="30">
  5. <template v-for="(item, index) in list" :key="index">
  6. <el-col :span="4">
  7. <div class="pd-10 w-160 c-s-p item-hover mb-30" @click="clickItem(item)" :class="{ checked: checkedid === item.id }">
  8. <div class="h-180 bg-#ccc bg-img-item_view" :style="{ backgroundImage: 'url('+ item?.img +')' }"></div>
  9. <div class="f-s-14 pd2-10-0 btm-text">{{ item?.label }}</div>
  10. </div>
  11. </el-col>
  12. </template>
  13. </el-row>
  14. </div>
  15. <template #footer>
  16. <div class="d-flex a-c j-ed">
  17. <el-button @click="cancel">取消</el-button>
  18. <el-button @click="save" type="primary">保存</el-button>
  19. </div>
  20. </template>
  21. </vxe-modal>
  22. </template>
  23. <script setup name="lmmeeting-meeting-add" lang="ts">
  24. import { cloneDeep } from 'lodash';
  25. import { onMounted, reactive, ref, watch } from 'vue';
  26. import { useRouter } from 'vue-router';
  27. // 需要添加以下导入
  28. import { propTypes } from '@/utils/propTypes';
  29. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  30. const props = defineProps({
  31. show: propTypes.bool.def(false),
  32. info: propTypes.array.def([]),
  33. dict: propTypes.object.def({}),
  34. width: propTypes.number.def(1100),
  35. title: propTypes.string.def('选择跳转页面'),
  36. list: propTypes.any.def([]),
  37. pageId: propTypes.string.def('')
  38. });
  39. const dialogVisible = ref(false);
  40. const emit = defineEmits(['update:show', 'close', 'success', 'update:info']);
  41. const close = () => {
  42. emit('update:show', false);
  43. emit('close', false);
  44. };
  45. const checkedid = ref(props.pageId || '');
  46. const formRef = ref();
  47. const cancel = () => {
  48. emit('update:show', false);
  49. emit('close', false);
  50. };
  51. const save = () => {
  52. console.log('----');
  53. emit('success', checkedid.value);
  54. emit('update:show', false);
  55. };
  56. const clickItem = (item: any) => {
  57. checkedid.value = item.id || '';
  58. };
  59. onMounted(() => {});
  60. watch(
  61. () => props.show,
  62. (val) => {
  63. dialogVisible.value = val;
  64. },
  65. { immediate: true }
  66. );
  67. watch(
  68. () => props.pageId,
  69. (val) => {
  70. checkedid.value = val || '';
  71. },
  72. { immediate: true }
  73. );
  74. </script>
  75. <style scoped lang="scss">
  76. .bg-img-item_view {
  77. background-size: cover;
  78. background-position: center top;
  79. border: 1px solid transparent;
  80. }
  81. .item-hover {
  82. cursor: pointer;
  83. &:hover {
  84. background-color: rgba(#2A6D52, .3);
  85. .bg-img-item_view {
  86. border-color: var(--el-color-primary);
  87. }
  88. .btm-text {
  89. color: var(--el-color-primary);
  90. }
  91. }
  92. &.checked {
  93. background-color: rgba(#2A6D52, .3);
  94. .bg-img-item_view {
  95. border-color: var(--el-color-primary);
  96. }
  97. .btm-text {
  98. font-weight: 600;
  99. color: var(--el-color-primary);
  100. }
  101. }
  102. }
  103. </style>