TopicElementEdit.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <template>
  2. <div class="topic-element">
  3. <div
  4. :class="classes"
  5. :id="data.id"
  6. :data-type="data.type"
  7. v-if="data.type === 'CARD_HEAD' || data.type === 'TOPIC_HEAD'"
  8. >
  9. <!-- card-head 和 topic-head不需要调整高度 -->
  10. <component :is="compName" :data="data"></component>
  11. </div>
  12. <element-resize
  13. v-model="elemData"
  14. :class="{ 'element-resize-act': curElement.id === data.id }"
  15. :active="['b']"
  16. :move="false"
  17. :min-height="20"
  18. fit-parent
  19. @on-click="activeCurElement"
  20. @resize-over="resizeOver"
  21. v-else
  22. >
  23. <div :class="classes" :id="data.id" :data-type="data.type">
  24. <component :is="compName" :data="data"></component>
  25. </div>
  26. <!-- topic-number -->
  27. <topic-number :data="data.topicNo"></topic-number>
  28. </element-resize>
  29. </div>
  30. </template>
  31. <script>
  32. import { mapState, mapMutations, mapActions } from "vuex";
  33. import EditCardHead from "./elementEdit/CardHead";
  34. import EditFillQuestion from "./elementPreview/FillQuestion";
  35. import EditFillLine from "./elementPreview/FillLine";
  36. import EditExplainChildren from "./elementEdit/ExplainChildren";
  37. import EditComposition from "./elementEdit/Composition";
  38. import EditTopicHead from "./elementPreview/TopicHead";
  39. import ElementResize from "./common/ElementResize.vue";
  40. import TopicNumber from "./common/TopicNumber";
  41. export default {
  42. name: "topic-design",
  43. components: {
  44. EditCardHead,
  45. EditTopicHead,
  46. EditFillQuestion,
  47. EditFillLine,
  48. EditExplainChildren,
  49. EditComposition,
  50. ElementResize,
  51. TopicNumber
  52. },
  53. props: {
  54. data: {
  55. type: Object
  56. }
  57. },
  58. data() {
  59. return {
  60. elemData: {
  61. x: 0,
  62. y: 0,
  63. w: 0,
  64. h: 0,
  65. init: false
  66. }
  67. };
  68. },
  69. computed: {
  70. ...mapState("card", ["curElement"]),
  71. elementName() {
  72. return this.data.type.toLowerCase().replace("_", "-");
  73. },
  74. compName() {
  75. return `edit-${this.elementName}`;
  76. },
  77. classes() {
  78. return [
  79. "topic-design",
  80. "element-item",
  81. `element-item-${this.elementName}`,
  82. this.data["isLast"]
  83. ? `element-item-type-last`
  84. : "element-item-type-pre",
  85. {
  86. "element-item-error": this.data.isCovered
  87. }
  88. ];
  89. }
  90. },
  91. mounted() {},
  92. created() {
  93. this.init();
  94. },
  95. methods: {
  96. ...mapMutations("card", ["setCurElement"]),
  97. ...mapActions("card", ["rebuildPages"]),
  98. init() {
  99. this.elemData = this.$objAssign(this.elemData, this.data);
  100. },
  101. activeCurElement() {
  102. this.setCurElement(this.data);
  103. },
  104. resizeOver() {
  105. // 注意:当前组件并没有实时更新元件的尺寸信息,只是在rebuildPages时统一更新。
  106. this.$nextTick(() => {
  107. this.rebuildPages();
  108. });
  109. }
  110. }
  111. };
  112. </script>