因为要做一个聊天输入框,所以遇到了这个问题,因为发送消息比回车换行要常用,所以用enter键发送消息,alt+enter键回车换行
首先先给文本输入框加两个键盘事件
<textarea v-model="message" ref="textDom @keydown.enter="handleEnter" @keydown.alt.enter="handleAltEnter"></textarea>
// 非原生组件要加上.native 示例 @keyup.enter.native (非原生组件才需要)注意不能使用keyup,需要使用keydown
然后你会发现当你使用alt+enter组合键时,你仍然会触发enter事件,这当然不符合我的要求,所以我的做法是,在使用alt+enter键时,阻塞enter键的触发事件
handleAltEnter() {
let textDom = this.$refs.textDom
let startPos = textDom.selectionStart
let endPos = textDom.selectionEnd // 获取开始光标和结束光标
// 把输入的换行符插入到你光标的位置
this.message = this.message.substring(0, startPos) + '\n' + this.message.substring(endPos, this.message
.length)
this.isAltEnter = true // 设置阻塞状态,因为enter事件仍然会触发
},
handleEnter(e) {
e.preventDefault() // 阻止默认行为
setTimeout(() => {
if (this.isAltEnter) { //如果为阻塞状态就反转状态
this.isAltEnter = false
} else { //如果不是就执行发送
this.sendMessage()
}
}, 100)
},
如果有更好的解决办法,希望能交流一下哦!