>  Q&A  >  본문

MaterialUI는 이를 어떻게 수행합니까?

<p>자동완성 구성요소를 살펴보면: https://mui.com/material-ui/react-autocomplete/</p> <p>드롭다운에서 제안을 클릭한 후에도 입력 상자에 초점이 유지됩니다. 어떻게 그렇게 합니까? 내 자신의 vue 앱(머티리얼 UI를 사용하지 않음)의 모든 변형에서 입력이 포커스를 잃지 않도록 클릭 이벤트를 얻을 수 없습니다. </p> <p>이 문제를 오랫동안 Google에서 검색해 보았지만 명확한 해결책을 찾지 못했습니다. 예를 들어 사람들은 mousedown/touchstart를 제안했지만 이로 인해 스크롤이 중단되었습니다(드롭다운을 드래그하여). MaterialUI에는 분명히 이 문제가 없으며 mousedown을 사용하지 않는 것 같습니다. </p> <p>Chrome 개발자 도구를 사용하여 이벤트 분석을 시도했지만 단 한 번의 클릭 이벤트만 볼 수 있지만, 제거된 코드로는 무슨 일이 일어나고 있는지 파악하기 어렵습니다. </p> <p>Vuetify도 이 작업을 수행합니다: https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/comComponents/VAutocomplete/VAutocomplete.ts</p> <p>이 문제가 있는 사람이 있으면 이 https://codepen.io/Pineapple/pen/MWBVqGW</p>도 도움이 됩니다. <p><strong>수정</strong>제가 하고 있는 일은 다음과 같습니다.</p> <pre class="brush:html;toolbar:false;"> @autocomplete-select="onSelect" @autocomplete-close="onClose" :open="열기"> <템플릿 #기본="{ 결과 }"> <div class="input-autocomplete-address"> {{ 결과.주소 }} </div> </템플릿> </app-input-autocomplete> </pre> <p>그런 다음 <code>app-input-autocomplete</code>에서: </p> <pre class="brush:html;toolbar:false;"><템플릿> <앱 입력 @focus="onFocus" @blur="onBlur" v-bind="$attrs"> <템플릿 #underInput> <div ref="dropdown" v-show="open" class="input-autocomplete-dropdown"> <div class="input-autocomplete-results"> <div v-for="결과 결과" :key="result.id" @click="onClick(result)" <슬롯:결과="결과" </div> </div> </div> </템플릿> </앱 입력> </템플릿> <스크립트> 'vue'에서 { ref, toRef } 가져오기; '@/comComponents/AppInput.vue'에서 AppInput을 가져옵니다. '@vueuse/core'에서 { onClickOutside }를 가져옵니다. 기본값 내보내기 { 구성요소: { 앱 입력, }, 상속 속성: 거짓, 소품: { 열려 있는: { 유형: 부울, 기본값: 거짓, }, 결과: { 유형: 배열, 기본값: () => ([]), }, }, 방출: ['autocomplete-close', 'autocomplete-select'], setup(props, { 방출 }) { const 드롭다운 = ref(null); const open = toRef(props, 'open'); const 집중 = ref(false); onClickOutside(dropdown, () => { if (!focused.value && open.value) { Emit('자동완성-닫기'); } }); 반품 { 쓰러지 다, 집중하고, }; }, 방법: { 온포커스() { this.focused = 사실; }, onBlur() { this.focused = 거짓; }, onClick(결과) { this.$emit('autocomplete-select', result); }, }, }; </스크립트>

P粉916760429P粉916760429410일 전602

모든 응답(1)나는 대답할 것이다

  • P粉994092873

    P粉9940928732023-09-05 12:04:13

    아이디어와 이 링크를 제공해 주신 @Claies에게 감사드리며 다음을 수행하여 이 문제를 해결했습니다.

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

    1. event.preventDefault on mousedown
    2. @click 결과는 평소와 동일하게 동작합니다(입력 끄기)
    3. @click/@focus 입력 세트open = true
    4. @blur 설정 공개 = false

    회신하다
    0
  • 취소회신하다