개발자
공식문서 - 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}
답변 2
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 봇의 답변을 평가해 주세요!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!