>웹 프론트엔드 >View.js >vuejs에서 채팅 인터페이스를 구현하는 방법

vuejs에서 채팅 인터페이스를 구현하는 방법

藏色散人
藏色散人원래의
2021-09-24 16:43:054039검색

vuejs에서 채팅 인터페이스를 구현하는 방법: 1. "npm install"을 실행하여 종속성을 설치합니다. 2. "scrollLoader.vue"를 통해 데이터 스크롤 로딩을 구현합니다. 3. main.js를 수정합니다. .vue.Can.

vuejs에서 채팅 인터페이스를 구현하는 방법

이 기사의 운영 환경: Windows 7 시스템, vue 버전 2.9.6, DELL G3 컴퓨터.

vuejs에서 채팅 인터페이스를 구현하는 방법은 무엇입니까?

Vue.js는 WeChat 채팅 창 표시 구성 요소 기능을 모방합니다

소스 코드: https://github.com/doterlin/vue-wxChat

데모 주소: https://doterlin.github.io/vue- wxChat /

Run

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

Introduction

  • 은 텍스트 및 사진 표시를 지원합니다(음성 카테고리 표시는 향후 지원 예정).
  • 스크롤 로딩이 내 또 다른 구성 요소인 scrollLoader.vue("Vue.js 위아래 스크롤 로딩 구성 요소")에 의존하는 데이터의 스크롤 로딩을 지원합니다.
  • QQ 이모티콘을 지원하려면 v-emotion 명령을 전역적으로 등록하세요. 코드는 다음과 같습니다.
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 ? &#39;/img&#39; : &#39;https://res.wx.qq.com/mpres/htmledition/images/icon&#39;;
   imgHTML = `![](${path}/emotion/${index}.gif)`
  }
  return imgHTML;
 });
 return text;
}
Vue.directive(&#39;emotion&#39;, {
 bind: function (el, binding) {
  el.innerHTML = toEmotion(binding.value)
 }
});

사용 방법은?

매개변수는 구성요소 설명에 설정되었으며 App.vue에 설명되어 있습니다.

매개변수 및 설명:

WeChat 채팅 시각적 구성요소

는 v-emotion 명령에 따라 달라지는 scrollLoader 구성요소에 따라 다릅니다(main.js 참조). 구현용)

매개변수 :

width 구성 요소 너비, 기본값 450

wrapBg 외부 부모 요소 배경색, 기본값 #efefef

maxHeight 표시 창 최대 높이, 기본값 900

contactAvatarUrl 친구 아바타 url

ownerAvatarUrl WeChat 소유자 아바타 url

ownerNickname WeChat 소유자의 닉네임

getUpperData (필수) 상단으로 스크롤할 때 데이터를 로드하는 방법 반환 값은 Promise 객체여야 합니다. 해결 구조는 data

getUnderData( 필수) 하단으로 스크롤 시 데이터를 로딩하는 방식은 위와 동일합니다.

data(필수) 초기화 데이터를 전달하며, 구조는 다음과 같습니다.

[{
 direction: 2, //为2表示微信主人发出的消息,1表示联系人
 id: 1, //根据这个来排序消息
 type: 1, //1为文本,2为图片
 content: &#39;你好!![呲牙]&#39;, //当type为1时这里是文本消息,当type2为2时这里要存放图片地址;后续会支持语音的显示
 ctime: new Date().toLocaleString() //显示当前消息的发送时间
},
{
 direction: 1,
 id: 2,
 type: 1,
 content: &#39;你也好。[害羞]&#39;,
 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 &#39;./components/wxChat.vue&#39;
export default {
 name: &#39;app&#39;,
 data () {
 return {
  upperTimes: 0,
  underTimes: 0,
  upperId: 0,
  underId: 6,
  ownerAvatarUrl: &#39;./src/assets/avatar1.png&#39;,
  contactAvatarUrl: &#39;./src/assets/avatar2.png&#39;,
  wxChatData: [{
  direction: 2,
  id: 1,
  type: 1,
  content: &#39;你好!![呲牙]&#39;,
  ctime: new Date().toLocaleString()
  },
  {
  direction: 1,
  id: 2,
  type: 1,
  content: &#39;你也好。[害羞]&#39;,
  ctime: new Date().toLocaleString()
  },
  {
  direction: 2,
  id: 3,
  type: 1,
  content: &#39;这是我的简历头像:&#39;,
  ctime: new Date().toLocaleString()
  },
  {
  direction: 2,
  id: 4,
  type: 2,
  content: &#39;./src/assets/wyz.jpg&#39;,
  ctime: new Date().toLocaleString()
  },
  {
  direction: 1,
  id: 5,
  type: 1,
  content: &#39;你开心就好。[微笑]&#39;,
  ctime: new Date().toLocaleString()
  }]
 }
 },
 components:{wxChat},
 methods:{
 //向上滚动加载数据
 getUpperData(){
  var me = this;
  // 这里为模拟异步加载数据
  // 实际上你可能要这么写:
  // return axios.get(&#39;xxx&#39;).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: &#39;向上滚动加载第 &#39; + me.upperTimes +&#39; 条!&#39;,
    ctime: new Date().toLocaleString()
   },
   {
    direction: 1,
    id: me.upperId-2,
    type: 1,
    content: &#39;向上滚动加载第 &#39; + me.upperTimes +&#39; 条!&#39;,
    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: &#39;向下滚动加载第 &#39; + me.underTimes +&#39; 条!&#39;,
    ctime: new Date().toLocaleString()
   },
   {
    direction: 2,
    id: me.underId+2,
    type: 1,
    content: &#39;向下滚动加载第 &#39; + me.underTimes +&#39; 条!&#39;,
    ctime: new Date().toLocaleString()
   }]
   )
  }, 1000);
  me.underId = me.underId+2;
  me.underTimes++;
  })
 }
 }
}
</script>
<style>
*{
 margin: 0;
 padding: 0;
}
#app {
 font-family: &#39;Avenir&#39;, 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>

시작에 오신 것을 환영합니다:

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

추천: " 5개의 vue.js 비디오 튜토리얼 중 최신 선택"

위 내용은 vuejs에서 채팅 인터페이스를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.