vue3仿聊天框

本文详细描述了如何在HTML和Vue.js中创建一个聊天应用,实现输入框的回车发送消息功能以及在等待服务器响应时的换行处理。CSS样式还涉及到了滚动条的设计。
摘要由CSDN通过智能技术生成

实现效果:

模仿聊天框,当输入框有内容时,回车发送,shift+enter换行,当上一条问题的回答还未返回时,回车也为换行。

html部分:

<template>
  <div style="background-color: aliceblue;">
    <div id="chatWhole">
      <div id="messageWhole">
        <div v-for="(message, index) in messages" :key="index" :class="message.sender">
          <div class="messageContent">
            <!-- 使用 v-html 渲染消息内容 -->
            <p v-html="formatMessage(message.content)"></p>
          </div>
        </div>
      </div>
      <div id="inputDiv">
        <textarea id="inputIn" placeholder="输入您的消息..." v-model="userMessage" @keydown.enter="handleEnter"></textarea>
        <button id="send" @click="sendMessage" :disabled="isSending">发送</button>
      </div>
    </div>
  </div>
</template>

js部分:

<script setup>
import { ref } from 'vue';

const messages = ref([]);
const userMessage = ref('');
const isSending = ref(false);

function sendMessage() {
  if (userMessage.value.trim() !== '' && !isSending.value) {
    isSending.value = true;
    messages.value.push({ sender: 'user', content: userMessage.value });
    console.log('userMessage: ' , userMessage.value);
    userMessage.value = '';
    setTimeout(() => {
      messages.value.push({ sender: 'robot', content: '自动回复' });
      isSending.value = false;
    }, 1000);
  }
}

function handleEnter(event) {
  if (event.shiftKey || isSending.value) {
    // 如果同时按下了 Shift 键或者回答还未发送过来,允许回车键换行
    return;
  }
  // 如果 isSending 为 false,调用 sendMessage 函数
  event.preventDefault();
  sendMessage();
}

// 格式化消息内容,将换行符转换为 <br> 标签
function formatMessage(content) {
  return content.replace(/\n/g, '<br>');
}
</script>

css部分:

<style lang="scss">
#chatWhole {
  padding: 20px;
  border-top: 1px solid #eee;
  background: hsla(0, 0%, 100%, .4);

  #messageWhole {
    padding-bottom: 20px;
    overflow-y: scroll;
    /* max-height: 300px; */
    height: 300px;

    .messageContent {
      padding: 10px;
      border-radius: 4px;
      margin-bottom: 10px;
    }
  }

  /* Style scrollbar (for message container) */
  #messageWhole::-webkit-scrollbar {
    width: 12px;
  }

  #messageWhole::-webkit-scrollbar-track {
    background-color: #f5f5f5;
  }

  #messageWhole::-webkit-scrollbar-thumb {
    background-color: #888;
    border-radius: 6px;
  }
}

.robot .messageContent {
  background-color: #f5f5f5;
}

.user .messageContent {
  background-color: #d6eef8;
}


#inputDiv {
  display: flex;
  margin-top: 20px;

  #inputIn {
    flex-grow: 1;
    padding: 10px;
    border-radius: 4px;
    border: 1px solid #ddd;
  }

  #send {
    padding: 10px;
    background-color: #333;
    color: #fff;
    border: none;
    border-radius: 4px;
    margin-left: 10px;
    cursor: pointer;
  }
}
</style>
  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值