index.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <template>
  2. <view id="content" class="content">
  3. <draggable v-model="initModule" @end="setList">
  4. <template v-if="initModule && initModule.length > 0">
  5. <view v-for="item in initModule" :key="item.id">
  6. <widget-shape :id="item.id">
  7. <component :ref="`${item.component}Ref`" :is="item.component"
  8. :dataVal="setConfig(item.fields.dataVal)" :attrs="setConfig(item.fields.attrs)"
  9. :styles="setConfig(item.fields.styles)" />
  10. </widget-shape>
  11. </view>
  12. </template>
  13. </draggable>
  14. </view>
  15. </template>
  16. <script>
  17. import draggable from "./vuedraggable.umd.min.js";
  18. import widgetShape from "./widget-shape.vue"
  19. export default {
  20. components: {
  21. draggable,
  22. widgetShape
  23. },
  24. data() {
  25. return {
  26. initModule: [],
  27. EditModuleId: null,
  28. }
  29. },
  30. provide() {
  31. return {
  32. page: this,
  33. };
  34. },
  35. onLoad(opt) {
  36. this.getMessage();
  37. },
  38. onReachBottom() {
  39. console.log('滚动到底不了')
  40. if (this.initModule && this.initModule.length > 0) {
  41. this.initModule.forEach(el => {
  42. // console.log('this.initModule = ', el.component , this.$refs[`${el.component}Ref`][0].onReachBottom)
  43. if (this.$refs[`${el.component}Ref`][0].onReachBottom) {
  44. this.$refs[`${el.component}Ref`][0].reachBottom()
  45. }
  46. })
  47. }
  48. },
  49. methods: {
  50. // 统一接收平台信息,调用对应方法处理
  51. getMessage() {
  52. window.addEventListener("message", e => {
  53. console.log('messagemessage', e.data)
  54. if (e.source != window.parent) return;
  55. if (e.data) {
  56. let {
  57. even,
  58. params
  59. } = e.data;
  60. if (even == "setPages") this.init(params);
  61. if (even == "setEditModuleId") this.getEditModuleId(params);
  62. }
  63. });
  64. },
  65. init(params) {
  66. this.initModule = params || [];
  67. },
  68. getEditModuleId(e) {
  69. this.EditModuleId = e || null;
  70. },
  71. setEditModuleId(id) {
  72. if (!id) return false
  73. const className = `module_${id}`;
  74. let topNum = 0;
  75. const query = uni.createSelectorQuery().in(this);
  76. query.select(`#${className}`).boundingClientRect(data => {
  77. topNum = data.top
  78. }).exec();
  79. window.parent.postMessage({
  80. type: "setEditModule",
  81. params: {
  82. editId: id,
  83. topNum: topNum
  84. }
  85. },
  86. "*"
  87. );
  88. },
  89. // 组件顺位改变,刷新列表
  90. setList(e) {
  91. window.parent.postMessage({
  92. type: "updateEditModule",
  93. params: {
  94. moduleList: this.initModule
  95. }
  96. },
  97. "*"
  98. );
  99. this.setEditModuleId(this.EditModuleId)
  100. },
  101. getFiltrateData(data) {
  102. const val = {}
  103. for (let key in data) {
  104. if (data[key].child) {
  105. val[key] = this.getFiltrateData(data[key].child)
  106. } else {
  107. val[key] = data[key].value
  108. }
  109. }
  110. return val
  111. },
  112. setConfig(data) {
  113. const obj = data ? this.getFiltrateData(data.child) : ''
  114. return obj
  115. }
  116. },
  117. watch: {
  118. EditModuleId: {
  119. handler(newId, oldValue) {
  120. if (newId) this.setEditModuleId(newId)
  121. },
  122. deep: true,
  123. immediate: true
  124. }
  125. },
  126. }
  127. </script>
  128. <style>
  129. </style>