项目源码请移步:bbs
效果
实现思路
- 表情切换
人物、动物、小黄人不同表情之间的切换实际就是组件的切换
- emoji表情
emoji表情本身就是一种字符 如需其他emoji表情可参考 EmojiAll中文官方网站
需要注意的就是数据库的存储格式需要支持emoji表情,我项目中使用的mysql(utf8mb4)
- 小黄人表情
我的方案是gif图或png(或其他格式)图,在输入框内可以看到点击小黄人实际录入的是“[小黄人-微笑]”一段文案,实际上数据库内存的也是“[小黄人-微笑]”。但我们更关心的是页面如何反显这张图呢?
答案是正则
export default {data() {return {minions:{'[小黄人-微笑]':'f0/xhrnew_weixiao_org.png','[小黄人-剪刀手]':'63/xhrnew_jiandaoshou_org.png','[小黄人-不屑]':'b2/xhrnew_buxie_org.png','[小黄人-高兴]':'41/xhrnew_gaoxing_org.png','[小黄人-惊讶]':'fd/xhrnew_jingya_thumb.png','[小黄人-委屈]':'79/xhrnew_weiqu_org.png','[小黄人-坏笑]':'be/xhrnew_huaixiao_thumb.png','[小黄人-白眼]':'e2/xhrnew_baiyan_org.png','[小黄人-无奈]':'15/xhrnew_wunai_org.png','[小黄人-得意]':'c8/xhrnew_deyi_org.png'}}},filters:{formatMinions:function(content, minions){var res = ""if(content){res = content.replace(/\[(.*?)\]/gi,(item)=>{if(item.indexOf('小黄人-') != -1){let suffix = minions[item]return `<image class="emoji-sticker" src="https://face.t.sinajs.cn/t4/appstyle/expression/ext/normal/${suffix}" mode=""></image>`}return ""})}return res}}}
<view class="pub-v3"><text class="articled-t3-a4" v-html="$options.filters.formatMinions(articleContent,minions)"></text></view>