TextMessageRender.vue 2.5 KB

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