gui-article-info.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <template>
  2. <view
  3. class="gui-editor-show gui-border-box"
  4. :style="{
  5. paddingLeft:padding+'rpx',
  6. paddingRight:padding+'rpx',
  7. width:'750rpx'
  8. }">
  9. <view
  10. v-for="(item, index) in article"
  11. :key="index">
  12. <!-- 文本 -->
  13. <text
  14. class="gui-block"
  15. :decode="true"
  16. :selectable="true"
  17. :user-select="true"
  18. :class="textClass"
  19. v-if="item.type == 'txt'">{{item.content}}</text>
  20. <!-- 居中 -->
  21. <text
  22. class="gui-block gui-text-center"
  23. :class="centerClass"
  24. :selectable="true"
  25. :user-select="true"
  26. :decode="true"
  27. v-if="item.type == 'center'">{{item.content}}</text>
  28. <!-- 图片 -->
  29. <view
  30. class="gui-img-in"
  31. v-else-if="item.type == 'img'"
  32. :data-url="item.content"
  33. @tap="showImgs">
  34. <gui-image
  35. :src="item.content"
  36. :height="0"
  37. :borderRadius="imgRadius"
  38. :width="(750-padding*2)"></gui-image>
  39. </view>
  40. <!-- 引用 源码 -->
  41. <text
  42. class="gui-block"
  43. :class="quoteClass"
  44. :selectable="true"
  45. :user-select="true"
  46. :decode="true"
  47. v-else-if="
  48. item.type == 'quote' || item.type == 'pre'
  49. ">{{item.content}}</text>
  50. <!-- 加粗 -->
  51. <text
  52. class="gui-block gui-bold"
  53. :class="strongClass"
  54. :selectable="true"
  55. :user-select="true"
  56. :decode="true"
  57. v-else-if="item.type == 'strong'">{{item.content}}</text>
  58. <!-- 链接 -->
  59. <view
  60. v-else-if="item.type == 'link'">
  61. <gui-link
  62. :url="item.content"
  63. :title="item.content"></gui-link>
  64. </view>
  65. <!-- 分割符 -->
  66. <text
  67. class="gui-block gui-text-center"
  68. :class="splineClass"
  69. :selectable="true"
  70. :user-select="true"
  71. v-else-if="item.type == 'spline'">● ● ●</text>
  72. <!-- h1 -->
  73. <text
  74. class="gui-block gui-h1 gui-primary-text"
  75. :decode="true"
  76. :selectable="true"
  77. :user-select="true"
  78. v-else-if="item.type == 'h1'">{{item.content}}</text>
  79. <!-- h2 -->
  80. <text
  81. class="gui-block gui-h2 gui-primary-text"
  82. :selectable="true"
  83. :user-select="true"
  84. :decode="true"
  85. v-else-if="item.type == 'h2'">{{item.content}}</text>
  86. <!-- h3 -->
  87. <text
  88. class="gui-block gui-h3 gui-primary-text"
  89. :selectable="true"
  90. :user-select="true"
  91. :decode="true"
  92. v-else-if="item.type == 'h3'">{{item.content}}</text>
  93. <!-- h4 -->
  94. <text
  95. class="gui-block gui-h4 gui-primary-text"
  96. :selectable="true"
  97. :user-select="true"
  98. :decode="true"
  99. v-else-if="item.type == 'h4'">{{item.content}}</text>
  100. <!-- h5 -->
  101. <text
  102. class="gui-block gui-h5 gui-primary-text"
  103. :selectable="true"
  104. :user-select="true"
  105. :decode="true"
  106. v-else-if="item.type == 'h5'">{{item.content}}</text>
  107. <!-- h6 -->
  108. <text
  109. class="gui-block gui-h6 gui-primary-text"
  110. :selectable="true"
  111. :user-select="true"
  112. :decode="true"
  113. v-else-if="item.type == 'h6'">{{item.content}}</text>
  114. <!-- 视频 -->
  115. <view
  116. v-if="item.type == 'video'">
  117. <video
  118. :style="{width:(750-padding*2)+'rpx'}"
  119. :src="item.content"
  120. controls></video>
  121. </view>
  122. <!-- 间距 -->
  123. <view :style="{height:itemMargin}"></view>
  124. </view>
  125. </view>
  126. </template>
  127. <script>
  128. export default{
  129. name : "gui-article-info",
  130. props : {
  131. article : {
  132. type : Array,
  133. default : function(){return new Array();}
  134. },
  135. itemMargin : {
  136. type : String,
  137. default : '20rpx',
  138. },
  139. padding : {
  140. type : Number,
  141. default : 30,
  142. },
  143. textClass : {
  144. type : Array,
  145. default : function(){
  146. return ['gui-article-text', 'gui-primary-text']
  147. }
  148. },
  149. centerClass : {
  150. type : Array,
  151. default : function(){
  152. return ['gui-article-center', 'gui-primary-text']
  153. }
  154. },
  155. imgRadius : {
  156. type : String,
  157. default : '6rpx',
  158. },
  159. quoteClass : {
  160. type : Array,
  161. default : function(){
  162. return ['gui-article-quote', 'gui-primary-text', 'gui-bg-gray', 'gui-dark-bg-level-2']
  163. }
  164. },
  165. strongClass : {
  166. type : Array,
  167. default : function(){
  168. return ['gui-article-strong', 'gui-primary-text']
  169. }
  170. },
  171. splineClass : {
  172. type : Array,
  173. default : function(){
  174. return ['gui-article-spline', 'gui-color-gray']
  175. }
  176. }
  177. },
  178. methods: {
  179. showImgs:function(e){
  180. var currentUrl = e.currentTarget.dataset.url;
  181. var imgs = [];
  182. var items = this.article;
  183. for(let i = 0; i < items.length; i++){
  184. if(items[i].type == 'img'){
  185. imgs.push(items[i].content);
  186. }
  187. }
  188. uni.previewImage({
  189. urls:imgs,
  190. current:currentUrl
  191. })
  192. }
  193. }
  194. }
  195. </script>
  196. <style scoped>
  197. /* #ifndef APP-NVUE */
  198. .gui-block{word-break: break-all;}
  199. /* #endif */
  200. </style>