
양이 많은 관계로 CSS 부분은 제외하고 기능 부분만 작성한다.
(제발 velog에서 접기 기능 좀 구현해줬음 좋겠다. detail 태그가 안먹힌다!!)
1. Modal
2. Toggle
3. Tab
4. Tag
5. Autocomplete
6. ClickToEdit
event.stopPropagation() 함수를 사용해준다.export const Modal = () => { // 1. const [isOpen, setIsOpen] = useState(false); // 2. const openModalHandler = () => { setIsOpen(!isOpen); }; return ( <> <ModalContainer> // 2-1. <ModalBtn onClick={openModalHandler} > // 3. {isOpen ? 'Opened!' : 'Open Modal'} </ModalBtn> // 4. {isOpen //5. ? <ModalBackdrop onClick={openModalHandler}> // 6. <ModalView onClick={(event) => event.stopPropagation()}> // 7. <CloseButton onClick={openModalHandler} className='close-btn'>X</CloseButton> <div className='desc'>모달창 open</div> </ModalView> </ModalBackdrop> : null} </ModalContainer> </> ); };
export const Toggle = () => { // 1. const [isOn, setisOn] = useState(false); // 2. const toggleHandler = () => { setisOn(!isOn); } return ( <> // 2-1. <ToggleContainer onClick={() => toggleHandler()} > // 3. <div className={isOn ? "toggle--checked toggle-container" : "toggle-container"}/> <div className={isOn ? "toggle--checked toggle-circle" : "toggle-circle"}/> </ToggleContainer> // 4. <Desc>{isOn ? 'Toggle Switch ON' : 'Toggle Switch OFF'}</Desc> </> ); };
<li> 태그를 만들어주면서 현재 tab의 index 가 currentTab 의 값과 같은지 확인한다.<li> 에 onClick 이벤트가 일어나면 selectMenuHandler 함수가 실행되도록 이벤트를 설정해준다.export const Tab = () => { // 1. const [currentTab, setCurrentTab] = useState(0) const menuArr = [ { name: 'Tab1', content: 'Tab menu ONE' }, { name: 'Tab2', content: 'Tab menu TWO' }, { name: 'Tab3', content: 'Tab menu THREE' }, ]; const selectMenuHandler = (index) => { // 2. setCurrentTab(index) }; return ( <> <div className='tab-container'> <TabMenu> // 3. {menuArr.map((el, index)=>{ // 3-1. return <li className={index === currentTab? "submenu focused" : "submenu"} // 4. onClick={()=>selectMenuHandler(index)} key={index}>{el.name}</li> })} </TabMenu> <Desc> // 5. <p>{menuArr[currentTab].content}</p> </Desc> </div> </> ); };
input 태그에서 onKeyUp 이벤트 발생 시 addTags 함수로 event.target.value 를 가져오기)export const Tag = () => { const initialTags = ['Cats', 'Dogs']; // 1. const [tags, setTags] = useState(initialTags); const removeTags = (indexToRemove) => { // 2. const filter = tags.filter((el,index) => index !== indexToRemove); setTags(filter); }; const addTags = (event) => { //3. const inputValue = event.target.value; // 3-1, 3-2, 3-3 if(event.key === "Enter" && inputValue !== '' && !tags.includes(inputValue)){ // 4. setTags([...tags,inputValue]); // 3-4. event.target.value = ''; } }; return ( <> <TagsInput> <ul id="tags"> // 5. {tags.map((tag, index) => ( <li key={index} className="tag"> <span className="tag-title">{tag}</span> // 6. <span className="tag-close-icon" onClick={ () => removeTags(index)}> x</span> </li> ))} </ul> <input className="tag-input" type="text" onKeyUp={(e) => { // 3-1. addTags(e) }} placeholder="Press enter to add tags" /> </TagsInput> </> ); };