c350cdce81c9fb6e5d0dc88cacf8fa480f24e0b2.svn-base 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. <template>
  2. <a-card title="即时保存示例" :bordered="false">
  3. <!--
  4. 【即时保存大体思路】:
  5. 1. JVxeTable 上必须加 keep-source 属性
  6. 2. 监听 edit-closed事件,这个事件是在编辑完成后触发
  7. 3. 在这个事件里面判断数据是否更改,如果更改了就调用接口进行保存操作
  8. -->
  9. <j-vxe-table
  10. toolbar
  11. :toolbarConfig="toolbarConfig"
  12. row-number
  13. row-selection
  14. keep-source
  15. async-remove
  16. :height="340"
  17. :loading="loading"
  18. :columns="columns"
  19. :dataSource="dataSource"
  20. :pagination="pagination"
  21. @save="handleTableSave"
  22. @remove="handleTableRemove"
  23. @edit-closed="handleEditClosed"
  24. @pageChange="handlePageChange"
  25. @selectRowChange="handleSelectRowChange"
  26. />
  27. </a-card>
  28. </template>
  29. <script>
  30. import { getAction, postAction, putAction } from '@api/manage'
  31. import { JVXETypes } from '@/components/jeecg/JVxeTable'
  32. // 即时保存示例
  33. export default {
  34. name: 'JSBCDemo',
  35. data() {
  36. return {
  37. // 工具栏的按钮配置
  38. toolbarConfig: {
  39. // add 新增按钮;remove 删除按钮;clearSelection 清空选择按钮
  40. btn: ['add', 'save', 'remove', 'clearSelection']
  41. },
  42. // 是否正在加载
  43. loading: false,
  44. // 分页器参数
  45. pagination: {
  46. // 当前页码
  47. current: 1,
  48. // 每页的条数
  49. pageSize: 200,
  50. // 可切换的条数
  51. pageSizeOptions: ['10', '20', '30', '100', '200'],
  52. // 数据总数(目前并不知道真实的总数,所以先填写0,在后台查出来后再赋值)
  53. total: 0,
  54. },
  55. // 选择的行
  56. selectedRows: [],
  57. // 数据源,控制表格的数据
  58. dataSource: [],
  59. // 列配置,控制表格显示的列
  60. columns: [
  61. {key: 'num', title: '序号', width: '80px'},
  62. {
  63. // 字段key,跟后台数据的字段名匹配
  64. key: 'ship_name',
  65. // 列的标题
  66. title: '船名',
  67. // 列的宽度
  68. width: '180px',
  69. // 如果加上了该属性,就代表当前单元格是可编辑的,type就是表单的类型,input就是简单的输入框
  70. type: JVXETypes.input
  71. },
  72. {key: 'call', title: '呼叫', width: '80px', type: JVXETypes.input},
  73. {key: 'len', title: '长', width: '80px', type: JVXETypes.input},
  74. {key: 'ton', title: '吨', width: '120px', defaultValue: 233, type: JVXETypes.input},
  75. {key: 'payer', title: '付款方', width: '120px', defaultValue: '张三', type: JVXETypes.input},
  76. {key: 'count', title: '数', width: '40px'},
  77. {
  78. key: 'company',
  79. title: '公司',
  80. // 最小宽度,与宽度不同的是,这个不是固定的宽度,如果表格有多余的空间,会平均分配给设置了 minWidth 的列
  81. // 如果要做占满表格的列可以这么写
  82. minWidth: '180px',
  83. type: JVXETypes.input
  84. },
  85. {key: 'trend', title: '动向', width: '120px', type: JVXETypes.input},
  86. ],
  87. // 查询url地址
  88. url: {
  89. getData: '/mock/vxe/getData',
  90. // 模拟保存单行数据(即时保存)
  91. saveRow: '/mock/vxe/immediateSaveRow',
  92. // 模拟保存整个表格的数据
  93. saveAll: '/mock/vxe/immediateSaveAll',
  94. },
  95. }
  96. },
  97. created() {
  98. this.loadData()
  99. },
  100. methods: {
  101. // 加载数据
  102. loadData() {
  103. // 封装查询条件
  104. let formData = {
  105. pageNo: this.pagination.current,
  106. pageSize: this.pagination.pageSize
  107. }
  108. // 调用查询数据接口
  109. this.loading = true
  110. getAction(this.url.getData, formData).then(res => {
  111. if (res.success) {
  112. // 后台查询回来的 total,数据总数量
  113. this.pagination.total = res.result.total
  114. // 将查询的数据赋值给 dataSource
  115. this.dataSource = res.result.records
  116. // 重置选择
  117. this.selectedRows = []
  118. } else {
  119. this.$error({title: '主表查询失败', content: res.message})
  120. }
  121. }).finally(() => {
  122. // 这里是无论成功或失败都会执行的方法,在这里关闭loading
  123. this.loading = false
  124. })
  125. },
  126. // 【整体保存】点击保存按钮时触发的事件
  127. handleTableSave({$table, target}) {
  128. // 校验整个表格
  129. $table.validate().then((errMap) => {
  130. // 校验通过
  131. if (!errMap) {
  132. // 获取所有数据
  133. let tableData = target.getTableData()
  134. console.log('当前保存的数据是:', tableData)
  135. // 获取新增的数据
  136. let newData = target.getNewData()
  137. console.log('-- 新增的数据:', newData)
  138. // 获取删除的数据
  139. let deleteData = target.getDeleteData()
  140. console.log('-- 删除的数据:', deleteData)
  141. // 【模拟保存】
  142. this.loading = true
  143. postAction(this.url.saveAll, tableData).then(res => {
  144. if (res.success) {
  145. this.$message.success(`保存成功!`)
  146. } else {
  147. this.$message.warn(`保存失败:` + res.message)
  148. }
  149. }).finally(() => {
  150. this.loading = false
  151. })
  152. }
  153. })
  154. },
  155. // 触发单元格删除事件
  156. handleTableRemove(event) {
  157. // 把 event.deleteRows 传给后台进行删除(注意:这里不会传递前端逻辑新增的数据,因为不需要请求后台删除)
  158. console.log('待删除的数据: ', event.deleteRows)
  159. // 也可以只传ID,因为可以根据ID删除
  160. let deleteIds = event.deleteRows.map(row => row.id)
  161. console.log('待删除的数据ids: ', deleteIds)
  162. // 模拟请求后台删除
  163. this.loading = true
  164. window.setTimeout(() => {
  165. this.loading = false
  166. this.$message.success('删除成功')
  167. // 假设后台返回删除成功,必须要调用 confirmRemove() 方法,才会真正在表格里移除(会同时删除选中的逻辑新增的数据)
  168. event.confirmRemove()
  169. }, 1000)
  170. },
  171. // 单元格编辑完成之后触发的事件
  172. handleEditClosed(event) {
  173. let {$table, row, column} = event
  174. let field = column.property
  175. let cellValue = row[field]
  176. // 判断单元格值是否被修改
  177. if ($table.isUpdateByRow(row, field)) {
  178. // 校验当前行
  179. $table.validate(row).then((errMap) => {
  180. // 校验通过
  181. if (!errMap) {
  182. // 【模拟保存】
  183. let hideLoading = this.$message.loading(`正在保存"${column.title}"`, 0)
  184. console.log('即时保存数据:', row)
  185. putAction(this.url.saveRow, row).then(res => {
  186. if (res.success) {
  187. this.$message.success(`"${column.title}"保存成功!`)
  188. // 局部更新单元格为已保存状态
  189. $table.reloadRow(row, null, field)
  190. } else {
  191. this.$message.warn(`"${column.title}"保存失败:` + res.message)
  192. }
  193. }).finally(() => {
  194. hideLoading()
  195. })
  196. }
  197. })
  198. }
  199. },
  200. // 当分页参数变化时触发的事件
  201. handlePageChange(event) {
  202. // 重新赋值
  203. this.pagination.current = event.current
  204. this.pagination.pageSize = event.pageSize
  205. // 查询数据
  206. this.loadData()
  207. },
  208. // 当选择的行变化时触发的事件
  209. handleSelectRowChange(event) {
  210. this.selectedRows = event.selectedRows
  211. },
  212. },
  213. }
  214. </script>
  215. <style scoped>
  216. </style>