ๅผ่จ โ
ๅจๆฐๅญๆถไปฃ๏ผ่ๅคฉๅทฒ็ปๆไธบๆไปฌ็ๆดป็ไธ้จๅ๏ผ่Emoji่กจๆ ๅๆฏๆไปฌ่กจ่พพๆ ๆๅๆ ็ปช็้่ฆๆนๅผไนไธใๆไปฅ๏ผไธบไปไนไธๆ่ฟไบๅฏ็ฑ็ๅฐๅพๆ ่ๅ ฅไฝ ็่ๅคฉๅฎคใ้กน็ฎไธญๅข๐๐คฉ๏ผ
็บฟไธไฝ้ช โ
่ๅคฉๅฎคๆญๅปบๅ่๏ผๅณๆถ้่ฎฏ่ฝปๆพๅฎ็ฐ๏ผWebSocketใVue 3 ๅ Node.js ็ผ้ ็ๅคไบบๅฎๆถไบคๆตๅนณๅฐ
ไฝ้ชๅฐๅโ๏ผxioayi
ๆๆๅฆไธ
ๆดไฝๅฎ็ฐๆ่ทฏ โ
- ็ฉๆ็่ทๅ(emoji)
- ๅฐ่ฃ ไธไธชemoji็ปไปถ(ๆ่ฟไฝฟ็จใ่กจๆ ๅ็ฑป)
- ็ป่ๅค็(ๅฆๅ ๆ ๅคๆๅ ฅ๏ผ้ๆฉๅๆๅ ฅ็ญ)
- ๅจ่ๅคฉๅฎคๅ ทไฝไฝฟ็จ(้ๆฉ่กจๆ ใๆๅ ฅ่พๅ ฅๆกใ้กต้ขๅฑ็คบ)
็ฉๆ่ทๅ โ
ไธ้ข่ฟไธคไธช็ฝ็ซ้ฝๆฏๅฏไปฅๅ ่ดน่ทๅ็๏ผcopyๅๆฌข็่กจๆ yyds๏ผ๏ผ๏ผ ๐,๐,๐,๐,๐ ,๐คฃ,๐
ๅฐ่ฃ ไธไธชemoji็ปไปถ โ
ๅค็emoji่กจๆ โ
- ่ฟ้้่ฆๅฐ่ฃ ไธไธช่พ ๅฉๅฝๆฐๆฅๅธฎๆไปฌ่ฝฌๆๆฐ็ป่ฟ่กๅญๅจ
/**
*
* @param inputs ๅๆฐไธไธชๆๅคไธชๅญ็ฌฆไธฒ
* @returns ่ฟๅไบ็ปดๆฐ็ป
*/
function splitEmoji(...inputs: string[]): string[][] {
const emojiRegex: RegExp = /\p{Emoji}/u;
const emojiArrays: string[][] = [];
inputs.forEach((input) => {
const emojiArray: string[] = [];
for (const char of input) {
if (emojiRegex.test(char)) {
emojiArray.push(char);
}
}
emojiArrays.push(emojiArray);
});
return emojiArrays;
}
ๅฐ่ฃ emoji็ปไปถ โ
- ๆฟๅฐๅค็ๅฅฝ็emojiๆฐๆฎ**{type:xxx,value:['๐','๐','๐','๐']}**
- ๆ นๆฎprops.all ๅคๆญ่ฆๅฑ็คบ็็ฑปๅซ๏ผๅนถ่ฟ่กๆธฒๆ
- ๅค็ไบคไบ๏ผ็นๅปๆไธ่กจๆ ๏ผๅฐฑๆๅฎไผ ็ป็ถ็ปไปถ๏ผๅนถ่ฎกๅ ฅๆ่ฟไฝฟ็จๅ่กจ
<template>
<div class="emoji">
<div v-if="emoji.historyList?.length">
<p>ๆ่ฟไฝฟ็จ</p>
<ul class="history" :class="emoji.historyList?.length ? 'historyShow' : ''">
<li v-for="(item, index) in [...new Set(emoji.historyList)]" :key="index" @click.stop="chooseEmojiDefault(item)"
v-html="item"></li>
</ul>
</div>
<div v-for="items in emojiObj" :key="items.name">
<template v-if="items.name && items.value?.length">
<p>{{ items.name }}</p>
<ul class="default">
<li v-for="(item, index) in items.value" :key="index" @click.stop="chooseEmojiDefault(item)" v-html="item"></li>
</ul>
</template>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref, reactive } from "vue";
import { getAllTypeEmojis } from './utils'
const emit = defineEmits(["emojiHandle"]);
const props = defineProps({
all: {
type: Boolean,
default: false
}
})
const res = getAllTypeEmojis()
const emojiObj = ref({})
if (props.all) {
emojiObj.value = res
} else {
emojiObj.value = {
defEmojis: res.defEmojis
}
}
const emoji = reactive({
chooseItem: "",
historyList: [],
allEmoji: emojiObj.value,
});
const chooseEmojiDefault = (item: string) => {
emoji.chooseItem = item;
emoji.historyList.unshift(item);
emit("emojiHandle", item);
return item;
};
</script>
<style lang="less" scoped>
</style>
่ๅคฉๅฎคไธญไฝฟ็จ่กจๆ โ
่ฟ้ๆไธคไธชๅ ณ้ฎ็น๏ผๆๅ ฅไฝ็ฝฎ่ฎฐๅฝใๆๅ ฅๅญ็ฌฆไธฒๆผๆฅ
- ๆๅ ฅไฝ็ฝฎๅณๅ ๆ ๆไฝ็ฝฎ
- ๅญ็ฌฆไธฒๆผๆฅ๏ผๆชๅๅ ๆ ๅๅญ็ฌฆ+่กจๆ +ๅ ๆ ๅๅญ็ฌฆ
inputไธญๅ ๆ ไฝ็ฝฎ็่ทๅ โ
- domๆไธคไธชๅฑๆง๏ผselectionEndๅselectionStart ๅๅซไปฃ่กจๅ ๆ ่ตทๅงไฝ็ฝฎ
- ่ฎฐๅฝๅ
ๆ ็ปๆไฝ็ฝฎ๏ผ็ญไธ้ๆฉไบๅฅฝๆๅ
ฅ
/**
* ่ทๅๅ
ๆ ็่ตทๅงไฝ็ฝฎ
*/
const selectEmoji = () => {
const Textarea = document.querySelector(".message-input");
console.log(Textarea?.selectionStart,Textarea?.selectionEnd)
};
้ๆฉ่กจๆ ๅค็ โ
- ๆฟๅฐ้ๆฉ่กจๆ
- ๆๅ
ฅๅนถๆผๆฅๅญ็ฌฆไธฒ๏ผ ๆชๅๅ
ๆ ๅๅญ็ฌฆ+่กจๆ
+ๅ
ๆ ๅๅญ็ฌฆ
/**
* ้ๆฉ่กจๆ
๏ผๅนถๆ่กจๆ
ๆๅ
ฅ่พๅ
ฅๆก
* @param {*} item ้ๆฉ็่กจๆ
*/
const emojiHandle = (item) => {
const msg = message.value;
if (!cursor.value) {
message.value += item;
} else {
message.value = msg.slice(0, cursor.value) + item + msg.slice(cursor.value);
}
};
ๅฎๆดไปฃ็ โ
ไปๅบๅฐๅxiaoyi1255
- emoji็ปไปถไธๅ ฑไธไธชๆไปถ๏ผ utils.tsใemojis.jsใindex.vue
- test.vue ไฝฟ็จ็คบไพ
- utils.ts
import {
defEmojis,
allEmojis,
expressionEmojis,
animalEmojis,
personEmojis,
guestrueEmojis,
publicEmojis,
twelveEmojis,
} from './emojis'
/**
*
* @param inputs ๅๆฐไธไธชๆๅคไธชๅญ็ฌฆไธฒ
* @returns ่ฟๅไบ็ปดๆฐ็ป
*/
function splitEmoji(...inputs: string[]): string[][] {
const emojiRegex: RegExp = /\p{Emoji}/u;
const emojiArrays: string[][] = [];
inputs.forEach((input) => {
const emojiArray: string[] = [];
for (const char of input) {
if (emojiRegex.test(char)) {
emojiArray.push(char);
}
}
emojiArrays.push(emojiArray);
});
return [...new Set(emojiArrays)];
}
/**
*
* @returns ่กจๆ
ๅฏน่ฑก allEmojis,expressionEmojis,animalEmojis,personEmojis,guestrueEmojis,publicEmojis,twelveEmojis
*/
const getAllTypeEmojis = () => {
const emojiArr = splitEmoji(allEmojis,expressionEmojis,animalEmojis,personEmojis,guestrueEmojis,publicEmojis,twelveEmojis,defEmojis)
const emojiObj = {
defEmojis: {name:"้ป่ฎค่กจๆ
", value:emojiArr[7]},
guestrueEmojis: {name:"ๆๅฟ่กจๆ
", value:emojiArr[4]},
publicEmojis: {name:"ๅ
ฌๅ
ฑ่กจๆ
", value:emojiArr[5]},
expressionEmojis: {name:"่ธ้จ่กจๆ
", value:emojiArr[1]},
animalEmojis: {name:"ๅจ็ฉ่กจๆ
", value:emojiArr[2]},
personEmojis: {name:"ไบบ็ฉ่กจๆ
", value:emojiArr[3]},
twelveEmojis: {name: "12็่", value: emojiArr[6]},
allEmojis: {name:"ๆๆ่กจๆ
", value:emojiArr[0]},
}
return emojiObj
}
const emojiMap = {
defEmojis: '้ป่ฎค่กจๆ
',
allEmojis: 'ๆๆ่กจๆ
',
expressionEmojis: '่ธ้จ่กจๆ
',
animalEmojis: 'ๅจ็ฉ่กจๆ
',
personEmojis: "ไบบ็ฉ่กจๆ
",
guestrueEmojis: 'ๆๅฟ่กจๆ
',
publicEmojis: 'ๅ
ฌๅ
ฑ่กจๆ
',
twelveEmojis: '12็่',
}
export {
getAllTypeEmojis,
emojiMap
}
- emojis.js
/**
* ่ฟ้ๅญๆพๆไปฅEmoji็ฉๆ
*/
// ้ป่ฎค
const defEmojis = "๐,๐,๐,๐,๐
,๐คฃ,๐,๐,๐,๐,๐,๐,๐,๐,๐,โน,๐ฎ,๐ฏ,๐ฒ,๐ณ,๐ฅบ,๐ฆ,๐ง,๐จ,๐ฐ,๐ฅ,๐ข,๐ญ,๐ฑ,๐,๐ฃ,๐,๐,๐ฉ,๐ซ,๐ฅฑ,๐ค,๐ก,๐ ,๐คฌ,๐,๐ฟ,๐,โ ,๐ฉ,๐คก,๐น,๐บ,๐ป,๐ฝ,๐พ,๐ค,๐บ,๐ธ,๐น,๐ป,๐ผ,๐ฝ,๐,๐ฟ,๐พ,๐,๐,๐,๐,๐,๐,๐,๐,๐,๐,๐,๐,โฃ,๐,โค๏ธโ๐ฅ,โค๏ธโ๐ฉน,โค,๐งก,๐จ,๐ฆ,๐ซ,๐,๐ฏ,โคโ๐ฉน,โคโ๐ฅ,๐ฅต,๐คง,๐คฎ,๐คข,๐ค,๐ค,๐ท,๐ด,๐คค,๐คฏ,๐ค ,๐ฅณ,๐ฅธ,๐,๐ค,๐ง,๐,๐,๐คญ,๐,๐คฉ,๐,๐ฅฐ,๐โ๐จ,๐ค,๐ญ,๐ฏ,๐จ,๐๏ธโ๐จ๏ธ,โบ,๐,๐,๐ฅฒ,๐,๐,๐,๐คช,๐,๐งโโ๏ธ,๐งโโก๏ธ,๐จ๐ฟโ๐ฆผโโก๏ธ,๐๐ป,๐๐ป,๐คธ๐ผโโ,๐๐พโโ๏ธ,๐ต๐ฝโโ,๐๐พ,๐ค,๐๐ผโโ๏ธ,๐ฆ,๐ด,๐,๐,๐บ,๐ป,๐ฆ,๐ฆ,๐ข,๐ฆ,๐,๐,๐ฆ,๐,๐จ".replaceAll(',', '')
// ๅ
จ้จ
const allEmojis = "๐๐๐๐๐๐๐๐ฅญ๐๐๐๐๐๐๐ซ๐ฅ๐
๐ซ๐ฅฅ๐ฅ๐๐ฅ๐ฅ๐ฝ๐ถ๏ธ๐ซ๐ฅ๐ฅฌ๐ฅฆ๐ง๐ง
๐๐ฅ๐ฐ๐๐ฅ๐ฅ๐ซ๐ฅจ๐ฅฏ๐ฅ๐ง๐ง๐๐๐ฅฉ๐ฅ๐๐๐๐ญ๐ฅช๐ฎ๐ฏ๐ซ๐ฅ๐ง๐ฅ๐ณ๐ฅ๐ฒ๐ซ๐ฅฃ๐ฅ๐ฟ๐ง๐ง๐ฅซ๐ฑ๐๐๐๐๐๐๐ ๐ข๐ฃ๐ค๐ฅ๐ฅฎ๐ก๐ฅ๐ฅ ๐ฅก๐ฆช๐ฆ๐ง๐จ๐ฉ๐ช๐๐ฐ๐ง๐ฅง๐ซ๐ฌ๐ญ๐ฎ๐ฏ๐ผ๐ฅโ๐ซ๐ต๐ถ๐พ๐ท๐ธ๐น๐บ๐ป๐ฅ๐ฅ๐ฅค๐ง๐ง๐ง๐ง๐ฅข๐ฝ๏ธ๐ด๐ฅ๐ฃ๐พ๐๏ธโฐ๏ธ๐๐ป๐๏ธ๐๏ธ๐๏ธ๐๏ธ๐๏ธ๐๏ธ๐๏ธ๐๏ธ๐๐๏ธ๐๏ธ๐ ๐ก๐ข๐ฃ๐ค๐ฅ๐ฆ๐จ๐ฉ๐ช๐ซ๐ฌ๐ญ๐ฏ๐ฐ๐๐ผ๐ฝโช๐๐๐โฉ๏ธ๐โฒโบ๐๐๐๏ธ๐๐
๐๐๐๐ ๐ก๐ข๐๐๐๐
๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐๐ป๐๐๐๐๏ธ๐๏ธ๐ต๐บ๐ฒ๐ด๐๐ฃ๏ธ๐ค๏ธโฝ๐จ๐ฅ๐ฆ๐งโโต๐ค๐ณ๏ธโด๏ธ๐ฅ๏ธ๐ขโ๏ธ๐ฉ๏ธ๐ซ๐ฌ๐ช๐บ๐๐๐ ๐ก๐ฐ๏ธ๐๐ธ๐ช๐ ๐โฑ๏ธ๐๐๐๐ด๐ต๐ถ๐ท๐ฟ๐๐๐๐
๐๐๐๐ฅ๐ซ๐ฆ๐จ๐ต๐๐ฆ๐ฆง๐ถ๐๐ฆฎ๐โ๐ฆบ๐ฉ๐บ๐ฆ๐ฆ๐ฑ๐๐โโฌ๐ฆ๐ฏ๐
๐๐ด๐๐ฆ๐ฆ๐ฆ๐ฆฌ๐ฎ๐๐๐๐ท๐๐๐ฝ๐๐๐๐ช๐ซ๐ฆ๐ฆ๐๐ฆฃ๐ฆ๐ฆ๐ญ๐๐๐น๐ฐ๐๐ฟ๏ธ๐ฆซ๐ฆ๐ฆ๐ป๐ปโโ๏ธ๐จ๐ผ๐ฆฅ๐ฆฆ๐ฆจ๐ฆ๐ฆก๐พ๐ฆ๐๐๐ฃ๐ค๐ฅ๐ฆ๐ง๐๏ธ๐ฆ
๐ฆ๐ฆข๐ฆ๐ฆค๐ชถ๐ฆฉ๐ฆ๐ฆ๐ธ๐๐ข๐ฆ๐๐ฒ๐๐ฆ๐ฆ๐ณ๐๐ฌ๐ฆญ๐๐ ๐ก๐ฆ๐๐๐๐ฆ๐๐๐๐ชฒ๐๐ฆ๐ชณ๐ท๏ธ๐ธ๏ธ๐ฆ๐ฆ๐ชฐ๐ชฑ๐ฆ ๐๐ธ๐ฎ๐ต๏ธ๐น๐ฅ๐บ๐ป๐ผ๐ท๐ฑ๐ชด๐ฒ๐ณ๐ด๐ต๐พ๐ฟโ๏ธ๐๐๐๐๐๐ฐ๐ฆ๐ฆ๐ฆ๐ฆ๐๐๐๐๐ชจ๐๐๐๐๐๐๐๐๐๐๐๐โ๏ธ๐๐โญ๐๐ โ๏ธโ
โ๏ธ๐ค๏ธ๐ฅ๏ธ๐ฆ๏ธ๐ง๏ธ๐จ๏ธ๐ฉ๏ธ๐ช๏ธ๐ซ๏ธ๐ฌ๏ธ๐โ๏ธโโกโ๏ธโ๏ธโโ๏ธ๐ฅ๐ง๐๐โจ๐๐๐๐๐๐๐๐
๐คฃ๐๐๐๐๐๐๐ฅฐ๐๐คฉ๐๐โบ๏ธ๐๐๐ฅฒ๐๐๐๐คช๐๐ค๐ค๐คญ๐คซ๐ค๐ค๐คจ๐๐๐ถ๐๐๐๐ฌ๐คฅ๐๐๐ช๐คค๐ด๐ท๐ค๐ค๐คข๐คฎ๐คง๐ฅต๐ฅถ๐ฅด๐ต๐คฏ๐ค ๐ฅณ๐ฅธ๐๐ค๐ง๐๐๐โน๏ธ๐ฎ๐ฏ๐ฒ๐ณ๐ฅบ๐ฆ๐ง๐จ๐ฐ๐ฅ๐ข๐ญ๐ฑ๐๐ฃ๐๐๐ฉ๐ซ๐ฅฑ๐ค๐ก๐ ๐คฌ๐๐ฟ๐โ ๏ธ๐ฉ๐คก๐น๐บ๐ป๐ฝ๐พ๐ค๐บ๐ธ๐น๐ป๐ผ๐ฝ๐๐ฟ๐พ๐๐๐ค๐๏ธโ๐๐๐ค๐คโ๏ธ๐ค๐ค๐ค๐ค๐๐๐๐๐โ๏ธ๐๐โ๐๐ค๐ค๐๐๐๐คฒ๐ค๐โ๏ธ๐
๐คณ๐ช๐ฆพ๐ฆฟ๐ฆต๐ฆถ๐๐ฆป๐๐ง ๐ซ๐ซ๐ฆท๐ฆด๐๐๏ธ๐
๐๐ถ๐ง๐ฆ๐ง๐ง๐ฑ๐จ๐ง๐จโ๐ฆฐ๐จโ๐ฆฑ๐จโ๐ฆณ๐จโ๐ฆฒ๐ฉ๐ฉโ๐ฆฐ๐งโ๐ฆฐ๐ฉโ๐ฆฑ๐งโ๐ฆฑ๐ฉโ๐ฆณ๐งโ๐ฆณ๐ฉโ๐ฆฒ๐งโ๐ฆฒ๐ฑโโ๏ธ๐ฑโโ๏ธ๐ง๐ด๐ต๐๐โโ๏ธ๐โโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐
๐
โโ๏ธ๐
โโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐คฆ๐คฆโโ๏ธ๐คฆโโ๏ธ๐คท๐คทโโ๏ธ๐คทโโ๏ธ๐งโโ๏ธ๐จโโ๏ธ๐ฉโโ๏ธ๐งโ๐๐จโ๐๐ฉโ๐๐งโ๐ซ๐จโ๐ซ๐ฉโ๐ซ๐งโโ๏ธ๐จโโ๏ธ๐ฉโโ๏ธ๐งโ๐พ๐จโ๐พ๐ฉโ๐พ๐งโ๐ณ๐จโ๐ณ๐ฉโ๐ณ๐งโ๐ง๐จโ๐ง๐ฉโ๐ง๐งโ๐ญ๐จโ๐ญ๐ฉโ๐ญ๐งโ๐ผ๐จโ๐ผ๐ฉโ๐ผ๐งโ๐ฌ๐จโ๐ฌ๐ฉโ๐ฌ๐งโ๐ป๐จโ๐ป๐ฉโ๐ป๐งโ๐ค๐จโ๐ค๐ฉโ๐ค๐งโ๐จ๐จโ๐จ๐ฉโ๐จ๐งโโ๏ธ๐จโโ๏ธ๐ฉโโ๏ธ๐งโ๐๐จโ๐๐ฉโ๐๐งโ๐๐จโ๐๐ฉโ๐๐ฎ๐ฎโโ๏ธ๐ฎโโ๏ธ๐ต๏ธ๐ต๏ธโโ๏ธ๐ต๏ธโโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐ฅท๐ท๐ทโโ๏ธ๐ทโโ๏ธ๐คด๐ธ๐ณ๐ณโโ๏ธ๐ณโโ๏ธ๐ฒ๐ง๐คต๐คตโโ๏ธ๐คตโโ๏ธ๐ฐ๐ฐโโ๏ธ๐ฐโโ๏ธ๐คฐ๐คฑ๐ฉโ๐ผ๐จโ๐ผ๐งโ๐ผ๐ผ๐
๐คถ๐งโ๐๐ฆธ๐ฆธโโ๏ธ๐ฆธโโ๏ธ๐ฆน๐ฆนโโ๏ธ๐ฆนโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐ถ๐ถโโ๏ธ๐ถโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐งโ๐ฆฏ๐จโ๐ฆฏ๐ฉโ๐ฆฏ๐งโ๐ฆผ๐จโ๐ฆผ๐ฉโ๐ฆผ๐งโ๐ฆฝ๐จโ๐ฆฝ๐ฉโ๐ฆฝ๐๐โโ๏ธ๐โโ๏ธ๐๐บ๐ด๏ธ๐ฏ๐ฏโโ๏ธ๐ฏโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโ๐คโ๐ง๐ญ๐ซ๐ฌ๐๐ฉโโค๏ธโ๐โ๐จ๐จโโค๏ธโ๐โ๐จ๐ฉโโค๏ธโ๐โ๐ฉ๐๐ฉโโค๏ธโ๐จ๐จโโค๏ธโ๐จ๐ฉโโค๏ธโ๐ฉ๐ช๐จโ๐ฉโ๐ฆ๐จโ๐ฉโ๐ง๐จโ๐ฉโ๐งโ๐ฆ๐จโ๐ฉโ๐ฆโ๐ฆ๐จโ๐ฉโ๐งโ๐ง๐จโ๐จโ๐ฆ๐จโ๐จโ๐ง๐จโ๐จโ๐งโ๐ฆ๐จโ๐จโ๐ฆโ๐ฆ๐จโ๐จโ๐งโ๐ง๐ฉโ๐ฉโ๐ฆ๐ฉโ๐ฉโ๐ง๐ฉโ๐ฉโ๐งโ๐ฆ๐ฉโ๐ฉโ๐ฆโ๐ฆ๐ฉโ๐ฉโ๐งโ๐ง๐จโ๐ฆ๐จโ๐ฆโ๐ฆ๐จโ๐ง๐จโ๐งโ๐ฆ๐จโ๐งโ๐ง๐ฉโ๐ฆ๐ฉโ๐ฆโ๐ฆ๐ฉโ๐ง๐ฉโ๐งโ๐ฆ๐ฉโ๐งโ๐ง๐ฃ๏ธ๐ค๐ฅ๐ซ๐ฃ๐งณ๐โ๏ธ๐๐งต๐งถ๐๐ถ๏ธ๐ฅฝ๐ฅผ๐ฆบ๐๐๐๐งฃ๐งค๐งฅ๐งฆ๐๐๐ฅป๐ฉฑ๐ฉฒ๐ฉณ๐๐๐๐๐๐๐ฉด๐๐๐ฅพ๐ฅฟ๐ ๐ก๐ฉฐ๐ข๐๐๐ฉ๐๐งข๐ชโ๏ธ๐๐๐ผ๐ฉธ๐๐ณ๏ธ๐ฃ๐๐๐ช๐บ๐บ๏ธ๐งญ๐งฑ๐๐ฆฝ๐ฆผ๐ข๏ธ๐๏ธ๐งณโโณโโฐโฑ๏ธโฒ๏ธ๐ฐ๏ธ๐ก๏ธโฑ๏ธ๐งจ๐๐๐๐๐๐๐งง๐๐๐คฟ๐ช๐ช๐ฎ๐ช๐งฟ๐น๏ธ๐งธ๐ช
๐ช๐ผ๏ธ๐งต๐ชก๐งถ๐ชข๐๏ธ๐ฟ๐๐ฏ๐๏ธ๐๏ธ๐๏ธ๐ป๐ช๐ฑ๐ฒโ๏ธ๐๐๐ ๐๐๐ป๐ฅ๏ธ๐จ๏ธโจ๏ธ๐ฑ๏ธ๐ฒ๏ธ๐ฝ๐พ๐ฟ๐๐งฎ๐ฅ๐๏ธ๐ฝ๏ธ๐บ๐ท๐ธ๐น๐ผ๐๐๐ฏ๏ธ๐ก๐ฆ๐ฎ๐ช๐๐๐๐๐๐๐๐๐๐๐๐๐ฐ๐๏ธ๐๐๐ท๏ธ๐ฐ๐ช๐ด๐ต๐ถ๐ท๐ธ๐ณ๐งพโ๏ธ๐ง๐จ๐ฉ๐ค๐ฅ๐ฆ๐ซ๐ช๐ฌ๐ญ๐ฎ๐ณ๏ธโ๏ธโ๏ธ๐๏ธ๐๏ธ๐๏ธ๐๏ธ๐๐๐๐๏ธ๐
๐๐๏ธ๐๏ธ๐๐๐๐๐๐๐๐๐๏ธ๐๐โ๏ธ๐๏ธ๐๏ธ๐๏ธ๐๐๐๐๐๐๏ธ๐จ๐ชโ๏ธโ๏ธ๐ ๏ธ๐ก๏ธโ๏ธ๐ซ๐ช๐ก๏ธ๐ช๐ง๐ช๐ฉโ๏ธ๐๏ธโ๏ธ๐ฆฏ๐โ๏ธ๐ช๐งฐ๐งฒ๐ชโ๏ธ๐งช๐งซ๐งฌ๐ฌ๐ญ๐ก๐๐ฉธ๐๐ฉน๐ฉบ๐ช๐ช๐ช๐๏ธ๐๏ธ๐ช๐ฝ๐ช ๐ฟ๐๐ชค๐ช๐งด๐งท๐งน๐งบ๐งป๐ชฃ๐งผ๐ชฅ๐งฝ๐งฏ๐๐ฌโฐ๏ธ๐ชฆโฑ๏ธ๐ฟ๐ชง๐ฐ๐ด๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐คบ๐โท๏ธ๐๐๏ธ๐๏ธโโ๏ธ๐๏ธโโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐ฃ๐ฃโโ๏ธ๐ฃโโ๏ธ๐๐โโ๏ธ๐โโ๏ธโน๏ธโน๏ธโโ๏ธโน๏ธโโ๏ธ๐๏ธ๐๏ธโโ๏ธ๐๏ธโโ๏ธ๐ด๐ดโโ๏ธ๐ดโโ๏ธ๐ต๐ตโโ๏ธ๐ตโโ๏ธ๐คธ๐คธโโ๏ธ๐คธโโ๏ธ๐คผ๐คผโโ๏ธ๐คผโโ๏ธ๐คฝ๐คฝโโ๏ธ๐คฝโโ๏ธ๐คพ๐คพโโ๏ธ๐คพโโ๏ธ๐คน๐คนโโ๏ธ๐คนโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ช๐น๐ผ๐ถ๐๏ธ๐๏ธ๐ซ๐๏ธ๐๐
๐ฅ๐ฅ๐ฅโฝโพ๐ฅ๐๐๐๐๐พ๐ฅ๐ณ๐๐๐๐ฅ๐๐ธ๐ฅ๐ฅ๐ฅ
โณโธ๏ธ๐ฃ๐ฝ๐ฟ๐ท๐ฅ๐ฏ๐ฑ๐ฎ๐ฐ๐ฒ๐งฉโ๏ธ๐ญ๐จ๐งต๐งถ๐ผ๐ค๐ง๐ท๐ช๐ธ๐น๐บ๐ป๐ฅ๐ช๐ฌ๐น๐๐๐๐๐๐๐๐โฃ๏ธ๐โค๏ธ๐งก๐๐๐๐๐ค๐ค๐ค๐ฏ๐ข๐ฌ๐๏ธโ๐จ๏ธ๐จ๏ธ๐ฏ๏ธ๐ญ๐ค๐ฎโจ๏ธ๐๐๐๐ง๐๐๐๐๐๐๐๐๐๐ ๐๐ก๐๐ข๐๐ฃ๐๐ค๐๐ฅ๐๐ฆ๐โ ๏ธโฅ๏ธโฆ๏ธโฃ๏ธ๐๐๐ด๐๐๐๐๐ข๐ฃ๐ฏ๐๐๐ต๐ถ๐น๐๐ง๐ฎ๐ฐโฟ๐น๐บ๐ป๐ผ๐พโ ๏ธ๐ธโ๐ซ๐ณ๐ญ๐ฏ๐ฑ๐ท๐ต๐โข๏ธโฃ๏ธโฌ๏ธโ๏ธโก๏ธโ๏ธโฌ๏ธโ๏ธโฌ
๏ธโ๏ธโ๏ธโ๏ธโฉ๏ธโช๏ธโคด๏ธโคต๏ธ๐๐๐๐๐๐๐๐โ๏ธ๐๏ธโก๏ธโธ๏ธโฏ๏ธโ๏ธโฆ๏ธโช๏ธโฎ๏ธ๐๐ฏโโโโโโโโโโโโโ๐๐๐โถ๏ธโฉโญ๏ธโฏ๏ธโ๏ธโชโฎ๏ธ๐ผโซ๐ฝโฌโธ๏ธโน๏ธโบ๏ธโ๏ธ๐ฆ๐
๐๐ถ๐ณ๐ดโ๏ธโ๏ธโ๏ธโโโโพ๏ธโผ๏ธโ๏ธโโโโใฐ๏ธ๐ฑ๐ฒโ๏ธโป๏ธโ๏ธ๐ฑ๐๐ฐโญโ
โ๏ธโ๏ธโโโฐโฟ ใฝ๏ธโณ๏ธโด๏ธโ๏ธยฉ๏ธยฎ๏ธโข๏ธ#๏ธโฃ*๏ธโฃ0๏ธโฃ1๏ธโฃ2๏ธโฃ3๏ธโฃ4๏ธโฃ5๏ธโฃ6๏ธโฃ7๏ธโฃ8๏ธโฃ9๏ธโฃ๐๐ ๐ก๐ข๐ฃ๐ค๐
ฐ๏ธ๐๐
ฑ๏ธ๐๐๐โน๏ธ๐โ๏ธ๐๐๐
พ๏ธ๐๐
ฟ๏ธ๐๐๐๐๐๏ธ๐ท๏ธ๐ถ๐ฏ๐๐น๐๐ฒ๐๐ธ๐ด๐ณใ๏ธใ๏ธ๐บ๐ต๐ด๐ ๐ก๐ข๐ต๐ฃ๐คโซโช๐ฅ๐ง๐จ๐ฉ๐ฆ๐ช๐ซโฌโฌโผ๏ธโป๏ธโพโฝโช๏ธโซ๏ธ๐ถ๐ท๐ธ๐น๐บ๐ป๐ ๐๐ณ๐ฒ๐๐ฉ๐๐ด๐ณ๏ธ๐ณ๏ธโ๐๐ณ๏ธโโง๏ธ"
// ่กจๆ
const expressionEmojis = '๐๐๐๐๐๐
๐คฃ๐๐๐๐๐๐๐ฅฐ๐๐คฉ๐๐โบ๏ธ๐๐๐ฅฒ๐๐๐๐คช๐๐ค๐ค๐คญ๐คซ๐ค๐ค๐คจ๐๐๐ถ๐๐๐๐ฌ๐คฅ๐๐๐ช๐คค๐ด๐ท๐ค๐ค๐คข๐คฎ๐คง๐ฅต๐ฅถ๐ฅด๐ต๐คฏ๐ค ๐ฅณ๐ฅธ๐๐ค๐ง๐๐๐โน๏ธ๐ฎ๐ฏ๐ฒ๐ณ๐ฅบ๐ฆ๐ง๐จ๐ฐ๐ฅ๐ข๐ญ๐ฑ๐๐ฃ๐๐๐ฉ๐ซ๐ฅฑ๐ค๐ก๐ ๐คฌ๐๐ฟ๐โ ๏ธ๐ฉ๐คก๐น๐บ๐ป'
// ๅฐๅจ็ฉ
const animalEmojis = "๐๐ฅ๐ซ๐ฆ๐จ๐ต๐๐ฆ๐ฆง๐ถ๐๐ฆฎ๐โ๐ฆบ๐ฉ๐บ๐ฆ๐ฆ๐ฑ๐๐โโฌ๐ฆ๐ฏ๐
๐๐ด๐๐ฆ๐ฆ๐ฆ๐ฆฌ๐ฎ๐๐๐๐ท๐๐๐ฝ๐๐๐๐ช๐ซ๐ฆ๐ฆ๐๐ฆฃ๐ฆ๐ฆ๐ญ๐๐๐น๐ฐ๐๐ฟ๏ธ๐ฆซ๐ฆ๐ฆ๐ป๐ปโโ๏ธ๐จ๐ผ๐ฆฅ๐ฆฆ๐ฆจ๐ฆ๐ฆก๐พ๐ฆ๐๐๐ฃ๐ค๐ฅ๐ฆ๐ง๐๏ธ๐ฆ
๐ฆ๐ฆข๐ฆ๐ฆค๐ชถ๐ฆฉ๐ฆ๐ฆ๐ธ๐๐ข๐ฆ๐๐ฒ๐๐ฆ๐ฆ๐ณ๐๐ฌ๐ฆญ๐๐ ๐ก๐ฆ๐๐๐๐ฆ๐๐๐๐ชฒ๐๐ฆ๐ชณ๐ท๏ธ๐ธ๏ธ๐ฆ๐ฆ๐ชฐ๐ชฑ๐ฆ ๐๐ธ๐ฎ๐ต๏ธ๐น๐ฅ๐บ๐ป๐ผ๐ท๐ฑ๐ชด๐ฒ๐ณ๐ด๐ต๐พ๐ฟโ๏ธ๐๐๐๐๐๐ฐ๐ฆ๐ฆ๐ฆ๐ฆ"
// ไบบ็ฉ
const personEmojis = "๐ถ๐ง๐ฆ๐ง๐ง๐ฑ๐จ๐ง๐จโ๐ฆฐ๐จโ๐ฆฑ๐จโ๐ฆณ๐จโ๐ฆฒ๐ฉ๐ฉโ๐ฆฐ๐งโ๐ฆฐ๐ฉโ๐ฆฑ๐งโ๐ฆฑ๐ฉโ๐ฆณ๐งโ๐ฆณ๐ฉโ๐ฆฒ๐งโ๐ฆฒ๐ฑโโ๏ธ๐ฑโโ๏ธ๐ง๐ด๐ต๐๐โโ๏ธ๐โโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐
๐
โโ๏ธ๐
โโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐คฆ๐คฆโโ๏ธ๐คฆโโ๏ธ๐คท๐คทโโ๏ธ๐คทโโ๏ธ๐งโโ๏ธ๐จโโ๏ธ๐ฉโโ๏ธ๐งโ๐๐จโ๐๐ฉโ๐๐งโ๐ซ๐จโ๐ซ๐ฉโ๐ซ๐งโโ๏ธ๐จโโ๏ธ๐ฉโโ๏ธ๐งโ๐พ๐จโ๐พ๐ฉโ๐พ๐งโ๐ณ๐จโ๐ณ๐ฉโ๐ณ๐งโ๐ง๐จโ๐ง๐ฉโ๐ง๐งโ๐ญ๐จโ๐ญ๐ฉโ๐ญ๐งโ๐ผ๐จโ๐ผ๐ฉโ๐ผ๐งโ๐ฌ๐จโ๐ฌ๐ฉโ๐ฌ๐งโ๐ป๐จโ๐ป๐ฉโ๐ป๐งโ๐ค๐จโ๐ค๐ฉโ๐ค๐งโ๐จ๐จโ๐จ๐ฉโ๐จ๐งโโ๏ธ๐จโโ๏ธ๐ฉโโ๏ธ๐งโ๐๐จโ๐๐ฉโ๐๐งโ๐๐จโ๐๐ฉโ๐๐ฎ๐ฎโโ๏ธ๐ฎโโ๏ธ๐ต๏ธ๐ต๏ธโโ๏ธ๐ต๏ธโโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐ฅท๐ท๐ทโโ๏ธ๐ทโโ๏ธ๐คด๐ธ๐ณ๐ณโโ๏ธ๐ณโโ๏ธ๐ฒ๐ง๐คต๐คตโโ๏ธ๐คตโโ๏ธ๐ฐ๐ฐโโ๏ธ๐ฐโโ๏ธ๐คฐ๐คฑ๐ฉโ๐ผ๐จโ๐ผ๐งโ๐ผ๐ผ๐
๐คถ๐งโ๐๐ฆธ๐ฆธโโ๏ธ๐ฆธโโ๏ธ๐ฆน๐ฆนโโ๏ธ๐ฆนโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐๐โโ๏ธ๐โโ๏ธ๐ถ๐ถโโ๏ธ๐ถโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐งโ๐ฆฏ๐จโ๐ฆฏ๐ฉโ๐ฆฏ๐จโ๐ฆผ๐งโ๐ฆฝ๐จโ๐ฆฝ๐ฉโ๐ฆฝ๐๐โโ๏ธ๐โโ๏ธ๐๐บ๐ด๏ธ๐ฏ๐ฏโโ๏ธ๐ฏโโ๏ธ๐ง๐งโโ๏ธ๐งโโ๏ธ๐ง๐งโ๐คโ๐ง๐ญ๐ซ๐ฌ"
// ๆๅฟ
const guestrueEmojis = "๐ช๐๐โ๐๐โโ๐๐๐โ๐๐๐๐โ"
// ๅ
ฌๅ
ฑ
const publicEmojis = "โป๐ง๐ฎ๐ฐโฟ๐น๐บ๐ป๐ผ๐พโ ๐ธโ๐ซ๐ณ๐ญ๐ฏ๐ฑ๐ท๐๐"
// ็่
const twelveEmojis = "๐๐๐
๐๐๐๐๐๐๐๐๐"
export {
defEmojis,
allEmojis,
expressionEmojis,
animalEmojis,
personEmojis,
guestrueEmojis,
publicEmojis,
twelveEmojis,
}
- index.vue
<template>
<div class="emoji">
<div v-if="emoji.historyList?.length">
<p>ๆ่ฟไฝฟ็จ</p>
<ul class="history" :class="emoji.historyList?.length ? 'historyShow' : ''">
<li v-for="(item, index) in [...new Set(emoji.historyList)]" :key="index" @click.stop="chooseEmojiDefault(item)"
v-html="item"></li>
</ul>
</div>
<div v-for="items in emojiObj" :key="items.name">
<template v-if="items.name && items.value?.length">
<p>{{ items.name }}</p>
<ul class="default">
<li v-for="(item, index) in items.value" :key="index" @click.stop="chooseEmojiDefault(item)" v-html="item"></li>
</ul>
</template>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref, reactive } from "vue";
import { getAllTypeEmojis } from './utils'
const emit = defineEmits(["emojiHandle"]);
const props = defineProps({
all: {
type: Boolean,
default: false
}
})
const res = getAllTypeEmojis()
console.log(res)
const emojiObj = ref({})
if (props.all) {
emojiObj.value = res
} else {
emojiObj.value = {
defEmojis: res.defEmojis
}
}
const emoji = reactive({
chooseItem: "",
historyList: [],
allEmoji: emojiObj.value,
});
const chooseEmojiDefault = (item: string) => {
emoji.chooseItem = item;
emoji.historyList.unshift(item);
emit("emojiHandle", item);
return item;
};
</script>
<style lang="less" scoped>
.history::-webkit-scrollbar,
.default::-webkit-scrollbar {
display: none;
}
.emoji {
text-align: left;
width: 70vw;
max-height: 20vh;
background: #fff;
overflow-y: auto;
p {
font-size: 14px;
padding: 1vh;
}
.history,
.default {
width: 100%;
height: 20vh;
overflow-y: auto;
li {
display: inline-block;
padding: 1vh;
font-size: 26px;
width: 32px;
height: 32px;
line-height: 1;
overflow: hidden;
cursor: pointer;
}
li:hover {
background-color: #ececec;
}
}
.history {
height: 0;
width: 100%;
position: relative;
transition: all 2.5s;
}
.historyShow {
height: 40px;
}
}
@media screen and (max-width: 800px) {
.emoji {
width: 80vw;
}
}
</style>
- test.vue ไฝฟ็จ็คบไพ
<template>
<smile-outlined
style="font-size: 22px; margin: 0 2vh"
@click="selectEmoji"
/>
<Popover v-model:open="visible" title="" placement="top">
<template #content>
<div>
<Emoji @emojiHandle="emojiHandle" :all="false" />
</div>
</template>
</Popover>
<Textarea
:maxlength="100"
@pressEnter="sendMessage"
class="message-input"
v-model:value.trim="message"
placeholder="ๅ่ฝฆๅ้ๆถๆฏ..."
/>
</template>
<script setup>
import Emoji from "@/components/emoji/index.vue";
import { SmileOutlined } from "@ant-design/icons-vue";
import { Textarea, Popover } from "ant-design-vue";
const cursor = ref(0);
const message = ref('')
const visible = ref(false)
// ๅ้ๆถๆฏ
const sendMessage = () => {}
/**
* ็นๅปๅฑ็คบ่กจๆ
*/
const selectEmoji = () => {
const Textarea = document.querySelector(".message-input");
cursor.value = Textarea?.selectionEnd;
visible.value = !visible.value;
};
/**
* ้ๆฉ่กจๆ
๏ผๅนถๆ่กจๆ
ๆๅ
ฅ่พๅ
ฅๆก
* @param {*} item ้ๆฉ็่กจๆ
*/
const emojiHandle = (item) => {
const msg = message.value;
if (!cursor.value) {
message.value += item;
} else {
message.value = msg.slice(0, cursor.value) + item + msg.slice(cursor.value);
}
};
</script>
ๆป็ป โ
- ๆดไฝๅฎ็ฐ่ตทๆฅๆบ็ฎๅ็๏ผๆฒกๆ่ธฉไปไนๅ
- ๆ่ฟไฝฟ็จ็ฎๅๆฏๅญๅจๅ้็๏ผๅทๆฐๅฐฑๆฒกไบ๏ผๅๆ่่ๅผๅ ฅ่ง่ฒ๏ผๅญๅ ฅๆฐๆฎๅบ๏ผ
- ่กจๆ ๅ ็ปไปถ็ฎๆ็ๅทฒ็ปๅฐ่ฃ ไบๅฅฝไบ๏ผ้่ฆ็ๅฐไผไผด่ชๅ~
็ป่ฏญ๏ผ โ
ๅฆๆๆฌๆๅฏนไฝ ๆๆถ่ท๏ผ้บป็ฆๅจๅจๅ่ดข็ๅฐๆ๏ผ็น็นๅ ณๆณจใ็น็น่ต๏ผ๏ผ๏ผ๐๐๐
ๅฆๆๆไธๅฏนใๅฏไปฅไผๅ็ๅฐๆนๆฌข่ฟๅจ่ฏ่ฎบๅบๆๅบ๏ผ่ฐข่ฐข๐๐