EditText.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <template>
  2. <div class="edit-text">
  3. <el-form
  4. ref="modalFormComp"
  5. :model="modalForm"
  6. :rules="rules"
  7. :key="modalForm.id"
  8. label-width="100px"
  9. >
  10. <el-form-item label="字号:">
  11. <size-select
  12. v-model="modalForm.fontSize"
  13. style="width:100%;"
  14. ></size-select>
  15. </el-form-item>
  16. <el-form-item label="字体:">
  17. <font-family-select
  18. v-model="modalForm.fontFamily"
  19. style="width:100%;"
  20. ></font-family-select>
  21. </el-form-item>
  22. <el-form-item label="颜色:">
  23. <color-select v-model="modalForm.color"></color-select>
  24. </el-form-item>
  25. <el-form-item label="加粗:">
  26. <el-checkbox v-model="isBold" @change="boldChange"
  27. >是否加粗</el-checkbox
  28. >
  29. </el-form-item>
  30. <el-form-item prop="contentStr" label="内容:">
  31. <el-input
  32. type="textarea"
  33. :rows="4"
  34. placeholder="请输入内容"
  35. v-model="modalForm.contentStr"
  36. @change="contentChange"
  37. ref="contentTextarea"
  38. >
  39. </el-input>
  40. </el-form-item>
  41. </el-form>
  42. </div>
  43. </template>
  44. <script>
  45. import SizeSelect from "../../components/common/SizeSelect";
  46. import ColorSelect from "../../components/common/ColorSelect";
  47. import FontFamilySelect from "../../components/common/FontFamilySelect";
  48. const initModalForm = {
  49. id: "",
  50. fontSize: "10.5pt",
  51. color: "",
  52. fontFamily: "",
  53. fontWeight: 400,
  54. rotation: 0,
  55. content: [],
  56. contentStr: ""
  57. };
  58. export default {
  59. name: "edit-text",
  60. components: {
  61. SizeSelect,
  62. ColorSelect,
  63. FontFamilySelect
  64. },
  65. props: {
  66. instance: {
  67. type: Object,
  68. default() {
  69. return {};
  70. }
  71. }
  72. },
  73. data() {
  74. return {
  75. modalForm: { ...initModalForm },
  76. isBold: false,
  77. rules: {
  78. contentStr: [
  79. {
  80. required: true,
  81. message: "请输入文本内容",
  82. trigger: "change"
  83. }
  84. ]
  85. }
  86. };
  87. },
  88. mounted() {
  89. this.initData(this.instance);
  90. },
  91. methods: {
  92. initData(val) {
  93. const contentStr = val.content
  94. .map(item => {
  95. return item.type === "text"
  96. ? item.content
  97. : "${" + item.content + "}";
  98. })
  99. .join("");
  100. this.modalForm = { ...val, contentStr };
  101. this.isBold = val.fontWeight > 400;
  102. },
  103. boldChange(isBold) {
  104. this.modalForm.fontWeight = isBold ? 700 : 400;
  105. },
  106. contentChange() {
  107. const constentStr = this.modalForm.contentStr;
  108. const rexp = new RegExp(/\$\{.+?\}/, "g");
  109. const variates = constentStr.match(rexp);
  110. const texts = constentStr.split(rexp);
  111. let contents = [];
  112. texts.forEach((text, index) => {
  113. if (text)
  114. contents.push({
  115. type: "text",
  116. content: text
  117. });
  118. if (variates && variates[index])
  119. contents.push({
  120. type: "variate",
  121. content: variates[index].replace("${", "").replace("}", "")
  122. });
  123. });
  124. this.modalForm.content = contents;
  125. },
  126. async submit() {
  127. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  128. if (!valid) return;
  129. this.$emit("modified", this.modalForm);
  130. }
  131. }
  132. };
  133. </script>