SkuTableSelect.vue 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 :label="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="w-30px h-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. {{ 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. defineOptions({ name: 'SkuTableSelect' })
  39. const props = defineProps({
  40. spuId: propTypes.number.def(null)
  41. })
  42. const message = useMessage() // 消息弹窗
  43. const list = ref<any[]>([]) // 列表的数据
  44. const loading = ref(false) // 列表的加载中
  45. const dialogVisible = ref(false) // 弹窗的是否展示
  46. const selectedSkuId = ref() // 选中的商品 spuId
  47. /** 选中时触发 */
  48. const handleSelected = (row: ProductSpuApi.Sku) => {
  49. emits('change', row)
  50. // 关闭弹窗
  51. dialogVisible.value = false
  52. selectedSkuId.value = undefined
  53. }
  54. // 确认选择时的触发事件
  55. const emits = defineEmits<{
  56. (e: 'change', spu: ProductSpuApi.Sku): void
  57. }>()
  58. /** 打开弹窗 */
  59. const open = () => {
  60. dialogVisible.value = true
  61. }
  62. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  63. /** 查询列表 */
  64. const getSpuDetail = async () => {
  65. loading.value = true
  66. try {
  67. const spu = await ProductSpuApi.getSpu(props.spuId)
  68. list.value = spu.skus
  69. } finally {
  70. loading.value = false
  71. }
  72. }
  73. /** 初始化 **/
  74. onMounted(async () => {})
  75. watch(
  76. () => props.spuId,
  77. () => {
  78. if (!props.spuId) {
  79. return
  80. }
  81. getSpuDetail()
  82. }
  83. )
  84. </script>