温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-07-09 10:42:38 阅读:258 作者:小新 栏目:web开发
Vue开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

这篇文章主要为大家展示了“Vue.js如何模仿微信聊天窗口展示组件功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue.js如何模仿微信聊天窗口展示组件功能”这篇文章吧。

效果图

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}\]/gifunction(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" ></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', {
 bindfunction (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//根据这个来排序消息
 type1//1为文本,2为图片
 content: '你好!![呲牙]'//当type为1时这里是文本消息,当type2为2时这里要存放图片地址;后续会支持语音的显示
 ctime: new Date().toLocaleString() //显示当前消息的发送时间
},
{
 direction: 1,
 id: 2,
 type1,
 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 {
  upperTimes0,
  underTimes0,
  upperId0,
  underId6,
  ownerAvatarUrl'./src/assets/avatar1.png',
  contactAvatarUrl'./src/assets/avatar2.png',
  wxChatData: [{
  direction2,
  id1,
  type1,
  content'你好!![呲牙]',
  ctimenew Date().toLocaleString()
  },
  {
  direction1,
  id2,
  type1,
  content'你也好。[害羞]',
  ctimenew Date().toLocaleString()
  },
  {
  direction2,
  id3,
  type1,
  content'这是我的简历头像:',
  ctimenew Date().toLocaleString()
  },
  {
  direction2,
  id4,
  type2,
  content'./src/assets/wyz.jpg',
  ctimenew Date().toLocaleString()
  },
  {
  direction1,
  id5,
  type1,
  content'你开心就好。[微笑]',
  ctimenew 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([{
    direction2,
    id: me.upperId-1,
    type1,
    content'向上滚动加载第 ' + me.upperTimes +' 条!',
    ctimenew Date().toLocaleString()
   },
   {
    direction1,
    id: me.upperId-2,
    type1,
    content'向上滚动加载第 ' + me.upperTimes +' 条!',
    ctimenew 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(
   [{
    direction1,
    id: me.underId+1,
    type1,
    content'向下滚动加载第 ' + me.underTimes +' 条!',
    ctimenew Date().toLocaleString()
   },
   {
    direction2,
    id: me.underId+2,
    type1,
    content'向下滚动加载第 ' + me.underTimes +' 条!',
    ctimenew Date().toLocaleString()
   }]
   )
  }, 1000);
  me.underId = me.underId+2;
  me.underTimes++;
  })
 }
 }
}
</script>
<style>
*{
 margin0;
 padding0;
}
#app {
 font-family'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color#2c3e50;
 margin-top60px;
}
h2h3 {
 font-weight: normal;
}
ul {
 list-style-type: none;
 padding0;
}
li {
 display: inline-block;
}
</style>

以上是“Vue.js如何模仿微信聊天窗口展示组件功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×