TagInput 组件怎么实现回车添加标签?
我用 Vue 写了个 TagInput,想让用户敲回车就自动把输入内容变成标签加进去,但试了好几次都不行。输完字按回车,页面直接刷新了,标签也没加上。
我监听了 @keydown.enter 事件,也用了 .prevent 修饰符,但还是没效果。是不是哪里写错了?
<template>
<div>
<input
v-model="inputValue"
@keydown.enter.prevent="addTag"
placeholder="输入标签后按回车"
/>
<span v-for="tag in tags" :key="tag" class="tag">{{ tag }}</span>
</div>
</template>
.prevent修饰符来阻止默认行为,但有时 Vue 的事件处理机制可能会有点微妙。首先,我们来看看你的代码逻辑。你在监听
@keydown.enter.prevent,这确实应该能阻止页面刷新,但有时候为了确保万无一失,我们需要更明确地处理这个事件。这里有个改进版的实现方式,我建议用
@keyup.enter来代替@keydown.enter,并且在方法里显式地调用event.preventDefault():这样做有几个好处:一是用
@keyup.enter能确保我们在按键抬起时才处理逻辑,这样用户体验更好;二是显式调用event.preventDefault()可以彻底避免页面刷新的问题。顺便说一句,开发中遇到这种奇怪的行为很常见,有时候框架的特性确实会让人摸不着头脑。记得我之前也遇到过类似问题,调试了好几个小时才找到原因,真是让人头大。不过现在明白了原理就好多了。
问题不在 keydown 事件上,而是你的 input 大概率包在 form 里面了吧?回车在 form 里会触发 submit 事件,页面就直接刷新了。你用的 .prevent 是阻止 keydown 的默认行为,但 keydown.enter 本身没什么默认行为要阻止。
真正的提交是 form 的 submit 干的。
解决方法很简单,要么把外层的 form 去掉,要么在 form 上也加个 .prevent:
或者如果你不需要 form 的其他功能,直接把 form 标签删掉就行。