TextMessageRender.vue 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <template>
  2. <view class="text_message_container bg_container" :class="[isSender ? 'text_message_container_self' : '']">
  3. <rich-text :nodes="nodes" class="plain_text"></rich-text>
  4. </view>
  5. </template>
  6. <script>
  7. import { parseAt, parseLink } from "../../../../../util/imCommon";
  8. import { MessageType } from "@/pages_im/constant/imConstants";
  9. import Parser from "@/uni_modules/uview-plus/components/u-parse/parser.js";
  10. export default {
  11. name: "TextMessageRender",
  12. props: {
  13. message: Object,
  14. isSender: {
  15. type: Boolean,
  16. default: false,
  17. },
  18. },
  19. computed: {
  20. getContent() {
  21. let content = "";
  22. if (this.message.contentType === MessageType.QuoteMessage) {
  23. content = this.message.quoteElem.text || "";
  24. } else if (this.message.contentType === MessageType.AtTextMessage) {
  25. content = parseAt(this.message.atTextElem) || "";
  26. } else {
  27. content = this.message.textElem?.content || "";
  28. content = parseLink(content);
  29. }
  30. // 统一处理换行符为 <br>,确保 rich-text 能正确换行
  31. return content.replace(/\n/g, ' ');
  32. },
  33. nodes() {
  34. try {
  35. const content = this.getContent;
  36. if (!content) return [];
  37. const parser = new Parser({});
  38. const nodeList = parser.parse(content);
  39. return nodeList;
  40. } catch (e) {
  41. console.error("RichText parse error:", e);
  42. return [];
  43. }
  44. },
  45. },
  46. methods: {
  47. navigate(link) {
  48. if (link.innerText.includes("@")) {
  49. this.$emit("showInfo", link.href);
  50. }
  51. },
  52. },
  53. };
  54. </script>
  55. <style lang="scss" scoped>
  56. .plain_text {
  57. font-size: 20px;
  58. color: #333;
  59. line-height: 48rpx;
  60. /* 确保文本能正常换行且不被截断 */
  61. word-wrap: break-word;
  62. word-break: break-all;
  63. }
  64. .bg_container {
  65. padding: 18rpx 24rpx;
  66. border-radius: 0rpx 12rpx 12rpx 12rpx;
  67. background-color: #ffffff;
  68. max-width: 514rpx;
  69. }
  70. .text_message_container_self {
  71. border-radius: 12rpx 0 12rpx 12rpx;
  72. background-color: #95EC69 !important;
  73. }
  74. </style>