SkuTableSelect.vue 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <template>
  2. <Dialog v-model="dialogVisible" :appendToBody="true" title="选择规格" width="700">
  3. <el-table v-loading="loading" :data="list" show-overflow-tooltip>
  4. <el-table-column label="#" width="55">
  5. <template #default="{ row }">
  6. <el-radio :value="row.id" v-model="selectedSkuId" @change="handleSelected(row)"
  7. >&nbsp;
  8. </el-radio>
  9. </template>
  10. </el-table-column>
  11. <el-table-column label="图片" min-width="80">
  12. <template #default="{ row }">
  13. <el-image
  14. :src="row.picUrl"
  15. class="h-30px w-30px"
  16. :preview-src-list="[row.picUrl]"
  17. preview-teleported
  18. />
  19. </template>
  20. </el-table-column>
  21. <el-table-column label="规格" align="center" min-width="80">
  22. <template #default="{ row }">
  23. {{ row.properties?.map((p) => p.valueName)?.join(' ') }}
  24. </template>
  25. </el-table-column>
  26. <el-table-column align="center" label="销售价(元)" min-width="80">
  27. <template #default="{ row }">
  28. {{ fenToYuan(row.price) }}
  29. </template>
  30. </el-table-column>
  31. </el-table>
  32. </Dialog>
  33. </template>
  34. <script lang="ts" setup>
  35. import { ElTable } from 'element-plus'
  36. import * as ProductSpuApi from '@/api/mall/product/spu'
  37. import { propTypes } from '@/utils/propTypes'
  38. import { fenToYuan } from '@/utils'
  39. defineOptions({ name: 'SkuTableSelect' })
  40. const props = defineProps({
  41. spuId: propTypes.number.def(null)
  42. })
  43. const message = useMessage() // 消息弹窗
  44. const list = ref<any[]>([]) // 列表的数据
  45. const loading = ref(false) // 列表的加载中
  46. const dialogVisible = ref(false) // 弹窗的是否展示
  47. const selectedSkuId = ref() // 选中的商品 spuId
  48. /** 选中时触发 */
  49. const handleSelected = (row: ProductSpuApi.Sku) => {
  50. emits('change', row)
  51. // 关闭弹窗
  52. dialogVisible.value = false
  53. selectedSkuId.value = undefined
  54. }
  55. // 确认选择时的触发事件
  56. const emits = defineEmits<{
  57. (e: 'change', spu: ProductSpuApi.Sku): void
  58. }>()
  59. /** 打开弹窗 */
  60. const open = () => {
  61. dialogVisible.value = true
  62. }
  63. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  64. /** 查询列表 */
  65. const getSpuDetail = async () => {
  66. loading.value = true
  67. try {
  68. const spu = await ProductSpuApi.getSpu(props.spuId)
  69. list.value = spu.skus
  70. } finally {
  71. loading.value = false
  72. }
  73. }
  74. /** 初始化 **/
  75. onMounted(async () => {})
  76. watch(
  77. () => props.spuId,
  78. () => {
  79. if (!props.spuId) {
  80. return
  81. }
  82. getSpuDetail()
  83. }
  84. )
  85. </script>