Topic.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <template>
  2. <div>
  3. <SldHomeTopSearch />
  4. <NavCatHeader />
  5. <div class="bottom_line"></div>
  6. <div class="index">
  7. <template v-if="firstLoading">
  8. <div class="skeleton_banner"></div>
  9. <div class="w_sld_react_1210 adv_04_wrap skeleton">
  10. <div class="floor_title">
  11. <h2>
  12. <font>&nbsp;</font>
  13. <span></span>
  14. <font>&nbsp;</font>
  15. </h2>
  16. </div>
  17. <div class="floor_goods">
  18. <div
  19. class="item"
  20. v-for="(item_main, index_main) in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
  21. v-bind:key="index_main"
  22. >
  23. <div class="wrap">
  24. <a href="javascript:void(0)" class="example_text"> </a>
  25. <p class="title">
  26. <a href="javascript:void(0)">{{ item_main }}</a>
  27. </p>
  28. <p class="price"><span></span></p>
  29. </div>
  30. </div>
  31. </div>
  32. </div>
  33. </template>
  34. <SldDiy
  35. v-if="decorateData.data.length"
  36. :decorateData="decorateData"
  37. @adv19="handleAdv19"
  38. />
  39. <!-- 空页面 start-->
  40. <SldCommonEmpty
  41. v-if="!firstLoading && !decorateData.data.length"
  42. totalHeight="900"
  43. paddingTop="250"
  44. :tip="L['我们正在努力装修中,敬请期待~']"
  45. />
  46. <!-- 空页面 end-->
  47. </div>
  48. </div>
  49. </template>
  50. <script setup>
  51. import { useRoute } from "vue-router";
  52. const route = useRoute();
  53. const decorateData = reactive({ data: [] }); //装修数据
  54. const firstLoading = ref(true); //是否第一次加载
  55. const getInitData = async () => {
  56. let params = {};
  57. params.decoType = "topic";
  58. params.decoId = route.query.topicId;
  59. const { data: value, pending: pending, error, refresh } = await useFetchRaw(
  60. apiUrl + "v3/system/front/pcDeco/index",
  61. { params }
  62. );
  63. if (!pending._rawValue) {
  64. firstLoading.value = false;
  65. }
  66. const res = value._rawValue;
  67. if (res.state == 200) {
  68. decorateData.data = JSON.parse(res.data.data.replace(/&quot;/g, '"'));
  69. decorateData.data.map((item) => {
  70. item.json_data = item.json;
  71. if (item.json_data.type == "adv_19") {
  72. item.json_data.data.map((child) => {
  73. child.cur_tab = 0;
  74. });
  75. }
  76. if (item.json_data && item.json_data.type == "main_banner_pc") {
  77. item.json_data.data = item.json_data.info.carousel_info.data.filter((i) => i.imgUrl);
  78. }
  79. });
  80. }
  81. };
  82. getInitData();
  83. </script>
  84. <style lang="scss" scoped>
  85. @import "@/assets/style/decorate.scss";
  86. @import "@/assets/style/theme.scss";
  87. .index {
  88. background: #f8f8f8;
  89. padding-bottom: 10px;
  90. }
  91. .skeleton_banner {
  92. width: 100%;
  93. height: 470px;
  94. background: $colorSkeleton;
  95. margin-bottom: 10px;
  96. }
  97. .skeleton {
  98. &.adv_04_wrap .floor_title h2 span {
  99. background: $colorSkeleton;
  100. display: inline-block;
  101. width: 200px;
  102. }
  103. &.adv_04_wrap .floor_goods .item .wrap .title {
  104. background: $colorSkeleton;
  105. width: 100%;
  106. a {
  107. color: transparent;
  108. }
  109. }
  110. &.adv_04_wrap .floor_goods .item .wrap .price {
  111. width: 100%;
  112. height: 25px;
  113. }
  114. &.adv_04_wrap .floor_goods .item .wrap .price span {
  115. display: inline-block;
  116. width: 70px;
  117. height: 100%;
  118. background: $colorSkeleton;
  119. }
  120. }
  121. </style>