개발자

headlessui 의 listbox 써보신 분 계신가요?

2023년 03월 28일조회 375

공식문서 - https://headlessui.com/react/listbox listbox를 사용하는데 select 항목 안에도 button을 만들어서 option을 선택할 때가 아닌 button을 클릭할 때 select를 적용하고 싶은데요. button을 누르면 select항목을 닫고 싶습니다. 어떻게 해야 닫을 수 있나요? 지금은 버튼눌러도 아무 동작을 안합니다 ㅠ

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

엄홍재님의 프로필 사진

<Listbox.Button> 을 사용해보세요 클릭했을 때 자동으로 닫는 이벤트가 있는것 같아요! 해당 버튼에서 onClick을 추가해서 사용할 수 있습니다.

커리어리 AI 봇님의 프로필 사진

Headless UI의 Listbox에서 닫기 동작을 추가하려면, useRef와 useEffect를 사용하여 Listbox 인스턴스에 대한 참조를 만들어야 합니다. 이를 사용하여 '선택!' 버튼을 클릭할 때 Listbox를 닫도록 설정할 수 있습니다. 코드는 다음과 같이 작성할 수 있습니다. 아래 코드는 useRef를 사용하여 Listbox 인스턴스에 대한 참조를 만들고, 이를 통해 버튼을 클릭했을 때 Listbox를 닫을 수 있도록 설정합니다. 또한 useEffect를 사용하여 선택된 사람이 변경될 때마다 Listbox를 업데이트합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import { useState, useRef, useEffect } from 'react';
import { Listbox } from '@headlessui/react';

const people = [
  { id: 1, name: 'Durward Reynolds' },
  { id: 2, name: 'Kenton Towne' },
  { id: 3, name: 'Therese Wunsch' },
  { id: 4, name: 'Benedict Kessler' },
  { id: 5, name: 'Katelyn Rohan' },
];

function MyListbox() {
  const [selectedPeople, setSelectedPeople] = useState([people[0], people[1]]);
  const listboxRef = useRef();

  useEffect(() => {
    if (listboxRef.current) {
      listboxRef.current.forceUpdate();
    }
  }, [selectedPeople]);

  return (
    <Listbox
      ref={listboxRef}
      value={selectedPeople}
      onChange={setSelectedPeople}
      multiple
    >
      <Listbox.Button>
        {selectedPeople.map((person) => person.name).join(', ')}
      </Listbox.Button>
      <Listbox.Options>
        {people.map((person) => (
          <Listbox.Option key={person.id} value={person}>
            {person.name}
          </Listbox.Option>
        ))}
        <button
          onClick={() => {
            if (listboxRef.current) {
              listboxRef.current.close();
            }
          }}
        >
          선택!
        </button>
      </Listbox.Options>
    </Listbox>
  );
}

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!