Преглед изворни кода

feat(app-search): auto focus on show

菜单搜索组件在显示后input自动获得焦点
无木 пре 3 година
родитељ
комит
1ae636296d
1 измењених фајлова са 16 додато и 9 уклоњено
  1. 16 9
      src/components/Application/src/search/AppSearchModal.vue

+ 16 - 9
src/components/Application/src/search/AppSearchModal.vue

@@ -7,6 +7,7 @@
             <Input
               :class="`${prefixCls}-input`"
               :placeholder="t('common.searchText')"
+              ref="inputRef"
               allow-clear
               @change="handleSearch"
             >
@@ -57,7 +58,7 @@
   </Teleport>
 </template>
 <script lang="ts">
-  import { defineComponent, computed, unref, ref } from 'vue';
+  import { defineComponent, computed, unref, ref, watch, nextTick } from 'vue';
 
   import { SearchOutlined } from '@ant-design/icons-vue';
   import { Input } from 'ant-design-vue';
@@ -90,15 +91,10 @@
       const { t } = useI18n();
       const [refs, setRefs] = useRefs();
       const { getIsMobile } = useAppInject();
+      const inputRef = ref<Nullable<HTMLElement>>(null);
 
-      const {
-        handleSearch,
-        searchResult,
-        keyword,
-        activeIndex,
-        handleEnter,
-        handleMouseenter,
-      } = useMenuSearch(refs, scrollWrap, emit);
+      const { handleSearch, searchResult, keyword, activeIndex, handleEnter, handleMouseenter } =
+        useMenuSearch(refs, scrollWrap, emit);
 
       const getIsNotData = computed(() => {
         return !keyword || unref(searchResult).length === 0;
@@ -118,6 +114,16 @@
         emit('close');
       }
 
+      watch(
+        () => _.visible,
+        (v: boolean) => {
+          v &&
+            nextTick(() => {
+              unref(inputRef)?.focus();
+            });
+        }
+      );
+
       return {
         t,
         prefixCls,
@@ -131,6 +137,7 @@
         scrollWrap,
         handleMouseenter,
         handleClose,
+        inputRef,
       };
     },
   });