batchSelectTable.vue 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. <template>
  2. <!-- 封装表格跨页多选逻辑 -->
  3. <div class="batch-select-table">
  4. <div class="table-box">
  5. <el-table
  6. border height="500px"
  7. v-loading="tableLoading"
  8. ref="tableRef"
  9. :data="tableData"
  10. @select="selectHandle"
  11. @select-all="selectAllHandle"
  12. >
  13. <el-table-column type="selection" min-width="50" align="center"/>
  14. <el-table-column
  15. align="center"
  16. v-for="column in tableColumns"
  17. :key="column.key"
  18. :label="column.label"
  19. :prop="column.key"
  20. :width="column.width"
  21. :show-overflow-tooltip="column.showOverflowTooltip">
  22. <template slot-scope="{row}">
  23. <span v-if="column.key==='Frequency'">{{ getFrequencyTrans(row.Frequency) }}</span>
  24. <span v-else-if="['UniEn','Unit'].includes(column.key)">{{ getUnitTrans(row.Unit) }}</span>
  25. <span v-else>{{ row[column.key] }}</span>
  26. </template>
  27. </el-table-column>
  28. </el-table>
  29. <m-page
  30. style="margin-top:10px"
  31. class="table-page"
  32. v-show="tableParams.total"
  33. :total="tableParams.total"
  34. :pageSize="tableParams.pageSize"
  35. :page_no="tableParams.pageNo"
  36. :pagercount="tableParams.pagerCount"
  37. @handleCurrentChange="pageNumberChange"
  38. />
  39. </div>
  40. <!-- 加入已选指标 -->
  41. <el-button type="primary" @click="handleAddSelectData">{{ $t('EtaBasePage.add_to_selections') }}</el-button>
  42. <div class="select-box" style="align-self: flex-start;">
  43. <el-table
  44. border height="500px"
  45. ref="selectRef"
  46. :data="selectData"
  47. >
  48. <el-table-column
  49. align="center"
  50. :label="tableColumns[0].label"
  51. :prop="tableColumns[0].key"
  52. />
  53. <el-table-column width="50px" align="center" v-if="selectData.length">
  54. <template slot="header" slot-scope="scope">
  55. <img @click="handleDelSelect(_,'all')" style="width:15px;height:15px;cursor: pointer;" src="~@/assets/img/ai_m/delete.png" alt="">
  56. </template>
  57. <template slot-scope="{row,index}">
  58. <img @click="handleDelSelect(index,'')" style="width:15px;height:15px;cursor: pointer;" src="~@/assets/img/ai_m/delete.png" alt="">
  59. </template>
  60. </el-table-column>
  61. </el-table>
  62. </div>
  63. </div>
  64. </template>
  65. <script>
  66. import mPage from '@/components/mPage.vue'
  67. export default {
  68. components:{mPage},
  69. props:{
  70. tableData:{
  71. type:Array,
  72. default:[]
  73. },
  74. tableLoading:{
  75. type:Boolean,
  76. default:false
  77. },
  78. tableColumns:{
  79. type:Array,
  80. default:[]
  81. },
  82. tableParams:{
  83. type:Object,
  84. default:()=>{
  85. return {
  86. total:0,
  87. pageSize:20,
  88. pageNo:1,
  89. pagerCount:5,
  90. uniqueKey:'Id'
  91. }
  92. }
  93. },
  94. isSelectAll:{
  95. type:Boolean,
  96. default:false,
  97. },
  98. factorData:{
  99. type:Object,
  100. default:{}
  101. }
  102. },
  103. watch:{
  104. /* isSelectAll(newValue){
  105. this.listCheckAllChange(newValue)
  106. }, */
  107. factorData:{
  108. handler(newValue){
  109. this.selectData = newValue.selectList||[]
  110. },
  111. immediate:true,
  112. deep:true
  113. }
  114. },
  115. data() {
  116. return {
  117. selectList:[],//左侧表格已选择/已剔除的数据
  118. selectData:[],//右侧表格的数据
  119. selectionReactCancel:false,
  120. };
  121. },
  122. methods: {
  123. //点击数据行的checkbox触发 selection:已选择的所有数据行;row:当前点击的数据行
  124. selectHandle(selection,row){
  125. const {uniqueKey} = this.tableParams
  126. //通过判断selection中有无row确定是勾选了checkbox还是取消勾选
  127. //当为勾选时,判断selectList是否表示已选择的数据(isSelectAll===false),若不是则不加入
  128. //当为取消勾选时,判断selectList是否表示已剔除的数据(isSelectAll===true),若不是则不加入
  129. let check = selection.some(i=>i[uniqueKey] == row[uniqueKey])?(!this.isSelectAll):(this.isSelectAll)
  130. if(check){
  131. this.selectList.push(row[uniqueKey])
  132. }else{
  133. this.selectList = this.selectList.filter(i=>i!=row[uniqueKey])
  134. }
  135. this.selectionChange()
  136. },
  137. //点击表头全选 or 调用toggleAllSelection 触发
  138. selectAllHandle(selection){
  139. //当前table的所有数据
  140. const tableIds = this.tableData.map(it => it[this.tableParams.uniqueKey])
  141. //通过判断selection中有无数据确定是全选or取消全选
  142. //当为全选时,判断selectList是否表示已选择的数据(isSelectAll===false),若不是则从selectList中剔除
  143. //当为取消全选时,判断selectList是否表示已剔除的数据(isSelectAll===true),若不是则从selectList中剔除
  144. let check = selection&&selection.length?(!this.isSelectAll):this.isSelectAll
  145. if(check){
  146. this.selectList = [...this.selectList,...tableIds]
  147. }else{
  148. this.selectList = this.selectList.filter(it => !tableIds.includes(it))
  149. }
  150. this.selectionChange()
  151. },
  152. //当勾选项改变时 处理数据
  153. selectionChange(){
  154. //去重 selectList
  155. let duplicateArr = Array.from(new Set(this.selectList))
  156. let isCheckAll = false,isIndeterminate = false
  157. //判断已选择的数据,更改列表全选checkbox的状态
  158. /**
  159. * 全选:
  160. * 1.selectList.length === total && isSelectAll === false (已选择的数据为全部数据)
  161. * 2.selectList.length === 0 && isSelectAll === true (已剔除的指标为空)
  162. * 以上两种满足其一即可
  163. */
  164. const selectAll = duplicateArr.length===this.tableParams.total && (!this.isSelectAll)
  165. || duplicateArr.length===0 && this.isSelectAll
  166. /**
  167. * 全不选:
  168. * 1.selectList.length === total && isSelectAll === true (剔除了全部数据)
  169. * 2.selectList.length === 0 && isSelectAll === false (没选择任何数据)
  170. * 以上两种满足其一即可
  171. */
  172. const selectNone = duplicateArr.length===this.tableParams.total && this.isSelectAll
  173. || duplicateArr.length===0 && (!this.isSelectAll)
  174. //其余情况均为半选
  175. if(selectAll){
  176. isCheckAll = true
  177. isIndeterminate = false
  178. }else if(selectNone){
  179. isCheckAll = false
  180. isIndeterminate = false
  181. }else{
  182. isCheckAll = false
  183. isIndeterminate = true
  184. }
  185. this.$emit('changeCheckAll',{isCheckAll,isIndeterminate})
  186. },
  187. //切换页面时调整勾选项 (在外层组件调用)
  188. adjustSelection(){
  189. const {uniqueKey} = this.tableParams
  190. this.$refs.tableRef.clearSelection()
  191. this.tableData.forEach(data=>{
  192. if(this.selectList.includes(data[uniqueKey])){
  193. //isSelectAll===false,selectList为已选择的数据,则对应数据行打勾
  194. //isSelectAll === true,selectList为已剔除的数据,则对应的数据行取消打勾
  195. this.$nextTick(()=>{
  196. this.$refs.tableRef.toggleRowSelection(data,!this.isSelectAll)
  197. })
  198. }else{
  199. this.$nextTick(()=>{
  200. this.$refs.tableRef.toggleRowSelection(data,this.isSelectAll)
  201. })
  202. }
  203. })
  204. },
  205. listCheckAllChange(newValue){
  206. this.selectList = []
  207. this.$refs.tableRef && this.tableData.length && this.$refs.tableRef.clearSelection()
  208. if(newValue){
  209. //会触发select-all
  210. this.$refs.tableRef && this.tableData.length && this.$refs.tableRef.toggleAllSelection()
  211. /* //不会触发select-all
  212. this.$refs.tableRef && this.tableData.length && this.$refs.tableRef.toggleRowSelection(this.tableData[0],true) */
  213. }
  214. },
  215. pageNumberChange(page){
  216. this.$emit('pageChange',page)
  217. },
  218. handleAddSelectData(){
  219. //外层组件处理校验和添加逻辑
  220. this.$emit('addSelectData',{selectList:this.selectList,selectData:this.selectData})
  221. },
  222. //外层组件调用
  223. addSelectData(data){
  224. this.selectData = [...this.selectData,...data]
  225. },
  226. handleDelSelect(index,type){
  227. if(type==='all'){
  228. return (this.selectData = [])
  229. }
  230. this.selectData.splice(index,1)
  231. },
  232. },
  233. };
  234. </script>
  235. <style scoped lang="scss">
  236. .batch-select-table{
  237. display: flex;
  238. justify-content: space-between;
  239. align-items: center;
  240. gap:0 20px;
  241. .table-box,.select-box{
  242. flex:1;
  243. }
  244. &::after{
  245. content:'';
  246. flex:0 0 auto;
  247. visibility: hidden;
  248. }
  249. }
  250. </style>