MaterialUI 是如何做到这一点的?
P粉916760429
P粉916760429 2023-09-04 18:17:31
[Vue.js讨论组]

如果你看看他们的自动完成组件:https://mui.com/material-ui/react-autocomplete/

单击下拉列表中的建议后,输入框会保持焦点...他们是如何做到的?在我自己的 vue 应用程序(不使用材质 UI)中的每个变体中,我无法获取单击事件来阻止输入失去焦点。

我已经尝试用谷歌搜索这个问题很长一段时间了,但没有看到明确的解决方案。例如,人们建议 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>

P粉916760429
P粉916760429

全部回复(1)
P粉994092873

我通过执行以下操作解决了这个问题,感谢@Claies 提供的想法以及此链接:

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

  1. event.preventDefault on mousedown
  2. @click 结果的行为与正常情况相同(关闭输入)
  3. @click/@focus 输入集open = true
  4. @blur 设置 open = false
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号