Vue.js仿微信聊天窗口展示组件功能


Posted in Javascript onAugust 11, 2017

源码:https://github.com/doterlin/vue-wxChat

演示地址:https://doterlin.github.io/vue-wxChat/

Vue.js仿微信聊天窗口展示组件功能

运行

# install dependencies
npm install
# serve with hot reload at localhost:8080
npm run dev
# build for production with minification
npm run build

介绍

  • 支持文本和图片的展示(后续将支持对语音类的展示)。
  • 支持滚动加载数据,其中滚动加载依赖我另外一个组件scrollLoader.vue(《Vue.js上下滚动加载组件》)。
  • 支持QQ表情,为了能使用表情请全局注册指令v-emotion,我在main.js做了实现;代码如下:
function toEmotion(text, isNoGif){
 var list = ['微笑', '撇嘴', '色', '发呆', '得意', '流泪', '害羞', '闭嘴', '睡', '大哭', '尴尬', '发怒', '调皮', '呲牙', '惊讶', '难过', '酷', '冷汗', '抓狂', '吐', '偷笑', '愉快', '白眼', '傲慢', '饥饿', '困', '惊恐', '流汗', '憨笑', '大兵', '奋斗', '咒骂', '疑问', '嘘', '晕', '折磨', '衰', '骷髅', '敲打', '再见', '擦汗', '抠鼻', '鼓掌', '糗大了', '坏笑', '左哼哼', '右哼哼', '哈欠', '鄙视', '委屈', '快哭了', '阴险', '亲亲', '吓', '可怜', '菜刀', '西瓜', '啤酒', '篮球', '乒乓', '咖啡', '饭', '猪头', '玫瑰', '凋谢', '示爱', '爱心', '心碎', '蛋糕', '闪电', '炸弹', '刀', '足球', '瓢虫', '便便', '月亮', '太阳', '礼物', '拥抱', '强', '弱', '握手', '胜利', '抱拳', '勾引', '拳头', '差劲', '爱你', 'NO', 'OK', '爱情', '飞吻', '跳跳', '发抖', '怄火', '转圈', '磕头', '回头', '跳绳', '挥手', '激动', '街舞', '献吻', '左太极', '右太极', '嘿哈', '捂脸', '奸笑', '机智', '皱眉', '耶', '红包', '鸡'];
 if (!text) {
  return text;
 }
 text = text.replace(/\[[\u4E00-\u9FA5]{1,3}\]/gi, function(word){
  var newWord = word.replace(/\[|\]/gi,'');
  var index = list.indexOf(newWord);
  var backgroundPositionX = -index * 24
  var imgHTML = '';
  if(index<0){
   return word;
  }
  if (isNoGif) {
   if(index>104){
    return word;
   }
   imgHTML = `<i class="static-emotion" style="background:url(https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/default218877.gif) ${backgroundPositionX}px 0;"></i>`
  } else {
   var path = index>104 ? '/img' : 'https://res.wx.qq.com/mpres/htmledition/images/icon';
   imgHTML = `![](${path}/emotion/${index}.gif)`
  }
  return imgHTML;
 });
 return text;
}
Vue.directive('emotion', {
 bind: function (el, binding) {
  el.innerHTML = toEmotion(binding.value)
 }
});

如何使用?

参数已经在组件中做了说明,并在App.vue中做了演示:

参数和说明:

微信聊天可视化组件

依赖scrollLoader组件, 依赖指令v-emotion(实现请查看main.js)

参数:

width 组件宽度,默认450

wrapBg 外层父元素背景颜色,默认#efefef

maxHeight 展示窗口最高高度, 默认900

contactAvatarUrl 好友头像url

ownerAvatarUrl 微信主人头像url

ownerNickname 微信主人昵称

getUpperData (必需)当滚动到上方时加载数据的方法,返回值要为Promise对象,resolve的结构同data

getUnderData (必需)当滚动到下方时加载数据的方法,返回值同上

data (必需)传入初始化数据, 结构如下:

[{
 direction: 2, //为2表示微信主人发出的消息,1表示联系人
 id: 1, //根据这个来排序消息
 type: 1, //1为文本,2为图片
 content: '你好!![呲牙]', //当type为1时这里是文本消息,当type2为2时这里要存放图片地址;后续会支持语音的显示
 ctime: new Date().toLocaleString() //显示当前消息的发送时间
},
{
 direction: 1,
 id: 2,
 type: 1,
 content: '你也好。[害羞]',
 ctime: new Date().toLocaleString()
}]

完整的使用实例

效果:https://doterlin.github.io/vue-wxChat/

代码:

//主文件,对wxChat的用法做示例
<template>
<wxChat 
 :data="wxChatData"
 :showShade="false"
 contactNickname="简叔"
 :getUpperData="getUpperData"
 :getUnderData="getUnderData"
 :ownerAvatarUrl="ownerAvatarUrl"
 :contactAvatarUrl="contactAvatarUrl"
 :width="420">
</wxChat>
</template>
<script>
import wxChat from './components/wxChat.vue'
export default {
 name: 'app',
 data () {
 return {
  upperTimes: 0,
  underTimes: 0,
  upperId: 0,
  underId: 6,
  ownerAvatarUrl: './src/assets/avatar1.png',
  contactAvatarUrl: './src/assets/avatar2.png',
  wxChatData: [{
  direction: 2,
  id: 1,
  type: 1,
  content: '你好!![呲牙]',
  ctime: new Date().toLocaleString()
  },
  {
  direction: 1,
  id: 2,
  type: 1,
  content: '你也好。[害羞]',
  ctime: new Date().toLocaleString()
  },
  {
  direction: 2,
  id: 3,
  type: 1,
  content: '这是我的简历头像:',
  ctime: new Date().toLocaleString()
  },
  {
  direction: 2,
  id: 4,
  type: 2,
  content: './src/assets/wyz.jpg',
  ctime: new Date().toLocaleString()
  },
  {
  direction: 1,
  id: 5,
  type: 1,
  content: '你开心就好。[微笑]',
  ctime: new Date().toLocaleString()
  }]
 }
 },
 components:{wxChat},
 methods:{
 //向上滚动加载数据
 getUpperData(){
  var me = this;
  // 这里为模拟异步加载数据
  // 实际上你可能要这么写:
  // return axios.get('xxx').then(function(result){
  //  return result; //result的格式需要类似下面resolve里面的数组
  // })
  return new Promise(function(resolve){
  setTimeout(function(){
   //模拟加载完毕
   if(me.upperTimes>3){
   return resolve([]);
   }
   //加载数据
   resolve([{
    direction: 2,
    id: me.upperId-1,
    type: 1,
    content: '向上滚动加载第 ' + me.upperTimes +' 条!',
    ctime: new Date().toLocaleString()
   },
   {
    direction: 1,
    id: me.upperId-2,
    type: 1,
    content: '向上滚动加载第 ' + me.upperTimes +' 条!',
    ctime: new Date().toLocaleString()
   }]
   )
  }, 1000);
  me.upperId= me.upperId+2;
  me.upperTimes++;
  })
 },
 getUnderData(){
  var me = this;
  //意义同getUpperData()
  return new Promise(function(resolve){
  setTimeout(function(){
   //模拟加载完毕
   if(me.underTimes>3){
   return resolve([]);
   }
   //加载数据
   resolve(
   [{
    direction: 1,
    id: me.underId+1,
    type: 1,
    content: '向下滚动加载第 ' + me.underTimes +' 条!',
    ctime: new Date().toLocaleString()
   },
   {
    direction: 2,
    id: me.underId+2,
    type: 1,
    content: '向下滚动加载第 ' + me.underTimes +' 条!',
    ctime: new Date().toLocaleString()
   }]
   )
  }, 1000);
  me.underId = me.underId+2;
  me.underTimes++;
  })
 }
 }
}
</script>
<style>
*{
 margin: 0;
 padding: 0;
}
#app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
h1, h2 {
 font-weight: normal;
}
ul {
 list-style-type: none;
 padding: 0;
}
li {
 display: inline-block;
}
</style>

欢迎 start:

https://github.com/doterlin/vue-wxChat

总结

以上所述是小编给大家介绍的Vue.js仿微信聊天窗口展示组件功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jquery星级插件、支持页面中多次使用
Mar 25 Javascript
javascript变量作用域使用中常见错误总结
Mar 26 Javascript
javascript 上下banner替换具体实现
Nov 14 Javascript
JavaScript采用递归算法计算阶乘实例
Aug 04 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
Aug 11 Javascript
Vue.js第二天学习笔记(vue-router)
Dec 01 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
Dec 27 Javascript
原生JS实现图片翻书效果
Feb 16 Javascript
JavaScript适配器模式详解
Oct 19 Javascript
基于打包工具Webpack进行项目开发实例
May 29 Javascript
layer.close()关闭进度条和Iframe窗的方法
Aug 17 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
Aug 27 Javascript
Node.js服务器开启Gzip压缩教程
Aug 11 #Javascript
JS SetInterval 代码实现页面轮询
Aug 11 #Javascript
IScroll5实现下拉刷新上拉加载的功能实例
Aug 11 #Javascript
详谈JS中数组的迭代方法和归并方法
Aug 11 #Javascript
原生js 封装get ,post, delete 请求的实例
Aug 11 #Javascript
laydate 显示结束时间不小于开始时间的实例
Aug 11 #Javascript
JS非空验证及邮箱验证的实例
Aug 11 #Javascript
You might like
fgetcvs在linux的问题
2012/01/15 PHP
php curl post 时出现的问题解决
2014/01/30 PHP
ThinkPHP 模板引擎使用详解
2017/05/07 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
javascript下function声明一些小结
2007/12/28 Javascript
用dom+xhtml+css制作的一个相册效果代码打包下载
2008/01/24 Javascript
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
使用BootStrapValidator完成前端输入验证
2016/09/28 Javascript
Vue.js组件使用开发实例教程
2016/11/01 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
JS实现的简单下拉框联动功能示例
2018/05/11 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
Python之PyUnit单元测试实例
2014/10/11 Python
详解Python中的join()函数的用法
2015/04/07 Python
python插入数据到列表的方法
2015/04/30 Python
Tensorflow之Saver的用法详解
2018/04/23 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
Python3随机漫步生成数据并绘制
2018/08/27 Python
Python日志打印里logging.getLogger源码分析详解
2021/01/17 Python
解决img标签上下出现间隙的方法
2016/12/14 HTML / CSS
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
广告学专业毕业生自荐信
2013/09/24 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
银行竞聘报告范文
2014/11/06 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
2015年加油站工作总结
2015/05/13 职场文书
python实现过滤敏感词
2021/05/08 Python
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python
关于Nginx中虚拟主机的一些冷门知识小结
2022/03/03 Servers
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
2022/04/11 PHP