帮我用vue写一个类似于微信的对话页面需要有对话框,还需要对头像,需要能够适配手机的
时间: 2023-06-20 20:07:04 浏览: 140
好的,以下是一个简单的Vue组件,实现了类似微信的对话页面,包括对话框、头像,并且能够适配手机屏幕:
```html
<template>
<div class="chat-window">
<div class="message-list" ref="messageList">
<div v-for="(message, index) in messages" :key="index" :class="['message', message.type]">
<div class="avatar">
<img :src="message.avatar" alt="avatar">
</div>
<div class="content">
<div class="name">{{ message.name }}</div>
<div class="text">{{ message.text }}</div>
</div>
</div>
</div>
<div class="input-box">
<input class="input" type="text" placeholder="请输入消息" v-model="inputText" @keyup.enter="sendMessage">
<div class="send-btn" @click="sendMessage">发送</div>
</div>
</div>
</template>
<script>
export default {
name: 'ChatWindow',
data() {
return {
messages: [
{ type: 'send', avatar: '/assets/avatar.png', name: '我', text: '你好' },
{ type: 'receive', avatar: '/assets/avatar.png', name: '小明', text: '你好啊' },
{ type: 'send', avatar: '/assets/avatar.png', name: '我', text: '最近怎么样?' },
{ type: 'receive', avatar: '/assets/avatar.png', name: '小明', text: '还不错,你呢?' },
],
inputText: '',
};
},
methods: {
sendMessage() {
if (this.inputText.trim().length !== 0) {
this.messages.push({ type: 'send', avatar: '/assets/avatar.png', name: '我', text: this.inputText });
this.inputText = '';
this.$nextTick(() => {
const messageList = this.$refs.messageList;
messageList.scrollTop = messageList.scrollHeight;
});
}
},
},
};
</script>
<style scoped>
.chat-window {
height: 100%;
display: flex;
flex-direction: column;
}
.message-list {
flex: 1;
overflow-y: scroll;
padding: 20px;
}
.message {
display: flex;
align-items: flex-start;
margin-bottom: 20px;
}
.message.send .avatar {
margin-left: auto;
margin-right: 10px;
}
.message.receive .avatar {
margin-right: auto;
margin-left: 10px;
}
.avatar {
width: 40px;
height: 40px;
border-radius: 20px;
overflow: hidden;
}
.avatar img {
width: 100%;
height: 100%;
object-fit: cover;
}
.content {
display: flex;
flex-direction: column;
}
.name {
font-size: 14px;
color: gray;
margin-bottom: 5px;
}
.text {
font-size: 18px;
padding: 10px;
background-color: #f0f0f0;
border-radius: 10px;
}
.input-box {
display: flex;
align-items: center;
padding: 20px;
background-color: #f0f0f0;
}
.input {
flex: 1;
height: 40px;
border-radius: 20px;
padding: 0 20px;
font-size: 18px;
border: none;
outline: none;
}
.send-btn {
width: 80px;
height: 40px;
line-height: 40px;
text-align: center;
background-color: #409eff;
color: #fff;
border-radius: 20px;
margin-left: 20px;
cursor: pointer;
}
</style>
```
在上面的代码中,我们使用了`v-for`指令来循环渲染对话框,使用了`v-model`指令来双向绑定输入框的文本。当用户点击发送按钮或按下回车键时,我们会将用户输入的文本添加到消息列表中,并清空输入框。最后,我们使用了`$refs`来获取到消息列表的 DOM 元素,通过修改其`scrollTop`属性,实现自动滚动到最底部。
在使用这个组件之前,请确保你已经准备好了头像和其他资源,并将它们放到正确的路径下。另外,你可能需要对样式进行一些微调,以适配你的具体需求。
阅读全文