개발자

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

2023년 03월 28일조회 446

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

1import { useState } from 'react'
2import { Listbox } from '@headlessui/react'
3
4const people = [
5  { id: 1, name: 'Durward Reynolds' },
6  { id: 2, name: 'Kenton Towne' },
7  { id: 3, name: 'Therese Wunsch' },
8  { id: 4, name: 'Benedict Kessler' },
9  { id: 5, name: 'Katelyn Rohan' },
10]
11
12function MyListbox() {
13  const [selectedPeople, setSelectedPeople] = useState([people[0], people[1]])
14
15  return (
16    <Listbox value={selectedPeople} onChange={setSelectedPeople} multiple>
17      <Listbox.Button>
18        {selectedPeople.map((person) => person.name).join(', ')}
19      </Listbox.Button>
20      <Listbox.Options>
21        {people.map((person) => (
22          <Listbox.Option key={person.id} value={person}>
23            {person.name}
24          </Listbox.Option>
25        ))}
26        <button
27          onClick={// 여기서 option항목을 닫고싶어요!}
28        >선택!</button>
29      </Listbox.Options>
30    </Listbox>
31  )
32}
이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

엄홍재님의 프로필 사진

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

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

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

1import { useState, useRef, useEffect } from 'react';
2import { Listbox } from '@headlessui/react';
3
4const people = [
5  { id: 1, name: 'Durward Reynolds' },
6  { id: 2, name: 'Kenton Towne' },
7  { id: 3, name: 'Therese Wunsch' },
8  { id: 4, name: 'Benedict Kessler' },
9  { id: 5, name: 'Katelyn Rohan' },
10];
11
12function MyListbox() {
13  const [selectedPeople, setSelectedPeople] = useState([people[0], people[1]]);
14  const listboxRef = useRef();
15
16  useEffect(() => {
17    if (listboxRef.current) {
18      listboxRef.current.forceUpdate();
19    }
20  }, [selectedPeople]);
21
22  return (
23    <Listbox
24      ref={listboxRef}
25      value={selectedPeople}
26      onChange={setSelectedPeople}
27      multiple
28    >
29      <Listbox.Button>
30        {selectedPeople.map((person) => person.name).join(', ')}
31      </Listbox.Button>
32      <Listbox.Options>
33        {people.map((person) => (
34          <Listbox.Option key={person.id} value={person}>
35            {person.name}
36          </Listbox.Option>
37        ))}
38        <button
39          onClick={() => {
40            if (listboxRef.current) {
41              listboxRef.current.close();
42            }
43          }}
44        >
45          선택!
46        </button>
47      </Listbox.Options>
48    </Listbox>
49  );
50}

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

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

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

또는

이미 회원이신가요?

목록으로

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