useContext()

gyojinnK·2024년 1월 12일

리액트 플러스

목록 보기
4/11
post-thumbnail

Start-Up 프로젝트를 진행하면서 컴포넌트 사이의 데이터 전송이 필요했다.
사전에 생성했던 FuncList.tsx 컴포넌트의 click state값을 새로 생성한 SubDataList.tsx에 전달해보자.

먼저 데이터는 json형식으로 파일에 따로 저장했다.

{
    "script" : [[{
        "Daily" : [
            {"id" : 1, "text" : "안녀하세요. 처음 뵙겠습니다."},
            {"id" : 2, "text" : "서울역은 어디에 있나요?"},
            {"id" : 3, "text" : "화장실은 어디로 가야하나요?"},
            {"id" : 4, "text" : "이건 테스트 텍스트입니다."}
        ]}],
        [{"Business" : [
            {"id" : 1, "text" : "안녀하세요. 처음 뵙겠습니다."},
            {"id" : 2, "text" : "서울역은 어디에 있나요?"},
            {"id" : 3, "text" : "화장실은 어디로 가야하나요?"},
            {"id" : 4, "text" : "이건 테스트 텍스트입니다."}
        ]}],
        [{"Movie" : [
            {"id" : 1, "text" : "안녀하세요. 처음 뵙겠습니다."},
            {"id" : 2, "text" : "서울역은 어디에 있나요?"},
            {"id" : 3, "text" : "화장실은 어디로 가야하나요?"},
            {"id" : 4, "text" : "이건 테스트 텍스트입니다."}
        ]}],
        [{"Drama" : [
            {"id" : 1, "text" : "안녀하세요. 처음 뵙겠습니다."},
            {"id" : 2, "text" : "서울역은 어디에 있나요?"},
            {"id" : 3, "text" : "화장실은 어디로 가야하나요?"},
            {"id" : 4, "text" : "이건 테스트 텍스트입니다."}
        ]}]
    ]
}

해당 파일은 실제 데이터를 핸들링하기 전에 프로토타입 형식으로 테스트 데이터만 담아 만든 json파일이다.
이를 추출하여 데이터를 사용자에게 노출할 것이다.

기존 FuncList 컴포넌트이다.

/* eslint-disable */
import React, { useState } from 'react';
import './FuncList.css';
import data from '../../jData/categoryData.json';
import {Simulate} from "react-dom/test-utils";
import click = Simulate.click;

export default function FuncList(){

    const [hover, setHover] = useState([0, 0, 0, 0, 0]);
    const [click, setClick] = useState([0, 0, 0, 0, 0]);

    function ChangeHover(s : number, index : number){
        hover[index] = s;
        setHover([...hover]);
    }

    function ChangeClick(index : number){
        click[index] = click[index] ? 0 : 1;
        for(let i=0; i<click.length; i++){
            if(i !== index){
                click[i] = 0;
            }
        }
        console.log(click);
        setClick([...click]);
    }

    function pStyle(i : number){
        let obj = {
            transition: '0.5s',
            color: hover[i] || click[i] ? 'white' : '#0554F2',
        }
        return obj;
    }

    function spanStyle(i : number){
        let obj = {
            transition: '0.5s',
            height: hover[i] || click[i] ? '100%' : '1px',
        }
        return obj;
    }

    return(
        <div className='listWrap'>
            <ul>
                {data.property.map((item : any, i : number) => (
                    <li key={item.id}  onMouseOver={()=>{ChangeHover(1, i)}} onMouseOut={() => ChangeHover(0, i)}
                    onClick={()=>ChangeClick(i)}>
                        <p style={pStyle(i)}>{item.title}</p>
                        <span style={spanStyle(i)}></span>
                    </li>
                ))}
            </ul>
        </div>
    )
}

FuncList의 click state는 클릭된 리스트의 해당 인덱스의 값을 0에서 1로 변경한다. 첫번째 인덱스인 Daily를 클릭한다면 click state의 0번째 값이 1로 변경되고 나머지 인덱스는 0으로 초기화한다.
이 state의 값을 SubDataList로 전달하여 FuncList의 click이 변경되면 위 이미지에 보이는 Content 공간에 해당 인덱스에 맞는 json값들을 노출할 것이다.

profile
기록하고 꺼내보고

0개의 댓글