SchoolTable.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <template>
  2. <el-tag
  3. type="primary"
  4. size="large"
  5. effect="plain"
  6. v-if="!tableData.length && !onlyRead"
  7. @click="onAddItem(0)"
  8. >增加一行</el-tag
  9. >
  10. <el-table
  11. class="detail-table"
  12. :header-cell-style="{
  13. background: '#F2F4F8',
  14. color: '#000000'
  15. }"
  16. :data="tableData"
  17. v-else
  18. >
  19. <el-table-column prop="major" label="专业">
  20. <template #default="scope">
  21. <el-input v-model="scope.row.major" v-if="scope.row.isEdit" />
  22. <span v-else>{{ scope.row.major }}</span>
  23. </template>
  24. </el-table-column>
  25. <el-table-column prop="byxx" label="毕业学校">
  26. <template #default="scope">
  27. <el-input v-model="scope.row.byxx" v-if="scope.row.isEdit" />
  28. <span v-else>{{ scope.row.byxx }}</span>
  29. </template>
  30. </el-table-column>
  31. <el-table-column prop="bysj" label="毕业时间">
  32. <template #default="scope">
  33. <el-date-picker
  34. v-model="scope.row.bysj"
  35. type="date"
  36. value-format="YYYY-MM-DD"
  37. v-if="scope.row.isEdit"
  38. />
  39. <span v-else>{{ scope.row.bysj }}</span>
  40. </template>
  41. </el-table-column>
  42. <el-table-column prop="xl" label="学历">
  43. <template #default="scope">
  44. <el-input v-model="scope.row.xl" v-if="scope.row.isEdit" />
  45. <span v-else>{{ scope.row.xl }}</span>
  46. </template>
  47. </el-table-column>
  48. <el-table-column prop="filePath" label="附件地址">
  49. <template #default="scope">
  50. <el-input v-model="scope.row.filePath" v-if="scope.row.isEdit" />
  51. <span v-else>{{ scope.row.filePath }}</span>
  52. </template>
  53. </el-table-column>
  54. <el-table-column fixed="right" label="操作" width="140">
  55. <template #default="scope">
  56. <el-button
  57. link
  58. type="primary"
  59. size="small"
  60. @click="onSaveItem(scope.$index)"
  61. v-if="scope.row.isEdit"
  62. >
  63. 保存
  64. </el-button>
  65. <el-button link type="primary" size="small" @click="onEditItem(scope.$index)" v-else>
  66. 编辑
  67. </el-button>
  68. <el-button
  69. v-if="tableData.length > 1"
  70. link
  71. type="primary"
  72. size="small"
  73. @click="deleteRow(scope.$index)"
  74. >
  75. 删除
  76. </el-button>
  77. <el-button
  78. v-if="scope.$index < 4 && tableData.length < 5"
  79. link
  80. type="primary"
  81. size="small"
  82. @click="onAddItem(scope.$index)"
  83. >
  84. 新增
  85. </el-button>
  86. </template>
  87. </el-table-column>
  88. </el-table>
  89. </template>
  90. <script lang="ts" setup>
  91. /**
  92. * @description 学习经历
  93. */
  94. interface ITable {
  95. id?: string
  96. userId?: string
  97. major?: string // 专业
  98. byxx?: string // 毕业学校
  99. bysj?: string // 毕业时间
  100. xl?: string // 学历
  101. filePath?: string // 附件地址
  102. isEdit?: boolean // 是否可编辑
  103. }
  104. const tableData = ref<ITable[]>([])
  105. const $emit = defineEmits<{
  106. (e: 'onSave', v: any): void
  107. }>()
  108. interface IProps {
  109. defaultData: any[]
  110. onlyRead?: boolean
  111. }
  112. const props = defineProps<IProps>()
  113. const { defaultData, onlyRead } = props
  114. onMounted(() => {
  115. if (defaultData && defaultData.length) {
  116. tableData.value = defaultData.map((item: any) => {
  117. return {
  118. ...item,
  119. isEdit: false
  120. }
  121. })
  122. }
  123. })
  124. // 新增行
  125. const onAddItem = (index: number) => {
  126. tableData.value.splice(index - 1, 0, {
  127. major: '',
  128. byxx: '',
  129. bysj: '',
  130. xl: '',
  131. filePath: '',
  132. isEdit: true
  133. })
  134. }
  135. // 保存行
  136. const onSaveItem = (index: number) => {
  137. tableData.value[index].isEdit = false
  138. const changeData = tableData.value.map((item: any) => {
  139. delete item.isEdit
  140. return item
  141. })
  142. $emit('onSave', changeData)
  143. }
  144. // 编辑行
  145. const onEditItem = (index: number) => {
  146. tableData.value[index].isEdit = true
  147. }
  148. // 删除
  149. const deleteRow = (index: number) => {
  150. tableData.value.splice(index, 1)
  151. }
  152. </script>
  153. <style scoped lang="scss">
  154. .detail-table {
  155. width: 100%;
  156. min-height: 100px;
  157. }
  158. </style>