TextMessageRender.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <template>
  2. <view class="text_message_container bg_container" style="position: relative; overflow: visible; font-size: 20px;">
  3. <view class="msg_arrow" :class="isSender ? 'msg_arrow_right' : 'msg_arrow_left'"></view>
  4. <mp-html
  5. containerStyle="font-size: 20px; line-height: 1.5; word-break: break-word;"
  6. @linktap="navigate"
  7. @ready="onHtmlReady"
  8. :previewImg="false"
  9. :showImgMenu="false"
  10. :lazyLoad="true"
  11. :copyLink="false"
  12. :selectable="false"
  13. :content="getContent">
  14. <!-- 纯文本占位:在 mp-html 完成解析前,先展示可读内容 -->
  15. <text class="plain_text">{{ getPlainText }}</text>
  16. </mp-html>
  17. <!-- {{getContent}} -->
  18. <!-- <u-parse :imgOptions="false" @navigate="navigate" :content="getContent" /> -->
  19. </view>
  20. </template>
  21. <script>
  22. import { parseBr } from "../../../../../util/common";
  23. import { parseAt, parseLink } from "../../../../../util/imCommon";
  24. import { MessageType } from "openim-uniapp-polyfill";
  25. export default {
  26. name: "TextMessageRender",
  27. components: {},
  28. props: {
  29. message: Object,
  30. isSender: {
  31. type: Boolean,
  32. default: false
  33. }
  34. },
  35. computed: {
  36. getContent() {
  37. if (this.message.contentType === MessageType.QuoteMessage) {
  38. return this.message.quoteElem.text;
  39. }
  40. if (this.message.contentType === MessageType.AtTextMessage) {
  41. return parseAt(this.message.atTextElem);
  42. }
  43. return parseLink(parseBr(this.message.textElem?.content));
  44. },
  45. // 纯文本占位内容:不做富文本解析,保证首屏立即可见
  46. getPlainText() {
  47. if (this.message.contentType === MessageType.QuoteMessage) {
  48. return this.message.quoteElem.text || '';
  49. }
  50. if (this.message.contentType === MessageType.AtTextMessage) {
  51. // 第二个参数设为 true,返回纯文本而非链接
  52. return parseAt(this.message.atTextElem, true) || '';
  53. }
  54. return this.message.textElem?.content || '';
  55. }
  56. },
  57. data() {
  58. return {};
  59. },
  60. methods: {
  61. navigate(link) {
  62. // console.log(link);
  63. if (link.innerText.includes("@")) {
  64. this.$emit("showInfo", link.href);
  65. }
  66. },
  67. onHtmlReady() {
  68. this.$emit('htmlReady', this.message?.clientMsgID);
  69. }
  70. },
  71. };
  72. </script>
  73. <style lang="scss" scoped>
  74. .plain_text {
  75. white-space: pre-wrap;
  76. word-break: break-word;
  77. font-size: 17px;
  78. }
  79. .msg_arrow {
  80. width: 0;
  81. height: 0;
  82. border-top: 10rpx solid transparent;
  83. border-bottom: 10rpx solid transparent;
  84. position: absolute;
  85. top: 22rpx;
  86. }
  87. .msg_arrow_left {
  88. left: -14rpx;
  89. border-right: 16rpx solid #ffffff;
  90. }
  91. .msg_arrow_right {
  92. right: -14rpx;
  93. border-left: 16rpx solid #95EC69;
  94. }
  95. </style>