table.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. import Sortablejs from "sortablejs";
  2. export default {
  3. data() {
  4. return {
  5. // 等数据渲染完了再显示
  6. isShow: false,
  7. // 自己 请求体 参数
  8. dataRequestQuery: {},
  9. // 自己的表数据
  10. dataTabel: [],
  11. // 自己的表头数据
  12. dataColumnData: [],
  13. // 拖拽的表头数据
  14. dataDropColumn: [],
  15. // 自己的数据总条数
  16. dataTotal: 0,
  17. // 自己的当前页面数
  18. dataCurrentPage: 1,
  19. // 自己的每页显示条目个数
  20. dataPageSize: 10,
  21. // 保存表格所有页面所选中的数据
  22. dataSelection: [],
  23. // 保存表格单选的数据 保存数据的id
  24. dataRadioId: ""
  25. };
  26. },
  27. created() {
  28. this.dataCurrentPage = this.currentPage;
  29. this.dataPageSize = this.pageSize;
  30. console.log(this)
  31. this.requestData();
  32. },
  33. mounted() {
  34. //行拖拽
  35. // this.rowDrop();
  36. //列拖拽
  37. this.columnDrop();
  38. },
  39. methods: {
  40. // 通过请求获取数据
  41. requestData(options) {
  42. let pageNum = undefined;
  43. let pageSize = undefined;
  44. if (options) {
  45. pageNum = options.pageNum;
  46. pageSize = options.pageSize;
  47. }
  48. if (this.requestUrl) {
  49. // 处理请求地址逻辑
  50. let url;
  51. if (this.requestUrl.indexOf("//") > -1) {
  52. url = this.requestUrl;
  53. } else {
  54. url = this.requestUrl;
  55. }
  56. // 处理请求地址逻辑
  57. if (
  58. !this.dataTotal ||
  59. (this.dataCurrentPage - 1) * this.dataPageSize < this.dataTotal
  60. ) {
  61. // 判断是否需要在请求体中放入参数
  62. if(this.requestQuery){
  63. console.log(" 判断是否需要在请求体中放入参数")
  64. this.dataRequestQuery=this.requestQuery;
  65. console.log(this.dataRequestQuery.resultBreakId)
  66. }
  67. let data = undefined;
  68. for (const key in this.dataRequestQuery) {
  69. const val = this.dataRequestQuery[key];
  70. console.log(val)
  71. if (val||val==0) {
  72. if (!data) data = {};
  73. data[key] = val;
  74. }
  75. }
  76. // 发送请求
  77. this.axios
  78. .post(url, data, {
  79. // 请求地址 中
  80. params: {
  81. pageNum: pageNum || this.dataCurrentPage,
  82. pageSize: pageSize || this.dataPageSize
  83. }
  84. })
  85. .then(response => {
  86. let d = response.data.data;
  87. this.dataTabel = d.list;
  88. this.dataTotal = d.total;
  89. //执行成功的回调
  90. this.$emit('func',response.data.data);
  91. this.refreshColumnData(d.columnData);
  92. this.isShow = true;
  93. });
  94. }
  95. } else {
  96. console.warn("requestUrl 参数不能为 null");
  97. }
  98. },
  99. // 刷新表头显示数据
  100. refreshColumnData(columnData) {
  101. // 表头只赋值一次
  102. if (this.dataColumnData.length > 0) return;
  103. // 如果前端有写表头,则加在后端表头前面
  104. const d = this.columnData.concat(columnData);
  105. // 把操作列拼接到最后一列
  106. this.dataColumnData = d;
  107. this.dataDropColumn = [].concat(this.dataColumnData);
  108. },
  109. // 排序回调
  110. sortChange({ column, prop, order }) {
  111. // column : 列的数据
  112. // prop : 排序字段参数名
  113. // order : 排序方式 (ascending:升序;descending:降序;null:无)
  114. // 前端排序
  115. // const sort = {
  116. // ascending: (a, b) => {
  117. // a[prop] = this.getString(a[prop]);
  118. // b[prop] = this.getString(b[prop]);
  119. // return a[prop].localeCompare(b[prop] || "", 'zh-CN');
  120. // },
  121. // descending: (a, b) => {
  122. // a[prop] = this.getString(a[prop]);
  123. // b[prop] = this.getString(b[prop]);
  124. // return b[prop].localeCompare(a[prop] || "", 'zh-CN')
  125. // },
  126. // };
  127. // this.dataTabel.sort(sort[order]);
  128. // 前端排序
  129. // 后端排序
  130. let s = {
  131. ascending: "asc",
  132. descending: "desc"
  133. };
  134. let value = {
  135. orderType: s[order] || undefined,
  136. orderField: order ? prop : undefined
  137. };
  138. this.setDataRequestQuery(value);
  139. },
  140. // 更新请求参数
  141. setDataRequestQuery(value) {
  142. let q = this.dataRequestQuery;
  143. for (const key in value) {
  144. q[key] = value[key];
  145. }
  146. this.requestData(q);
  147. this.$emit("update:requestQuery", q);
  148. this.dataRequestQuery = q;
  149. },
  150. // 格式化字符串
  151. getString(str) {
  152. if (str != null && str != undefined && str.toString) {
  153. return str.toString();
  154. } else {
  155. return str || "";
  156. }
  157. },
  158. // 当某一行被点击时会触发该事件
  159. rowClick(row, column, event) {
  160. if (this.selectionType == "radio") {
  161. if (this.dataRadioId == row.ROW_ID) {
  162. this.dataRadioId = "";
  163. row = {};
  164. } else {
  165. this.dataRadioId = row.ROW_ID;
  166. }
  167. this.$emit("radio-change", row);
  168. }
  169. },
  170. // 多选的选中行改变回调
  171. selectionChange(selection) {
  172. this.dataSelection = selection;
  173. // 将多选中的数据抛出
  174. this.$emit("selection-change", selection);
  175. },
  176. // 当表格的筛选条件发生变化的时候会触发该事件,
  177. // 参数的值是一个对象,对象的 key 是 column 的 columnKey,对应的 value 为用户选择的筛选条件的数组。
  178. filterChange(filters) {
  179. let value = {};
  180. for (const key in filters) {
  181. value[key] = filters[key].length > 0 ? filters[key] : undefined;
  182. }
  183. // 每次筛选时,都默认将页面改为第一页,避免数据过少时,显示没有数据
  184. this.currentChange(1, false);
  185. this.setDataRequestQuery(value);
  186. },
  187. // 行拖拽
  188. rowDrop() {
  189. const tbody = document.querySelector(".el-table__body-wrapper tbody");
  190. const _this = this;
  191. Sortablejs.create(tbody, {
  192. onEnd({ newIndex, oldIndex }) {
  193. const currRow = _this.dataTabel.splice(oldIndex, 1)[0];
  194. _this.dataTabel.splice(newIndex, 0, currRow);
  195. }
  196. });
  197. },
  198. // 列拖拽
  199. columnDrop() {
  200. const wrapperTr = document.querySelector(".el-table__header-wrapper tr");
  201. this.sortablejs = Sortablejs.create(wrapperTr, {
  202. animation: 180,
  203. delay: 0,
  204. handle: ".allowDrag",
  205. onEnd: evt => {
  206. // 因为序号列和单多选列不在数组中,所以需要进行偏移计算
  207. const offset = this.dragColumnOffset;
  208. evt.oldIndex -= offset;
  209. evt.newIndex -= offset;
  210. // 换列
  211. const oldItem = this.dataDropColumn[evt.oldIndex];
  212. this.dataDropColumn.splice(evt.oldIndex, 1);
  213. this.dataDropColumn.splice(evt.newIndex, 0, oldItem);
  214. }
  215. });
  216. },
  217. // current-page 改变时会触发
  218. currentChange(val, isRequest = true) {
  219. this.dataCurrentPage = val;
  220. if (isRequest) {
  221. this.requestData({ pageNum: val });
  222. }
  223. // 最后通知父节点页面改变
  224. this.$emit("update:current-page", val);
  225. },
  226. // pageSize 改变时会触发
  227. sizeChange(val) {
  228. this.dataPageSize = val;
  229. this.requestData({});
  230. this.$emit("update:size-change", val);
  231. }
  232. },
  233. computed: {
  234. // 计算是否使用排序功能
  235. dataSortable() {
  236. return function (item) {
  237. if (item.template) {
  238. return false;
  239. } else if (item.sortable) {
  240. return item.sortable;
  241. } else {
  242. return this.sortable;
  243. }
  244. };
  245. },
  246. // 计算每列的最小宽度
  247. dataColumnMinWidth() {
  248. return function (item) {
  249. let mw = 0;
  250. if (this.dataSortable(item)) {
  251. // 如果使用排序功能
  252. mw += 30;
  253. }
  254. if (item.filters && item.filters.length > 0) {
  255. mw += 20;
  256. }
  257. if (item.label) {
  258. mw += item.label.toString().length * 30;
  259. }
  260. return mw;
  261. };
  262. },
  263. // 计算拖拽列的偏移差
  264. dragColumnOffset() {
  265. let o = 0;
  266. if (this.showIndex) {
  267. o++;
  268. }
  269. if (this.selectionType != "") {
  270. o++;
  271. }
  272. return o;
  273. }
  274. },
  275. watch: {
  276. requestQuery: {
  277. deep: true,
  278. handler(val, oldVal) {
  279. let q = this.dataRequestQuery;
  280. for (const key in val) {
  281. q[key] = val[key] ? val[key] : undefined;
  282. }
  283. this.setDataRequestQuery(q);
  284. }
  285. }
  286. },
  287. // 注册组件
  288. components: {
  289. // 代理组件
  290. componentProxy: {
  291. props: {
  292. html: {
  293. default: ""
  294. },
  295. scope: {
  296. default() {
  297. return {};
  298. }
  299. }
  300. },
  301. template: ``,
  302. created() {
  303. this.$options.template = this.html;
  304. }
  305. }
  306. }
  307. };