Vue中keyup.enter和blur事件冲突的问题及解决


keyup.enter和blur事件冲突问题

代码如下(示例):

<el-input class="input-new-tag" 
      v-if="row.inputVisible" 
      v-model="row.inputValue" 
      :ref="$index" size="small" 
      @keyup.enter.native="handleInputConfirm(row,$index)" 
      @blur="handleInputConfirm(row,$index)"
>

在写这个业务时,遇到了一个enterblur冲突的问题,按了回车,导致了input也算失去了焦点,导致连续触发2handleInputConfirm(row,$index)这个函数。

解决方法

代码如下(示例):

<el-input class="input-new-tag" 
   v-if="row.inputVisible" 
   v-model="row.inputValue" 
   :ref="$index" size="small" 
   @keyup.enter.native="$event.target.blur" 
   @blur="handleInputConfirm(row,$index)"
>
 
//将回车触发的方法改为去触发元素的blur事件 这样就不会重复触发了。

keyup.enter和blur同时触发如何规避

问题描述

在某种场景下,需要点击span标签变成input标签,然后在input标签下编辑,编辑完成之后按回车enter或点击input标签外的地方又变回span标签

  • 初始化

在这里插入图片描述

  • 双击后:

在这里插入图片描述

  • 回车:

在这里插入图片描述
实际上触发了两次

实现代码

代码如下(示例):

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>Document</title>
		<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<template v-if="isShow">
				<span @dblclick="showInput">{{msg}}</span>
			</template>
			<template v-else>
				<input
					@keyup.enter="hideInput"
					@blur="hideInput"
					v-focus
					type="text"
					v-model="msg"
				/>
			</template>
		</div>
		<script>
			let app = new Vue({
				el: '#app',
				data: {
					msg: 'hello',
					isShow: true,
				},
				directives: {
					focus: {
						inserted: (el) => {
							el.focus()
						},
					},
				},
				methods: {
					showInput() {
						this.isShow = false
					},
					hideInput() {
            			console.log('触发')
						this.isShow = true
					},
				},
			})
		</script>
	</body>
</html>

解决办法

@keyup.enter="$event.target.blur()"
  • 修改后:

在这里插入图片描述

整体实现

代码如下(示例):

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>Document</title>
		<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<template v-if="isShow">
				<span @dblclick="showInput">{{msg}}</span>
			</template>
			<template v-else>
				<input
					@keyup.enter="$event.target.blur()"
					@blur="hideInput"
					v-focus
					type="text"
					v-model="msg"
				/>
			</template>
		</div>
		<script>
			let app = new Vue({
				el: '#app',
				data: {
					msg: 'hello',
					isShow: true,
				},
				directives: {
					focus: {
						inserted: (el) => {
							el.focus()
						},
					},
				},
				methods: {
					showInput() {
						this.isShow = false
					},
					hideInput() {
            			console.log('触发')
						this.isShow = true
					},
				},
			})
		</script>
	</body>
</html>

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑看、人世间@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值