TagInput 组件怎么限制输入的标签数量?
我在用一个 TagInput 组件,想限制用户最多只能输入 5 个标签,但不知道该怎么实现。试过在 onInput 里判断 tags.length,但好像没生效。
比如用户已经输入了 5 个标签,这时候再敲回车或者粘贴多个标签,应该阻止新增。现在的问题是,即使我 return false 或者不更新数据,组件还是会把新内容加进去。
我的写法大概是这样:
const handleAdd = (tag) => {
if (tags.value.length >= 5) return;
tags.value.push(tag);
};
但有时候还是能多加,特别是快速连续输入的时候。是不是应该在 before-add 这类钩子里拦截?求指点!
具体来说,光靠
handleAdd这个方法可能不够,因为有些组件可能会在内部直接处理用户输入,而不会等你外部的逻辑完成后再去判断。所以要在更早的阶段进行拦截。我建议你在
before-add钩子里做主要的校验工作,这样可以在标签真正加入列表之前就进行限制。如果这个钩子不存在,那就检查组件是否有类似的前置事件或者属性设置。这里是改进后的代码思路:
这里有个小技巧,就是在控制台输出提示信息,让用户知道为什么不能再添加了。这比单纯不让操作要友好得多。
另外还要注意一个细节:除了键盘输入,还得考虑粘贴的情况。有些组件会在粘贴时批量添加标签,这就需要在处理粘贴事件的时候也加上同样的检查逻辑。
说到这个,开发中最头疼的就是这些边界情况,经常觉得应该没问题了,结果一测才发现各种意外状况。不过这也是乐趣所在吧,慢慢调试直到完美。
before-add钩子确实更靠谱,组件内部可能有自己的处理逻辑。试试这样写:记得把
:before-add绑定到组件上,这个钩子会在添加前触发。如果返回 false 就会阻止新增。我之前也遇到过类似问题,onInput确实不太可靠,特别是在快速输入的时候,组件内部可能已经有值了。用这个方法应该能搞定你的问题。