richText.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <template>
  2. <!-- 富文本 -->
  3. <view v-show="!isSortType">
  4. <common-wrapper :config="configData">
  5. <view class="richText" v-if="description" :style="[richTextStyle]">
  6. <!-- #ifndef APP-PLUS -->
  7. <jyf-parser
  8. :html="description"
  9. ref="article"
  10. :tag-style="tagStyle"
  11. ></jyf-parser>
  12. <!-- #endif -->
  13. <!-- #ifdef APP-PLUS -->
  14. <!-- eslint-disable-next-line vue/no-v-text-v-html-on-component -->
  15. <view v-html="description"></view>
  16. <!-- #endif -->
  17. </view>
  18. </common-wrapper>
  19. </view>
  20. </template>
  21. <script>
  22. import commonWrapper from "./commonWrapper.vue";
  23. import parser from "@/components/jyf-parser/jyf-parser";
  24. export default {
  25. name: "richText",
  26. props: {
  27. dataConfig: {
  28. type: Object,
  29. default: () => {},
  30. },
  31. isSortType: {
  32. type: String | Number,
  33. default: 0,
  34. },
  35. },
  36. components: {
  37. "jyf-parser": parser,
  38. commonWrapper,
  39. },
  40. data() {
  41. return {
  42. tagStyle: {
  43. img: "width:100%;display:block;",
  44. table: "width:100%",
  45. video: "width:100%",
  46. },
  47. bgColor: "",
  48. lrConfig: 0,
  49. udConfig: 0,
  50. };
  51. },
  52. computed: {
  53. configData() {
  54. return {
  55. ...this.dataConfig,
  56. paddingConfig: this.dataConfig.paddingConfig || {
  57. isAll: false,
  58. valList: [
  59. {
  60. val: this.dataConfig.topConfig
  61. ? this.dataConfig.topConfig.val
  62. : 0,
  63. },
  64. {
  65. val: this.dataConfig.prConfig ? this.dataConfig.prConfig.val : 0,
  66. },
  67. {
  68. val: this.dataConfig.bottomConfig
  69. ? this.dataConfig.bottomConfig.val
  70. : 0,
  71. },
  72. {
  73. val: this.dataConfig.prConfig ? this.dataConfig.prConfig.val : 0,
  74. },
  75. ],
  76. },
  77. marginConfig: this.dataConfig.marginConfig || {
  78. isAll: false,
  79. valList: [
  80. {
  81. val: this.dataConfig.mbConfig ? this.dataConfig.mbConfig.val : 0,
  82. },
  83. {
  84. val: 0,
  85. },
  86. {
  87. val: 0,
  88. },
  89. {
  90. val: 0,
  91. },
  92. ],
  93. },
  94. };
  95. },
  96. description() {
  97. let description = this.dataConfig.richText.val;
  98. if (description) {
  99. description = description.replace(
  100. /<img/gi,
  101. '<img style="max-width:100%;height:auto;float:left;display:block" '
  102. );
  103. description = description.replace(
  104. /<video/gi,
  105. '<video style="width:100%;height:auto;display:block" '
  106. );
  107. }
  108. return description;
  109. },
  110. richTextStyle() {
  111. let borderRadius = `${this.dataConfig.fillet.val * 2}rpx`;
  112. if (this.dataConfig.fillet.type) {
  113. borderRadius = `${this.dataConfig.fillet.valList[0].val * 2}rpx ${
  114. this.dataConfig.fillet.valList[1].val * 2
  115. }rpx ${this.dataConfig.fillet.valList[3].val * 2}rpx ${
  116. this.dataConfig.fillet.valList[2].val * 2
  117. }rpx`;
  118. }
  119. return {
  120. "border-radius": borderRadius,
  121. background: this.dataConfig.bgColor.color[0].item,
  122. };
  123. },
  124. // richTextWrapStyle() {
  125. // return {
  126. // 'padding': `${this.dataConfig.topConfig.val*2}rpx ${this.dataConfig.lrConfig.val*2}rpx ${this.dataConfig.bottomConfig.val*2}rpx`,
  127. // 'margin-top': `${this.dataConfig.udConfig.val*2}rpx`,
  128. // 'background': this.dataConfig.bottomBgColor.color[0].item,
  129. // };
  130. // },
  131. },
  132. };
  133. </script>
  134. <style lang="scss">
  135. .richText {
  136. padding: 30rpx;
  137. background-color: #fff;
  138. // margin: 0 20rpx;
  139. // border-radius: 24rpx;
  140. &::after {
  141. content: "";
  142. display: table;
  143. clear: both;
  144. }
  145. }
  146. ::v-deep uni-video {
  147. width: 100% !important;
  148. }
  149. ::v-deep video {
  150. width: 100% !important;
  151. }
  152. </style>