message-text.vue 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. <template>
  2. <view :class="['content content-' + message.flow]">
  3. <view v-for="(item, index) in data.text" :key="index">
  4. <view v-if="item.name === 'text'">{{ item.text }}</view>
  5. <img class="text-img" v-else-if="item.name === 'img'" :src="item.src"/>
  6. </view>
  7. </view>
  8. </template>
  9. <script lang="ts">
  10. import { defineComponent, watchEffect, reactive, toRefs } from 'vue';
  11. const MessageText = defineComponent({
  12. props: {
  13. data: {
  14. type: Object,
  15. default: () => {
  16. return {};
  17. }
  18. },
  19. messageData: {
  20. type: Object,
  21. default: () => {
  22. return {};
  23. }
  24. }
  25. },
  26. setup(props:any, ctx:any) {
  27. const data = reactive({
  28. data: {},
  29. message: {}
  30. });
  31. watchEffect(()=>{
  32. data.data = props.data;
  33. data.message = props.messageData;
  34. });
  35. return {
  36. ...toRefs(data),
  37. };
  38. }
  39. });
  40. export default MessageText
  41. </script>
  42. <style lang="scss" scoped>
  43. .text-img {
  44. width: 20px;
  45. height: 20px;
  46. }
  47. .content {
  48. display: flex;
  49. flex-wrap: wrap;
  50. padding: 10px;
  51. &-in {
  52. background: #e1e1e1;
  53. border-radius: 0px 10px 10px 10px;
  54. }
  55. &-out {
  56. background: #DCEAFD;
  57. border-radius: 10px 0px 10px 10px;
  58. }
  59. }
  60. </style>