Vue(Nuxt.js)で、textarea・inputで入力したものをEnterで送信、Shift+Enterで改行する機能を実装する方法です。
チャット機能を実装する時などに便利かと思います。
Vue(Nuxt.js)でEnterで送信、Shift+Enterで改行の機能を実装
<template>
<div>
<p>送信:</p>
<p>{{ sendMessage }}</p>
<textarea
v-model="message"
@keydown.enter.exact="keyDownEnter" <!--enterをkeydownした時のイベント-->
@keyup.enter.exact="keyUpEnter" <!--enterをkeyupした時のイベント-->
@keydown.enter.shift="keyEnterShift" <!--enterとshiftをkeydownした時のイベント-->
></textarea>
</div>
</template>
<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
data() {
return {
message: '',
sendMessage: ''
}
},
methods: {
keyDownEnter(e: any) {
e.preventDefault() //改行を無効化
},
keyUpEnter(e: any) {
e.preventDefault() // 改行を無効化
console.log(e.keyCode) // 13
this.send() //送信
},
keyEnterShift(e: any) {
console.log('shift,enter')
},
send() {
this.sendMessage = this.message
this.message = ''
}
}
})
</script>
@keydown.enter.exact
@keyup.enter.exact
のイベントに関しては、e.preventDefault()をすることでEnterで改行するのを防止しています。
また、.exact
を連結させるとことで、Enterキーのみを押した時にイベントが発生するようにしています。
日本語変換時に送信しないように処理を追加
上記のコードでは、Enterで送信、Shift+Enterで改行することはできますが、日本語変換の確定をした時も送信されてしまいます。
日本語変換の確定時のEnterでは、送信しないように処理を追加します。
<template>
<div>
<p>送信:</p>
<p>{{ sendMessage }}</p>
<textarea
v-model="message"
@keydown.enter.exact="keyDownEnter"
@keyup.enter.exact="keyUpEnter"
@keydown.enter.shift="keyEnterShift"
></textarea>
</div>
</template>
<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
data() {
return {
message: '',
sendMessage: '',
keyDownCode: 0 //追加
}
},
methods: {
keyDownEnter(e: any) {
console.log(e.keyCode)
this.keyDownCode = e.keyCode //enterを押した時のkeycodeを記録
e.preventDefault()
},
keyUpEnter(e: any) {
if (this.keyDownCode === 229) { //229コードの場合は処理をストップ
return
}
e.preventDefault()
console.log(e.keyCode)
this.send()
},
keyEnterShift(e: any) {
console.log('shift,enter')
},
send() {
this.sendMessage = this.message
this.message = ''
}
}
})
</script>
EnterキーのkeyCodeは13
です。しかし、日本語変換確定時のEnterキーのkeyCodeは229
になります。
if (this.keyDownCode === 229)
で日本語確定時は処理を止めています。
これで日本語変換時には、送信しないようにする機能を追加できます。