ElemFillField.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <template>
  2. <div class="elem-fill-field">
  3. <div
  4. class="fill-field-item"
  5. v-for="(info, index) in fields"
  6. :key="index"
  7. :style="itemStyles"
  8. >
  9. <div class="fill-field-content" :style="lineStyles">
  10. <span :style="paramStyle" v-html="info.contentHtml"></span>
  11. <span>:</span>
  12. <span :style="info.contStyle || contStyle">{{
  13. fieldInfos[info.code]
  14. }}</span>
  15. </div>
  16. </div>
  17. <div v-if="!data.fields.length" class="fill-field-item" :style="itemStyles">
  18. <div class="fill-field-content" :style="lineStyles">
  19. <span :style="paramStyle">变量名</span>
  20. <span>:</span>
  21. <span :style="contStyle">12345</span>
  22. </div>
  23. </div>
  24. </div>
  25. </template>
  26. <script>
  27. export default {
  28. name: "elem-fill-field",
  29. props: {
  30. data: {
  31. type: Object,
  32. },
  33. },
  34. data() {
  35. return {
  36. fieldInfos: this.data["fieldInfos"] || {},
  37. fields: [],
  38. paramStyle: {},
  39. contStyle: {},
  40. lenWidths: {
  41. 3: 45,
  42. 4: 62,
  43. 5: 75,
  44. 6: 90,
  45. 7: 105,
  46. 8: 120,
  47. },
  48. };
  49. },
  50. computed: {
  51. itemStyles() {
  52. return {
  53. width: 100 / this.data.fieldCountPerLine + "%",
  54. };
  55. },
  56. lineStyles() {
  57. return {
  58. height: this.data.lineSpacing + "px",
  59. paddingTop: this.data.lineSpacing - 26 + "px",
  60. };
  61. },
  62. },
  63. methods: {
  64. init() {
  65. this.fields = this.data.fields.map((item) => {
  66. // 兼容wkhtmltopdf 汉字两端对齐的问题
  67. let nitem = { ...item };
  68. nitem.contentHtml = item.name
  69. .split("")
  70. .map((str) => `<i>${str}</i>`)
  71. .join(" ");
  72. if (!this.data.nameIsJustify) {
  73. nitem.contStyle = {
  74. marginLeft: item.name.length * 14 + 4 + 20 + "px",
  75. };
  76. }
  77. return nitem;
  78. });
  79. if (this.data.nameIsJustify) {
  80. const nameNums = this.data.fields.map((item) => item.name.length);
  81. const maxNameLen = Math.max.apply(null, nameNums);
  82. const num = maxNameLen < 3 ? 3 : maxNameLen > 8 ? 8 : maxNameLen;
  83. this.paramStyle = {
  84. width: this.lenWidths[num] + "px",
  85. };
  86. this.contStyle = {
  87. marginLeft: this.lenWidths[num] + 20 + "px",
  88. };
  89. } else {
  90. this.paramStyle = {};
  91. this.contStyle = {};
  92. }
  93. },
  94. },
  95. watch: {
  96. data: {
  97. immediate: true,
  98. handler() {
  99. this.init();
  100. },
  101. },
  102. },
  103. };
  104. </script>