summary.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. export default {
  2. props:{
  3. scrollbarSize:{
  4. type:Number,
  5. default:0
  6. },
  7. fixedLeftColumns:{
  8. type:Array,
  9. default:()=>[]
  10. },
  11. data:{
  12. type:Array,
  13. default:()=>[]
  14. },
  15. transColumns:{
  16. type:Array,
  17. default:()=>[]
  18. },
  19. border:{
  20. type:Boolean,
  21. default:false
  22. },
  23. showSummary:{
  24. type:Boolean,
  25. default:false
  26. },
  27. summaryMethod:{
  28. type:Function
  29. },
  30. sumText:{
  31. type:String,
  32. default:'合计'
  33. },
  34. headerFooterTableLeft:{
  35. type:Number,
  36. default:0
  37. },
  38. handleFooterTableScrollLeft:Function,
  39. },
  40. data(){
  41. return{
  42. sums:[]
  43. }
  44. },
  45. watch:{
  46. 'data':{
  47. deep:true,
  48. immediate:true,
  49. handler(newValue,oldValue){
  50. let sums = [];
  51. if (this.summaryMethod) {
  52. sums = this.summaryMethod({ columns: this.transColumns, data: this.data });
  53. } else {
  54. this.transColumns.forEach((column, index) => {
  55. if (index === 0) {
  56. sums[index] = this.sumText;
  57. return;
  58. }
  59. const values = this.data.map(item => Number(item[column.name]));
  60. const precisions = [];
  61. let notNumber = true;
  62. values.forEach(value => {
  63. if (!isNaN(value)) {
  64. notNumber = false;
  65. let decimal = ('' + value).split('.')[1];
  66. precisions.push(decimal ? decimal.length : 0);
  67. }
  68. });
  69. const precision = Math.max.apply(null, precisions);
  70. if (!notNumber) {
  71. sums[index] = values.reduce((prev, curr) => {
  72. const value = Number(curr);
  73. if (!isNaN(value)) {
  74. return parseFloat((prev + curr).toFixed(Math.min(precision, 20)));
  75. } else {
  76. return prev;
  77. }
  78. }, 0);
  79. } else {
  80. sums[index] = '';
  81. }
  82. });
  83. }
  84. this.sums = sums
  85. },
  86. }
  87. }
  88. }