Как это делает MaterialUI?

Если вы посмотрите на их компонент автозаполнения: https://mui.com/material-ui/react-autocomplete/

После того, как вы щелкнете предложение в раскрывающемся списке, поле ввода останется в фокусе... Как они это делают? В каждом варианте этого в моем собственном приложении vue (без использования пользовательского интерфейса материала) я не могу получить событие щелчка, чтобы предотвратить потерю фокуса ввода.

Я пытался найти это в Google в течение достаточно долгого времени, и я не вижу четкого решения. Например, люди предлагают mousedown/touchstart, но это нарушит прокрутку (через перетаскивание раскрывающегося списка). У MaterialUI, очевидно, нет этой проблемы, и, похоже, он не использует mousedown.

Я пытался анализировать события с помощью инструментов разработчика Chrome, и я вижу только одно событие щелчка, но с уменьшенным кодом трудно сказать, что происходит.

Vuetify также делает это: https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/components/VAutocomplete/VAutocomplete.ts

Я тоже нашел это полезным, если кто-то столкнется с этой проблемой https://codepen.io/Pineapple/pen/MWBVqGW

Изменить Вот что я делаю:

  <app-input-autocomplete 
    @autocomplete-select = "onSelect"
    @autocomplete-close = "onClose"
    :open = "open">
    <template #default = "{ result }">
      <div class = "input-autocomplete-address">
        {{ result.address }}
      </div>
    </template>
  </app-input-autocomplete>

а затем в app-input-autocomplete:

<template>
  <app-input
    @focus = "onFocus"
    @blur = "onBlur"
    v-bind = "$attrs">
    <template #underInput>
      <div ref = "dropdown" v-show = "open" class = "input-autocomplete-dropdown">
        <div class = "input-autocomplete-results">
          <div v-for = "result in results" :key = "result.id" @click = "onClick(result)" class = "input-autocomplete-result">
            <slot :result = "result" />
          </div>
        </div>
      </div>
    </template>
  </app-input>
</template>

<script>
import { ref, toRef } from 'vue';
import AppInput from '@/components/AppInput.vue';
import { onClickOutside } from '@vueuse/core';

export default {
  components: {
    AppInput,
  },
  inheritAttrs: false,
  props: {
    open: {
      type: Boolean,
      default: false,
    },
    results: {
      type: Array,
      default: () => ([]),
    },
  },
  emits: ['autocomplete-close', 'autocomplete-select'],
  setup(props, { emit }) {
    const dropdown = ref(null);

    const open = toRef(props, 'open');

    const focused = ref(false);

    onClickOutside(dropdown, () => {
      if (!focused.value && open.value) {
        emit('autocomplete-close');
      }
    });

    return {
      dropdown,
      focused,
    };
  },
  methods: {
    onFocus() {
      this.focused = true;
    },
    onBlur() {
      this.focused = false;
    },
    onClick(result) {
      this.$emit('autocomplete-select', result);
    },
  },
};
</script>

@LawrenceCherone Я добавил свой источник для компонента автозаполнения vue, который я создаю вручную

Tallboy 24.01.2023 21:00

на основе кода в github, github.com/mui/material-ui/blob/master/packages/mui-base/src‌​/… кажется, что они предоставляют специальное событие для обработки, когда происходит blur. Сейчас у меня нет времени на глубокое погружение, но я надеюсь, что это укажет вам правильное направление. Похоже, они вызывают это событие для onBlur(), а затем используют флаги других событий, чтобы определить, когда они могут сохранить фокус.

Claies 24.01.2023 22:49

а здесь на github.com/mui/material-ui/blob/master/packages/mui-base/src‌​/… они используют preventDefault().

Claies 24.01.2023 22:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил это, сделав следующее, спасибо @Claies за идею посмотреть, а также эту ссылку:

https://codepen.io/Pineapple/pen/MWBVqGW

  1. event.preventDefault на mousedown
  2. @щелчок по результату ведет себя как обычно (закрыть ввод)
  3. @click/@focus на входном наборе open = true
  4. @blur устанавливает открытое = ложное

Другие вопросы по теме