VueJS:如何防止textarea默认行为

Pie*_*her 8 javascript vue.js vue-component vuejs2

我正在尝试实现类似松弛的功能,只有在按下确切输入时才会发送消息(没有按下移位)

考虑 <textarea type="text" v-model="message" @keyup.enter.exact="sendMessage($event)"></textarea> 使用此组件的此vue模板

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
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何避免使用最后一个'\n'而不使用正则表达式删除它然后再发送到后端(我认为这将是脏的)?

谢谢

PS:我对VueJS堆栈很新,希望我的问题不明显

编辑:这个问题类似,但建议的解决方案不起作用

Win*_*ing 21

问题

<textarea
  type="text"
  v-model="message"
  @keyup.enter.exact="sendMessage($event)"
>
</textarea>
Run Code Online (Sandbox Code Playgroud)

代码在键sendMessagekeyup事件上调用方法Enter.该keyup事件被触发后,该键已被释放.因此,代码在按下键后,在键运行(输入换行符)和键释放后的默认行为之后调用方法.preventDefault因为在keyup事件发生之前已经发生了试图阻止的行为,所以不会阻止该问题.

我们已经确定了以下内容:

  • 我们希望防止Enter按键的默认行为.
  • keyup已经发生默认行为后触发该事件.

解决方案是防止keydown事件的默认行为并在事件上调用方法keyup.

注意:仅在keyup事件上调用方法以避免多次调用(如果用户按住键),这一点很重要.

  <textarea
    v-model="value"
    @keydown.enter.exact.prevent
    @keyup.enter.exact="send"
    @keydown.enter.shift.exact="newline"
  >
  </textarea>
Run Code Online (Sandbox Code Playgroud)

当按下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');
Run Code Online (Sandbox Code Playgroud)
<!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>
Run Code Online (Sandbox Code Playgroud)

进一步阅读


小智 9

您的问题的解决方案很简单:

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 = ''
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
<div id="app">
  <textarea v-model="message" @keydown.enter.exact.prevent="sendMessage"></textarea>
</div>

<script src="https://unpkg.com/vue"></script>
Run Code Online (Sandbox Code Playgroud)


nip*_*dha 1

尝试使用 Vue 内置prevent

<textarea type="text" v-model="message" @keyup.enter.exact.prevent="sendMessage($event)"></textarea>
Run Code Online (Sandbox Code Playgroud)