Nuxt/examples/with-sockets/pages/index.vue

158 lines
2.5 KiB
Vue
Raw Normal View History

2017-01-18 16:25:06 +00:00
<template>
<div>
<ul class="pages">
<li class="chat page">
<div class="chatArea">
<ul ref="messages" class="messages">
<li v-for="(message, index) in messages" :key="index" class="message">
<i :title="message.date">
{{ message.date.split('T')[1].slice(0, -2) }}
</i>: {{ message.text }}
2017-11-26 13:40:57 +00:00
</li>
2017-01-18 16:25:06 +00:00
</ul>
</div>
<input v-model="message" class="inputMessage" type="text" placeholder="Type here..." @keyup.enter="sendMessage">
2017-01-18 16:25:06 +00:00
</li>
</ul>
</div>
</template>
<script>
2017-07-10 07:03:18 +00:00
import socket from '~/plugins/socket.io.js'
2017-01-18 16:25:06 +00:00
export default {
2019-02-26 09:41:30 +00:00
watch: {
'messages': 'scrollToBottom'
},
asyncData (context, callback) {
2017-01-18 16:25:06 +00:00
socket.emit('last-messages', function (messages) {
callback(null, {
messages,
message: ''
})
})
},
beforeMount () {
2017-01-18 16:25:06 +00:00
socket.on('new-message', (message) => {
this.messages.push(message)
})
},
mounted () {
2017-01-18 17:04:41 +00:00
this.scrollToBottom()
},
2017-01-18 16:25:06 +00:00
methods: {
sendMessage () {
if (!this.message.trim()) { return }
2018-08-08 10:54:05 +00:00
const message = {
2017-01-18 16:25:06 +00:00
date: new Date().toJSON(),
text: this.message.trim()
}
this.messages.push(message)
this.message = ''
socket.emit('send-message', message)
2017-01-18 17:04:41 +00:00
},
scrollToBottom () {
2017-01-18 17:04:41 +00:00
this.$nextTick(() => {
this.$refs.messages.scrollTop = this.$refs.messages.scrollHeight
})
2017-01-18 16:25:06 +00:00
}
},
head: {
title: 'Nuxt.js with Socket.io'
}
}
</script>
<style>
* {
box-sizing: border-box;
}
html {
font-weight: 300;
-webkit-font-smoothing: antialiased;
}
html, input {
font-family:
"HelveticaNeue-Light",
"Helvetica Neue Light",
"Helvetica Neue",
Helvetica,
Arial,
"Lucida Grande",
sans-serif;
}
html, body {
height: 100%;
margin: 0;
padding: 0;
}
ul {
list-style: none;
word-wrap: break-word;
}
/* Pages */
.pages {
height: 100%;
margin: 0;
padding: 0;
width: 100%;
}
.page {
height: 100%;
position: absolute;
width: 100%;
}
/* Font */
.messages {
font-size: 150%;
}
.inputMessage {
font-size: 100%;
}
.log {
color: gray;
font-size: 70%;
margin: 5px;
text-align: center;
}
/* Messages */
.chatArea {
height: 100%;
padding-bottom: 60px;
}
.messages {
height: 100%;
margin: 0;
overflow-y: scroll;
padding: 10px 20px 10px 20px;
}
/* Input */
.inputMessage {
border: 10px solid #3B8070;
bottom: 0;
height: 60px;
left: 0;
outline: none;
padding-left: 10px;
position: absolute;
right: 0;
width: 100%;
}
</style>