From aae1f800aaed2c9bb18c0478df9e6fd331b1bf8c Mon Sep 17 00:00:00 2001 From: zcj <18137693952@163.com> Date: Mon, 12 Sep 2022 15:50:48 +0800 Subject: [PATCH 1/8] =?UTF-8?q?fix(tag-input):=20=E7=A7=BB=E9=99=A4=20rend?= =?UTF-8?q?er=20setup=E7=9B=B4=E6=8E=A5=E5=AF=BC=E5=87=BA=EF=BC=8C?= =?UTF-8?q?=E6=89=93=E5=BC=80=E5=85=B3=E9=97=ADsuggestionList=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E9=80=BB=E8=BE=91=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devui/tag-input/src/tag-input.tsx | 169 +++++++----------- 1 file changed, 68 insertions(+), 101 deletions(-) diff --git a/packages/devui-vue/devui/tag-input/src/tag-input.tsx b/packages/devui-vue/devui/tag-input/src/tag-input.tsx index 3f4fad5da7..7217bba29e 100644 --- a/packages/devui-vue/devui/tag-input/src/tag-input.tsx +++ b/packages/devui-vue/devui/tag-input/src/tag-input.tsx @@ -1,5 +1,6 @@ import { defineComponent, ref, computed, nextTick, watch, SetupContext, getCurrentInstance } from 'vue'; import { createI18nTranslate } from '../../locale/create'; +import clickoutsideDirective from '../../shared/devui-directive/clickoutside'; import removeBtnSvg from './icon-remove'; import { Suggestion, TagInputProps, tagInputProps } from './tag-input-types'; import './tag-input.scss'; @@ -14,6 +15,9 @@ const KEYS_MAP = { export default defineComponent({ name: 'DTagInput', + directives: { + clickoutside: clickoutsideDirective, + }, props: tagInputProps, emits: ['update:tags', 'update:suggestionList', 'valueChange'], setup(props: TagInputProps, ctx: SetupContext) { @@ -69,8 +73,14 @@ export default defineComponent({ isInputBoxFocus.value = true; }; const onInputBlur = () => { + // isInputBoxFocus.value = false; + }; + + // 点击元素外部区域关闭Suggestion选择 + const closeSuggestion = () => { isInputBoxFocus.value = false; }; + const handleEnter = () => { let res = { [props.displayProperty]: tagInputVal.value }; if (tagInputVal.value === '' && mergedSuggestions.value.length === 0) { @@ -119,20 +129,23 @@ export default defineComponent({ } }; - const removeTag = ($event: MouseEvent, tagIdx: number) => { + const removeTag = ($event: Event, tagIdx: number) => { $event.preventDefault(); ctx.emit('update:suggestionList', add(props.suggestionList, props.tags[tagIdx])); const newTags = remove(props.tags, tagIdx); ctx.emit('valueChange', props.tags, newTags); ctx.emit('update:tags', newTags); + nextTick(() => { tagInputRef.value?.focus(); }); }; - const onSuggestionItemClick = ($event: MouseEvent, itemIndex: number) => { + const onSuggestionItemClick = ($event: Event, itemIndex: number) => { $event.preventDefault(); const target = mergedSuggestions.value[itemIndex]; const newTags = add(props.tags, target); + + const newSuggestions = remove(props.suggestionList, target.__index); ctx.emit('valueChange', props.tags, newTags); ctx.emit('update:tags', newTags); @@ -144,119 +157,73 @@ export default defineComponent({ return !props.disabled && !isTagsLimit.value && isInputBoxFocus.value; }); - return { - tagInputRef, - tagInputVal, - isInputBoxFocus, - onInput, - onInputFocus, - onInputBlur, - removeTag, - onSuggestionItemClick, - onInputKeydown, - isShowSuggestion, - mergedSuggestions, - selectIndex, - isTagsLimit, - t, - }; - }, - render() { - const { - tagInputVal, - isInputBoxFocus, - disabled, - disabledText, - isTagsLimit, - maxTagsText, - displayProperty, - tags, - onInputKeydown, - onInputFocus, - onInputBlur, - onInput, - onSuggestionItemClick, - removeTag, - placeholder, - spellcheck, - isShowSuggestion, - noData, - mergedSuggestions, - selectIndex, - maxTags, - t, - } = this; - const inputBoxCls = { 'devui-tags': true, 'devui-form-control': true, 'devui-dropdown-origin': true, 'devui-dropdown-origin-open': isInputBoxFocus, - 'devui-disabled': disabled, + 'devui-disabled': props.disabled, }; const tagInputCls = { input: true, 'devui-input': true, 'invalid-tag': false, }; - const tagInputStyle = [`display:${disabled ? 'none' : 'block'};`]; + const tagInputStyle = [`display:${props.disabled ? 'none' : 'block'};`]; - const noDataTpl =