我正在尝试实现一个类似于松弛的功能,只有在按下确切输入时才会发送消息(没有按下移位)
考虑这个vue模板
<textarea type="text" v-model="message" @keyup.enter.exact="sendMessage($event)"></textarea>
使用此组件
export default {
name: 'Typing',
data() {
return {
message: null
}
},
methods: {
sendMessage(e) {
// e.stopPropagation() and e.preventDefault() have no impact
this.$socket.emit('message', { text: this.message });
console.log(this.message); // Print the message with another '\n' at the end due to textarea default behavior
}
}
}
有没有人知道如何避免使用最后一个'\ n'而不使用正则表达式删除它然后再将其发送到后端(我认为它会变脏)?
谢谢
PS:我对VueJS堆栈很新,希望我的问题不明显编辑:This question类似但建议的解决方案无效
答案 0 :(得分:13)
<textarea
type="text"
v-model="message"
@keyup.enter.exact="sendMessage($event)"
>
</textarea>
代码在 Enter 键的sendMessage
事件上调用keyup
方法。在发布密钥后,keyup
事件将被触发。因此,代码在按下键后,在键运行(输入换行符)和键释放后的默认行为之后调用方法。 preventDefault
无法阻止此问题,因为在keyup
事件之前已经发生了试图阻止的行为。
我们已经确定了以下内容:
keyup
事件。解决方案是阻止keydown
事件的默认行为,并在keyup
事件上调用该方法。
注意:重要的是只调用
keyup
事件上的方法,以避免在用户按下密钥时多次调用。
<textarea
v-model="value"
@keydown.enter.exact.prevent
@keyup.enter.exact="send"
@keydown.enter.shift.exact="newline"
>
</textarea>
当按下 Enter + Shift 组合时,可以调用在textarea值中附加换行符的方法。
以下是演示解决方案中描述的所有行为的代码段。
new Vue({
template: `
<div>
<textarea
v-model="value"
@keydown.enter.exact.prevent
@keyup.enter.exact="send"
@keydown.enter.shift.exact="newline"
>
</textarea>
</div>
`,
data: {
value: '',
},
methods: {
newline() {
this.value = `${this.value}\n`;
},
send() {
console.log('========');
console.log(this.value);
console.log('========');
},
},
}).$mount('#root');
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
</head>
<body>
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.3/vue.min.js"></script>
</body>
</html>
答案 1 :(得分:1)
您的问题解决方案很简单:
new Vue({
el: '#app',
data: {
message: ''
},
methods: {
sendMessage () {
console.log(this.message, this.message.length)
// this.$socket.emit('message', {text: this.message});
// clear textarea: this.message = ''
}
}
})
&#13;
<div id="app">
<textarea v-model="message" @keydown.enter.exact.prevent="sendMessage"></textarea>
</div>
<script src="https://unpkg.com/vue"></script>
&#13;
答案 2 :(得分:0)
尝试使用Vue内置prevent
<textarea type="text" v-model="message" @keyup.enter.exact.prevent="sendMessage($event)"></textarea>