본문 바로가기

TIL/기록

[TIL] Tab 활성화

아티스트탭에서 아티스트를 클릭했을 때 어떤 탭이 활성화되었는지 
styled-components의 조건부 스타일링을 적용해보자.

 

클릭한 탭이 활성화되었는지 알기위해 조건부 스타일링을 적용하는 부분이 어려워서 적어본다.

export default function Tabs() {
		const [activeMember, setActiveMember] = useState("카리나")
	return (
    	<TabsWrapper>
        	<Tab $activeMember={activeMember}>111</Tab>
                <Tab $activeMember={activeMember}>222</Tab>
                <Tab $activeMember={activeMember}>333</Tab>
                <Tab $activeMember={activeMember}>444</Tab>
                <Tab $activeMember={activeMember}>555</Tab>
                <Tab $activeMember={activeMember}>666</Tab>
        </TabsWrapper>
    )
}

 

 

지금 클릭한 것이 어떤 상태인지 알기위해 props로 조건부 스타일링을 줘보자.

camelCase를 쓰는 경우에는 맨 앞에 $ 표시를 해서 $activeMember 이런식으로 붙여줘야한다.

 

이걸 이제 어떻게 받을 수 있을까?

const Tab = styled.li`
	${(props) => {
    	if(props.$activeMember === props.children) {
        	return css`
            	background-color: purple;
                color: white;
            `;
        }
        return css`
        	background-color: black;
            	color: white;
        `;
    }}
`;

 

 

props.children은 태그의 자식으로 들어있는 것이 props다.

props.$activeMember가 props.children과 같으면 ! 

 

 

그리고 click eventHandler를 실행해보자.

 

export default function Tabs() {
		const [activeMember, setActiveMember] = useState("카리나");
        
        const onActiveMember = (event) => {
        // Tab 부분에서 벗어나서 TabWrapper쪽을 선택했다면 무시해라.
        	if(event.target === event.currentTarget) return;
            
            	setActiveMember(event.target.textContent)
        }
	return (
    	<TabsWrapper onClick={onActiveMember}>
        	<Tab $activeMember={activeMember}>111</Tab>
                <Tab $activeMember={activeMember}>222</Tab>
                <Tab $activeMember={activeMember}>333</Tab>
                <Tab $activeMember={activeMember}>444</Tab>
                <Tab $activeMember={activeMember}>555</Tab>
                <Tab $activeMember={activeMember}>666</Tab>
        </TabsWrapper>
    )
}

 

 

const Tab = styled.li`
	${(props) => {
		if (props.$activeMember === props.children) {
			return css`
				background-color: purple;
				color: #f5f5f5;
				transition: all 0.5s;
			`;
		}
		return css`
			background-color: black;
			color: #f5f5f5;
		`;
	}}

	font-size: 21px;
	border-radius: 5px;
	width: 7.7rem;
	height: 2rem;
	padding: 0.3rem;
	text-align: center;
	cursor: pointer;
`;

 

 

이렇게 했더니 내가 클릭한 탭이 활성화될 때 보라색 배경이 떴다. 

 

onClick과 activeMember를 설정해서 탭을 활성화시켜도 지정한 탭이 활성화가 안됐었는데 뭐가 문제일까 게속 찾아보다보니

내가 그 전 코드에서 user-selector: none;을 해놨어서

아무리 클릭을해도 tab이 선택이 안되는 것이었다...ㅜㅜ

다른 글자가 틀린줄알고 한참을 찾았네..

동작을 먼저 생각하고 코드를 쓰는 습관을 들여야겠다.. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'TIL > 기록' 카테고리의 다른 글

[TIL] firestore 이용하기  (1) 2024.02.15
[TIL] redux 문제  (1) 2024.02.08
[TIL] Context API  (0) 2024.02.03
[TIL] Redux란?  (1) 2024.02.01
[TIL] useState와 useRef  (0) 2024.01.31