티스토리 뷰

목차


    반응형

    뭐 디자인은 아직 미완성이라 .. 이쁘지는 않지만, 

    탭메뉴 구현을 해보았다 !!!!!

     

    먼저 탭메뉴의 탭타이틀이 있는 부분의 코드

    import React, { useState } from "react";
    import styled from "styled-components";
    import { Grid, Button, Text, Image } from "../../elements/index";
    import XScrollDrag from "../shared/XScrollDrag";
    import {OfficeList,NearStation} from "./index";
    
    const Office = () => {
      const tabTitle = ['맛집', '역'];
      const tab = { 0: <OfficeList tabTitle={tabTitle}/>, 1: <NearStation tabTitle={tabTitle}/> };
      const [openTab, setOpenTab] =useState(0);
    
      const onClickTab = (idx) => {
        setOpenTab(idx);
      };
      return (
        <React.Fragment>
           <Grid margin="16px 0 0 0" display="flex" alignItems="center">
                    {tabTitle.map((title, idx) => {
                        return (
                          <Grid width="88px" cursor="pointer"  key={idx} height="25px" bg={openTab===idx? "#ff0000":"#ccc"}  borderRadius="100px" _onClick={()=>{
                            onClickTab(idx)
                          }}
                          display="flex" alignItems="center" justifyContent="center" margin="0 4px 0 0">#{title}근처</Grid>
                        );
                      })}
                    
                  
            </Grid>
            
            <Grid overflow="hidden" width="100%">
                <XScrollDrag>
                    <FlexBox  >
                      
                        {/* map돌릴 부분 */}
                        {tab[openTab]}
                      {/* map돌릴 부분 */}
       
                    </FlexBox>
                    </XScrollDrag>
                </Grid>
            </React.Fragment>
      );
    };
    const FlexBox=styled.div`
     width:500%;
     display:flex;
     gap:10px;
    
    `;
    const Span = styled.span`
      font-size: 0.625rem;
    `;
    
    export default Office;

    탭메뉴 1번에 해당하는 컴포넌트

    import React from 'react';
    import { Grid, Button, Text, Image } from "../../elements/index";
    import styled from "styled-components";
    
    const OfficeList = (props) => {
      const {tabTitle} =props;
      console.log(tabTitle[0])
        return (
            <React.Fragment>
              {/* map돌리기 */}
                 <Grid
                        width="320px"
                        margin="12px 0 32px 0"
                        height="235px"
                        bg="#999"
                        borderRadius="8px"
                        position="relative"
                        overflow="hidden"
                        > 
                        <Image padding="235px"bottom="0" src="https://velog.velcdn.com/images/ryurim0109/post/6435c602-4d7e-4018-81fa-269d93d5d351/image.jpg" shape="rectangle" position="absolute"/>
                        <Grid  width="100%" height="235px"bottom="0"
                        position="absolute" bg="linear-gradient(0deg, rgba(0, 0, 0, 0.8) 5.74%, rgba(108, 108, 108, 0.0421707) 86.75%, rgba(118, 118, 118, 0) 93.49%)">
                        </Grid>
                          <Button
                            is_like
                            position="absolute"
                            right="8px"
                            top="8px"
                            color="#fff"
                            />
                            <Grid
                            position="absolute"
                            bottom="0"
                            padding="0 16px"
                            display="flex"
                            flexDirection="column"
                            justifyContent="center"
                            width="100%"
                            height="60px"
                            >
                          
                              <Text color="#fff" size="0.875rem">
                                트리플 역세권 사무실
                              </Text>
                              <Text color="#fff" size="0.875rem">
                                <Span>월세</Span> 200만 <Span>보증금</Span> 3,000만
                              </Text>
                            </Grid>
                      </Grid>
                      <Grid
                        width="320px"
                        margin="12px 0 32px 0"
                        height="235px"
                        bg="#999"
                        borderRadius="8px"
                        position="relative"
                        overflow="hidden"
                        > 
                        <Image padding="235px"bottom="0" src="https://velog.velcdn.com/images/ryurim0109/post/6435c602-4d7e-4018-81fa-269d93d5d351/image.jpg" shape="rectangle" position="absolute"/>
                        <Grid  width="100%" height="235px"bottom="0"
                        position="absolute" bg="linear-gradient(0deg, rgba(0, 0, 0, 0.8) 5.74%, rgba(108, 108, 108, 0.0421707) 86.75%, rgba(118, 118, 118, 0) 93.49%)">
                        </Grid>
                          <Button
                            is_like
                            position="absolute"
                            right="8px"
                            top="8px"
                            color="#fff"
                            />
                            <Grid
                            position="absolute"
                            bottom="0"
                            padding="0 16px"
                            display="flex"
                            flexDirection="column"
                            justifyContent="center"
                            width="100%"
                            height="60px"
                            >
                          
                              <Text color="#fff" size="0.875rem">
                                트리플 역세권 사무실
                              </Text>
                              <Text color="#fff" size="0.875rem">
                                <Span>월세</Span> 200만 <Span>보증금</Span> 3,000만
                              </Text>
                            </Grid>
                      </Grid>
                      <Grid
                        width="320px"
                        margin="12px 0 32px 0"
                        height="235px"
                        bg="#999"
                        borderRadius="8px"
                        position="relative"
                        overflow="hidden"
                        > 
                        <Image padding="235px"bottom="0" src="https://velog.velcdn.com/images/ryurim0109/post/6435c602-4d7e-4018-81fa-269d93d5d351/image.jpg" shape="rectangle" position="absolute"/>
                        <Grid  width="100%" height="235px"bottom="0"
                        position="absolute" bg="linear-gradient(0deg, rgba(0, 0, 0, 0.8) 5.74%, rgba(108, 108, 108, 0.0421707) 86.75%, rgba(118, 118, 118, 0) 93.49%)">
                        </Grid>
                          <Button
                            is_like
                            position="absolute"
                            right="8px"
                            top="8px"
                            color="#fff"
                            />
                            <Grid
                            position="absolute"
                            bottom="0"
                            padding="0 16px"
                            display="flex"
                            flexDirection="column"
                            justifyContent="center"
                            width="100%"
                            height="60px"
                            >
                          
                              <Text color="#fff" size="0.875rem">
                                트리플 역세권 사무실
                              </Text>
                              <Text color="#fff" size="0.875rem">
                                <Span>월세</Span> 200만 <Span>보증금</Span> 3,000만
                              </Text>
                            </Grid>
                      </Grid>
            </React.Fragment>
        );
    };
    
    const Span = styled.span`
      font-size: 0.625rem;
    `;
    
    export default OfficeList;

    탭메뉴 2번에 해당하는 컴포넌트

    import React from 'react';
    import { Grid, Button, Text, Image } from "../../elements/index";
    import styled from "styled-components";
    
    const NearStation = (props) => {
        const {tabTitle} =props;
      console.log(tabTitle[1])
        return (
            <React.Fragment>
                <Grid
                        width="320px"
                        margin="12px 0 32px 0"
                        height="235px"
                        bg="#999"
                        borderRadius="8px"
                        position="relative"
                        overflow="hidden"
                        > 
                        <Image padding="235px"bottom="0" src="https://velog.velcdn.com/images/ryurim0109/post/6435c602-4d7e-4018-81fa-269d93d5d351/image.jpg" shape="rectangle" position="absolute"/>
                        <Grid  width="100%" height="235px"bottom="0"
                        position="absolute" bg="linear-gradient(0deg, rgba(0, 0, 0, 0.8) 5.74%, rgba(108, 108, 108, 0.0421707) 86.75%, rgba(118, 118, 118, 0) 93.49%)">
                        </Grid>
                          <Button
                            is_like
                            position="absolute"
                            right="8px"
                            top="8px"
                            color="#fff"
                            />
                            <Grid
                            position="absolute"
                            bottom="0"
                            padding="0 16px"
                            display="flex"
                            flexDirection="column"
                            justifyContent="center"
                            width="100%"
                            height="60px"
                            >
                          
                              <Text color="#fff" size="0.875rem">
                              트리플 역세권 오피스텔
                              </Text>
                              <Text color="#fff" size="0.875rem">
                                <Span>월세</Span> 200만 <Span>보증금</Span> 3,000만
                              </Text>
                            </Grid>
                      </Grid>
                      <Grid
                        width="320px"
                        margin="12px 0 32px 0"
                        height="235px"
                        bg="#999"
                        borderRadius="8px"
                        position="relative"
                        overflow="hidden"
                        > 
                        <Image padding="235px"bottom="0" src="https://velog.velcdn.com/images/ryurim0109/post/6435c602-4d7e-4018-81fa-269d93d5d351/image.jpg" shape="rectangle" position="absolute"/>
                        <Grid  width="100%" height="235px"bottom="0"
                        position="absolute" bg="linear-gradient(0deg, rgba(0, 0, 0, 0.8) 5.74%, rgba(108, 108, 108, 0.0421707) 86.75%, rgba(118, 118, 118, 0) 93.49%)">
                        </Grid>
                          <Button
                            is_like
                            position="absolute"
                            right="8px"
                            top="8px"
                            color="#fff"
                            />
                            <Grid
                            position="absolute"
                            bottom="0"
                            padding="0 16px"
                            display="flex"
                            flexDirection="column"
                            justifyContent="center"
                            width="100%"
                            height="60px"
                            >
                          
                              <Text color="#fff" size="0.875rem">
                              트리플 역세권 오피스텔
                              </Text>
                              <Text color="#fff" size="0.875rem">
                                <Span>월세</Span> 200만 <Span>보증금</Span> 3,000만
                              </Text>
                            </Grid>
                      </Grid>
                      <Grid
                        width="320px"
                        margin="12px 0 32px 0"
                        height="235px"
                        bg="#999"
                        borderRadius="8px"
                        position="relative"
                        overflow="hidden"
                        > 
                        <Image padding="235px"bottom="0" src="https://velog.velcdn.com/images/ryurim0109/post/6435c602-4d7e-4018-81fa-269d93d5d351/image.jpg" shape="rectangle" position="absolute"/>
                        <Grid  width="100%" height="235px"bottom="0"
                        position="absolute" bg="linear-gradient(0deg, rgba(0, 0, 0, 0.8) 5.74%, rgba(108, 108, 108, 0.0421707) 86.75%, rgba(118, 118, 118, 0) 93.49%)">
                        </Grid>
                          <Button
                            is_like
                            position="absolute"
                            right="8px"
                            top="8px"
                            color="#fff"
                            />
                            <Grid
                            position="absolute"
                            bottom="0"
                            padding="0 16px"
                            display="flex"
                            flexDirection="column"
                            justifyContent="center"
                            width="100%"
                            height="60px"
                            >
                          
                              <Text color="#fff" size="0.875rem">
                                트리플 역세권 오피스텔
                              </Text>
                              <Text color="#fff" size="0.875rem">
                                <Span>월세</Span> 200만 <Span>보증금</Span> 3,000만
                              </Text>
                            </Grid>
                      </Grid>
            </React.Fragment>
        );
    };
    const Span = styled.span`
      font-size: 0.625rem;
    `;
    export default NearStation;

    useState를 통해 탭메뉴를 구현할 수 있었다.

    탭 타이틀에 배열 형식으로 타이틀을 적어준다.

    const tabTitle = ['맛집', '역'];
      const tab = { 0: <OfficeList tabTitle={tabTitle}/>, 1: <NearStation tabTitle={tabTitle}/> };

    그리고 탭이 0번일때엔 officelist를 보여주고,

    탭이 1번일 때에는 NearStation를 보여주게 만들어줬다.

     

    728x90
    반응형