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

Vue.js仿微信聊天窗口展示组件功能的完整攻略如下:

一、背景说明

在网页端实现类似微信聊天窗口展示的组件功能是很常见的需求,在Vue.js中可以通过简单的组件开发实现。以下是具体的实现过程。

二、技术栈要求

在实现过程中,需要用到以下技术栈:

  • Vue.js:前端MVVM框架
  • webpack:模块打包工具
  • Sass:CSS预处理器

三、基础页面结构

首先需要设计一个基础的聊天页面结构,包括聊天记录列表、聊天输入框等要素。其中,聊天记录列表需要支持图片、语音、表情等内容。

示例代码:

<template>
  <div class="chat-box">
    <ul class="chat-list">
      <li v-for="(item, index) in chatList" :key="index" :class="{ 'myself': item.isMyself }">
        <div class="avatar">
          <img :src="item.avatar" alt="avatar">
        </div>
        <div class="content">
          <div v-html="item.content"></div>
        </div>
      </li>
    </ul>
    <div class="chat-input">
      <textarea v-model="message" placeholder="请输入聊天内容"></textarea>
      <button @click="sendMessage">发送</button>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: '',
      chatList: [
        {
          avatar: '',
          content: '你好,有什么需要帮助的吗?',
          isMyself: false
        },
        {
          avatar: '',
          content: '你好,我在网站上面遇到了一个问题,想请你帮忙解决一下。' +
                   '具体的问题是......',
          isMyself: true
        },
        // ...
      ]
    }
  },
  methods: {
    sendMessage() {
      if (!this.message) return
      // 在此处处理消息发送的逻辑
    }
  }
}
</script>

<style scoped>
.chat-box {
  height: 600px;
  padding: 20px;
  box-sizing: border-box;
}
.chat-list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.chat-list li {
  margin: 10px 0;
  padding: 10px 20px;
  border-radius: 10px;
  max-width: 70%;
}
.chat-list li.myself {
  margin-left: 30%;
  text-align: right;
}
.chat-list li .avatar {
  position: relative;
  display: inline-block;
  width: 40px;
  height: 40px;
  margin-right: 10px;
}
.chat-list li .avatar img {
  position: absolute;
  width: 100%;
  height: 100%;
  border-radius: 50%;
}
.chat-list li .content {
  display: inline-block;
  max-width: 100%;
}
.chat-input {
  display: flex;
  align-items: flex-end;
  margin-top: 20px;
}
.chat-input textarea {
  flex: 1;
  margin-right: 10px;
  padding: 10px;
  border-radius: 10px;
  border: none;
  resize: none;
  box-sizing: border-box;
}
.chat-input button {
  padding: 10px;
  border-radius: 10px;
  border: none;
  background-color: #4CAF50;
  color: white;
}
</style>

四、支持图片和表情

接下来需要增加支持图片和表情的功能。在Vue.js中,可以使用第三方组件库,如element-ui、iview等,也可以自行开发组件。

以下是使用element-ui实现的示例代码:

<template>
  <div class="chat-box">
    <ul class="chat-list">
      <li v-for="(item, index) in chatList" :key="index" :class="{ 'myself': item.isMyself }">
        <div class="avatar">
          <img :src="item.avatar" alt="avatar">
        </div>
        <div class="content">
          <div v-html="item.content"></div>
        </div>
      </li>
    </ul>
    <el-input v-model="message" placeholder="请输入聊天内容" class="chat-input">
      <el-button slot="append" @click="sendMessage">发送</el-button>
      <el-button slot="append" @click="chooseImage">图片</el-button>
      <el-button slot="append" @click="chooseEmoji">表情</el-button>
    </el-input>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: '',
      chatList: [
        {
          avatar: '',
          content: '你好,有什么需要帮助的吗?',
          isMyself: false
        },
        {
          avatar: '',
          content: '你好,我在网站上面遇到了一个问题,想请你帮忙解决一下。' +
                   '具体的问题是......',
          isMyself: true
        },
        // ...
      ]
    }
  },
  methods: {
    sendMessage() {
      if (!this.message) return
      // 在此处处理消息发送的逻辑
    },
    chooseImage() {
      // 在此处处理选择图片的逻辑
    },
    chooseEmoji() {
      // 在此处处理选择表情的逻辑
    }
  }
}
</script>

<style scoped>
.chat-box {
  height: 600px;
  padding: 20px;
  box-sizing: border-box;
}
.chat-list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.chat-list li {
  margin: 10px 0;
  padding: 10px 20px;
  border-radius: 10px;
  max-width: 70%;
}
.chat-list li.myself {
  margin-left: 30%;
  text-align: right;
}
.chat-list li .avatar {
  position: relative;
  display: inline-block;
  width: 40px;
  height: 40px;
  margin-right: 10px;
}
.chat-list li .avatar img {
  position: absolute;
  width: 100%;
  height: 100%;
  border-radius: 50%;
}
.chat-list li .content {
  display: inline-block;
  max-width: 100%;
}
.chat-input {
  display: flex;
  align-items: flex-end;
  margin-top: 20px;
}
.chat-input .el-input__inner {
  flex: 1;
  margin-right: 10px;
  padding: 10px;
  border-radius: 10px;
  border: none;
  resize: none;
  box-sizing: border-box;
}
.chat-input .el-button-group .el-button {
  padding: 10px;
  border-radius: 10px;
  border: none;
  background-color: #4CAF50;
  color: white;
}
</style>

五、支持语音

接着需要增加支持语音的功能。在Vue.js中,可以通过使用使用H5录音JS库实现录音和播放功能。

示例代码:

<template>
  <div class="chat-box">
    <ul class="chat-list">
      <li v-for="(item, index) in chatList" :key="index" :class="{ 'myself': item.isMyself }">
        <div class="avatar">
          <img :src="item.avatar" alt="avatar">
        </div>
        <div class="content">
          <div v-html="item.content"></div>
        </div>
      </li>
    </ul>
    <div class="chat-input">
      <div class="chat-input__left">
        <el-button-group>
          <el-button icon="el-icon-picture" @click="chooseImage"></el-button>
          <el-button icon="el-icon-smile" @click="chooseEmoji"></el-button>
          <el-button icon="el-icon-microphone" :class="isRecording ? 'recording' : ''" @touchstart="startRecording" @touchend="stopRecording"></el-button>
        </el-button-group>
      </div>
      <div class="chat-input__right">
        <textarea v-model="message" placeholder="请输入聊天内容"></textarea>
        <el-button @click="sendMessage">发送</el-button>
      </div>
    </div>
  </div>
</template>

<script>
import Recorder from 'recorder-core'

export default {
  data() {
    return {
      message: '',
      isRecording: false,
      recorder: null,
      chatList: [
        {
          avatar: '',
          content: '你好,有什么需要帮助的吗?',
          isMyself: false
        },
        {
          avatar: '',
          content: '你好,我在网站上面遇到了一个问题,想请你帮忙解决一下。' +
                   '具体的问题是......',
          isMyself: true
        },
        // ...
      ]
    }
  },
  methods: {
    sendMessage() {
      if (!this.message) return
      // 在此处处理消息发送的逻辑
    },
    chooseImage() {
      // 在此处处理选择图片的逻辑
    },
    chooseEmoji() {
      // 在此处处理选择表情的逻辑
    },
    startRecording() {
      this.isRecording = true
      this.recorder = new Recorder({
        type: 'mp3'
      })
      this.recorder.start()
    },
    stopRecording() {
      this.isRecording = false
      if (this.recorder) {
        this.recorder.stop(blob => {
          // 在此处处理录音结束后的逻辑,如上传、发送等
        })
      }
    }
  }
}
</script>

<style scoped>
.chat-box {
  height: 600px;
  padding: 20px;
  box-sizing: border-box;
}
.chat-list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.chat-list li {
  margin: 10px 0;
  padding: 10px 20px;
  border-radius: 10px;
  max-width: 70%;
}
.chat-list li.myself {
  margin-left: 30%;
  text-align: right;
}
.chat-list li .avatar {
  position: relative;
  display: inline-block;
  width: 40px;
  height: 40px;
  margin-right: 10px;
}
.chat-list li .avatar img {
  position: absolute;
  width: 100%;
  height: 100%;
  border-radius: 50%;
}
.chat-list li .content {
  display: inline-block;
  max-width: 100%;
}
.chat-input {
  display: flex;
  align-items: flex-end;
  margin-top: 20px;
}
.chat-input__left {
  margin-right: 10px;
}
.chat-input__left .el-button-group .el-button {
  padding: 10px;
  border-radius: 10px;
  border: none;
  background-color: #4CAF50;
  color: white;
}
.chat-input__left .el-button-group .el-button.recording {
  background-color: #f44336;
}
.chat-input__right {
  display: flex;
  align-items: flex-end;
}
.chat-input__right textarea {
  flex: 1;
  margin-right: 10px;
  padding: 10px;
  border-radius: 10px;
  border: none;
  resize: none;
  box-sizing: border-box;
}
.chat-input__right button {
  padding: 10px;
  border-radius: 10px;
  border: none;
  background-color: #4CAF50;
  color: white;
}
</style>

六、总结

以上就是Vue.js仿微信聊天窗口展示组件功能的完整攻略。总的来说,实现起来并不复杂,重点是在于对组件的设计、布局和具体功能实现的考虑。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue.js仿微信聊天窗口展示组件功能 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 详解原生JS动态添加和删除类

    下面就详细讲解一下“详解原生JS动态添加和删除类”的完整攻略。 概述 在前端开发中,动态改变元素的样式是十分常见的需求,其中动态添加类名和动态删除类名就是两种常见的实现方式。通过动态改变元素的类名,可以轻松实现样式的交互效果和动画效果。 动态添加类名 方法一:使用Element.classList方法 Element.classList是DOM API提供的…

    JavaScript 2023年6月10日
    00
  • JavaScript中的方法重载实例

    下面是关于JavaScript中的方法重载实例的完整攻略。 什么是方法重载 方法重载指的是在同一个作用域下,为一个函数定义多个参数列表的函数,这些函数被称为重载函数。当函数被调用时,会根据传入的参数类型和数量的不同,自动选择执行对应的重载函数。在JavaScript中,由于没有类型声明,方法重载需要借助函数内部的判断逻辑来实现。 实现方法重载 实现方法重载的…

    JavaScript 2023年6月11日
    00
  • 在vue中实现嵌套页面(iframe)

    在vue中实现嵌套页面(iframe)需要进行以下步骤: 步骤一:安装依赖 使用vue-cli等工具创建一个vue项目后,在项目根目录下执行以下命令,安装vue-iframe包 npm install –save vue-iframe 步骤二:注册组件 打开项目的main.js,注册全局组件 import Vue from ‘vue’ import vue…

    JavaScript 2023年6月11日
    00
  • NodeJS多种创建WebSocket监听的方式(三种)

    下面是NodeJS多种创建WebSocket监听的方式的完整攻略。 标准 WebSocket 创建方式 在 Node.js 中使用 WebSocket 的第一步是将其作为依赖项添加到您的项目中。您可以使用以下命令执行此操作: npm install –save websocket 在您的项目代码中,您需要加载 WebSocket 模块。这可以通过以下代码行…

    JavaScript 2023年5月28日
    00
  • JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析

    JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析 在网页制作中,为了减少页面的加载时间和提高用户体验,很多时候需要将彩色图片转换为黑白图片。这里提供使用JavaScript+Canvas实现彩色图片转换为黑白图片的方法: 1. 获取图片 首先需要获取图片文件,可以通过以下方法: var img = new Image(); img.sr…

    JavaScript 2023年5月28日
    00
  • Javascript中实现trim()函数的两种方法

    让我们开始讲解Javascript中实现trim()函数的两种方法。 一、背景介绍 在Javascript中,字符串是不可变的,也就是说无法在一个字符串中删除或添加字符,只能通过创建一个新的字符串来变相实现。而实际开发中会遇到需要删除字符串前后的空格的需求,这时候就需要用到trim()函数了。 二、方法一:使用正则表达式 我们可以使用正则表达式将字符串前后的…

    JavaScript 2023年5月27日
    00
  • js中setTimeout的妙用–防止循环超时

    下面是关于 setTimeout 防止循环超时的详细攻略。 原理 在 JavaScript 中,循环时如果耗时过长就可能导致页面卡顿或者浏览器崩溃。为了避免这种情况,可以使用 setTimeout 函数来将循环分批进行处理,从而降低其对页面性能的影响。 setTimeout 函数用于在延时一定时间后执行指定的函数,可以接受两个参数,分别是要执行的函数和延迟的…

    JavaScript 2023年5月28日
    00
  • Javascript POSITIVE_INFINITY 属性

    以下是关于JavaScript POSITIVE_INFINITY属性的完整攻略。 JavaScript POSITIVE_INFINITY属性 JavaScript POSITIVE_INFINITY属性是Number对象的一个属性,它表示JavaScript中的正无穷大。我们可以POSITIVE_INFINITY属性来检查数字是否为正无穷大,或者进行一些…

    JavaScript 2023年5月11日
    00
合作推广
合作推广
分享本页
返回顶部