项目作者: rishiqing

项目描述 :
An emoji component for vue2.0
高级语言: CSS
项目地址: git://github.com/rishiqing/vue-emoji.git
创建时间: 2017-03-17T08:52:03Z
项目社区:https://github.com/rishiqing/vue-emoji

开源协议:MIT License

下载


vue-emoji


Build Status
Downloads
Version
License


基于 Vue2.0 的emoji插件

English

Vue-emoji

安装

  1. yarn add rui-vue-emoji

使用示例

  1. <link rel="stylesheet" type="text/css" href="./node_modules/vue-emoji-component/dist/vue-emoji.css">
  2. <script src = './vue.min.js'></script>
  3. <script src = './node_modules/vue-emoji-component/dist/vue-emoji.js'></script>
  1. <div id="app">
  2. <div>
  3. <h1>Vue-Emoji</h1>
  4. <div contenteditable="" ref = 'edit' focus></div>
  5. <button ref = 'btn' @click = 'showEmoji = !showEmoji'>emoji</button>
  6. <vue-emoji
  7. v-show = 'showEmoji'
  8. ref = 'emoji'
  9. @select = 'showEmoji = false'
  10. @hide = 'handleHide'
  11. ></vue-emoji>
  12. </div>
  13. </div>
  1. new Vue({
  2. el: '#app',
  3. components: {
  4. VueEmoji
  5. },
  6. data () {
  7. return {
  8. showEmoji : false
  9. }
  10. },
  11. mounted () {
  12. this.$refs.emoji.appendTo({
  13. area: this.$refs.edit,
  14. btn: this.$refs.btn,
  15. position: 'top left'
  16. });
  17. },
  18. methods: {
  19. hide () {
  20. this.showEmoji = false;
  21. },
  22. handleHide (e) {
  23. this.hide();
  24. }
  25. }
  26. });

webpack中引入

  1. // styles.js
  2. import 'rui-vue-emoji/dist/vue-emoji.css';

你也可以考虑将雪碧图和单个图标上传到CDN, 那么需要改动一下jscss文件。

  1. [class*="sprite-"] {
  2. background-image: url("https://your.cdn.path/")!important;
  3. }
  1. mounted () {
  2. this.$refs.emoji.appendTo({
  3. area: this.$refs.edit,
  4. btn: this.$refs.btn,
  5. position: 'top left'
  6. }).setPath('https://your.cdn.path/');
  7. },

需要注意的是, 在css中控制雪碧图的路径, 在js中控制最后引用的单个表情图片的路径。

选项

事件

  • select: 选中表情时会触发此事件, 事件参数为选中的表情对应的图片
  • hide: 触发隐藏事件, 当发生这个事件后, 需要在父组件中对弹窗进行关闭, 含有一个事件对象, 表示点击的元素。

方法

appendTo

这个方法需要在父组件mounted的是时候进行调用, 以便初始化参数。
至少需要传递两个参数area以及btn, area表示需要将表情插入的地方, btn表示触发表情弹窗显示的按钮。
可选的position选项用于设置表情框的位置, 默认为top center, 表示在位于按钮的上方, 居中显示。 当第一个参数不为top的时候, 将会置于按钮下方。 第二个参数表示弹窗相对于按钮的位置, 可选的有left, center, right三个选项。

calcPosition

用于重新计算弹窗的位置, 当[contenteditable]内容增加的情况下, 通常其高度也会变化, 这个时候需要重新进行计算以更新弹窗的位置。 遗憾的是, 我没能找到一种自动监听其变化的方法, 所以需要手动监听, 然后再进行调用。

app.vue

  1. watch: {
  2. showEmoji (value) { // showEmoji 为控制弹窗隐藏显示的属性。
  3. if (value) {
  4. this.$refs.emoji.calcPosition();
  5. }
  6. }
  7. }

getImgPathByUnicode

该方法接收一个表情编码, 如果能够找到对应的图片, 则会返回基于前面设定的路径的图片, 如果没有找到, 则会返回null。

  1. <vue-emoji
  2. v-show = 'showEmoji'
  3. ref = 'emoji'
  4. :unicode='true'
  5. @select = 'handleSelect'
  6. @hide = 'hide()'
  7. ></vue-emoji>
  1. handleSelect (img) {
  2. if (img.nodeType === 3) {
  3. var $img = new Image();
  4. $img.src = this.$refs.emoji.getImgPathByUnicode(img.textContent);
  5. $app1.appendChild($img);
  6. }
  7. this.hide();
  8. }

getUnicodeByImgPath

该方法接受一个图片地址, 返回对应的unicode编码的表情

setPath

用于指定所需使用的图片的地址路径。 默认为当前根目录下的images/, 推荐使用CDN.

属性

unicode

默认情况下当选中一个表情的时候会以图片的方式插入对应区域。你可以通过配置unicode选项来开启Unicode支持, 也就是说, 在这种情况下, 选中一个表情的时候, 会插入对应的Unicode字符。需要注意的是, 相比于图片模式, 使用Unicode的时候会缺少一些表情。

  1. <vue-emoji
  2. v-show = 'showEmoji'
  3. ref = 'emoji'
  4. :unicode='true'
  5. @select = 'hide()'
  6. @hide = 'hide()'
  7. ></vue-emoji>

captions

默认情况下, 会使用表情、自然、物品、地点、符号来作为每个emoji栏目的标题, 可以通过使用组件的时候传入captions参数, 来改变标题文字。

  1. <vue-emoji
  2. v-show = 'showEmoji'
  3. ref = 'emoji'
  4. :captions = 'captions'
  5. @select = 'showEmoji = false'
  6. @hide = 'handleHide'
  7. ></vue-emoji>
  1. data () {
  2. return {
  3. captions: ['Expressions', 'Nature', 'Goods', 'Lacation', 'Symbol']
  4. }
  5. }

开发

  1. git clone git@github.com:rishiqing/vue-emoji.git
  2. cd vue-emoji
  3. yarn
  4. npm start

一些小问题

因为接触Vue的时间比较短, 仓促之下做的这个东西也有太多不完善的地方。 比如我希望的是, 能够在template中就将元素的一些属性传递过去, 从而取代在mounted方法里面手动调用appendTo
的方式, 因为在我看来我现在的这种实现就是一个丑陋的hack, 然而当我多次尝试之后, 也没有找到一个能够在父组件中渲染子组件的时候, 向子组件里面传递父组件其他DOM节点的引用的方法。
当然, 也许更大的原因还是在于我设计上的失误。所以, 如果你有更好的方法, 欢迎告诉我, 在下不胜感激。