EmojiSelectPopover.vue 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. <!-- emoji 表情选择组件 -->
  2. <template>
  3. <el-popover :width="500" placement="top" trigger="click">
  4. <template #reference>
  5. <Icon :size="30" class="ml-10px cursor-pointer" icon="twemoji:grinning-face" />
  6. </template>
  7. <ElScrollbar height="300px">
  8. <ul class="ml-2 flex flex-wrap px-2">
  9. <li
  10. v-for="(item, index) in emojiList"
  11. :key="index"
  12. :style="{
  13. borderColor: 'var(--el-color-primary)',
  14. color: 'var(--el-color-primary)'
  15. }"
  16. :title="item.name"
  17. class="icon-item mr-2 mt-1 w-1/10 flex cursor-pointer items-center justify-center border border-solid p-2"
  18. @click="handleSelect(item)"
  19. >
  20. <!-- TODO @puhui999:换成 unocss -->
  21. <img :src="item.url" style="width: 24px; height: 24px" />
  22. </li>
  23. </ul>
  24. </ElScrollbar>
  25. </el-popover>
  26. </template>
  27. <script lang="ts" setup>
  28. defineOptions({ name: 'EmojiSelectPopover' })
  29. import { Emoji, useEmoji } from './emoji'
  30. const { getEmojiList } = useEmoji()
  31. const emojiList = computed(() => getEmojiList())
  32. /** 选择 emoji 表情 */
  33. const emits = defineEmits<{
  34. (e: 'select-emoji', v: Emoji)
  35. }>()
  36. const handleSelect = (item: Emoji) => {
  37. // 整个 emoji 数据传递出去,方便以后输入框直接显示表情
  38. emits('select-emoji', item)
  39. }
  40. </script>