2022/01/16
오늘 한 일
커스텀 테이블 컴포넌트
- 테이블 열의 꺽쇠 아이콘을 누르면 상세 정보가 확장되어야한다.
테이블 헤더 컴포넌트
/* CoinInfoTable.tsx */
// 테이블 헤더 컴포넌트
const CoinInfoTableHeader = (props: any) => {
return (
<div className="coininfo-table header">
<div className="coinSymbol">
<span>이름</span>
</div>
<div className="currentPrice">
<span>가격</span>
</div>
<div className="percentChange24h">
<span>24시간</span>
</div>
<div className="volume24h">
<span>거래량(24h)</span>
</div>
</div>
);
};
// 테이블 열 컴포넌트
const CoinInfoTableItem = (props: any) => {
const [ExpandVisible, setExpandVisible] = useState(false);
const handleExpand = (e) => {
setExpandVisible(!ExpandVisible);
};
const { data } = props;
return (
<>
<div
className={
ExpandVisible ? `coininfo-table row open` : `coininfo-table row`
}
>
{/* 이름/가격/차액/거래량 */}
<div className="coinSymbol">
<div className="coinNm">
<Image
src={data.logo}
width={12}
height={12}
className="coinSymbol"
/>
<span className="coinNm">{data.coinNm}</span>
</div>
<div className="coinSymbol">
<FavoriteButton
coinSymbol={data.coinSymbol}
showErrMsg={function (): void {
throw new Error('Function not implemented.');
}}
/>
<span className="coinSymbol">{data.coinSymbol}</span>
<Image src="/svg/graph_icon.svg" width={12} height={10.5} />
</div>
</div>
<div className="currentPrice">
<span>{coinPriceFnc(data.currentPrice)}</span>
</div>
<div className="percentChange24h">
<span className={data.percentChange24h > 0 ? `plus` : `minus`}>
{roundFnc(data.percentChange24h)}%
</span>
</div>
<div className="volume24h">
<span>
<span>{volumeFnc(data.volume24h)}</span>
<span> 백만</span>
</span>
<div
className={ExpandVisible ? `expand-icon open` : `expand-icon`}
onClick={handleExpand}
></div>
</div>
</div>
{ExpandVisible ? <CoinInfoExpand data={data} /> : null}
</>
);
};
// 테이블 열을 클릭했을 때 보여지는 상세 정보
const CoinInfoExpand = (props) => {
const { data } = props;
return (
<div className="coininfo-table row-expand">
<div className="top">
<div className="currentPrice item">
<span className="label">가격</span>
<span>{coinPriceFnc(data.currentPrice)}</span>
</div>
<div className="percentChange1h item">
<span className="label">1시간</span>
<span className={data.percentChange1h > 0 ? `plus` : `minus`}>
{roundFnc(data.percentChange1h)}%
</span>
</div>
<div className="percentChange24h item">
<span className="label">24시간</span>
<span className={data.percentChange24h > 0 ? `plus` : `minus`}>
{roundFnc(data.percentChange24h)}%
</span>
</div>
</div>
<div className="bottom">
<div className="percentChange7d item">
<span className="label">7일</span>
<span className={data.percentChange7d > 0 ? `plus` : `minus`}>
{roundFnc(data.percentChange7d)}%
</span>
</div>
<div className="marketCap item">
<span className="label">시가총액</span>
<span>
<span>{volumeFnc(data.marketCap)}</span>
<span> 백만</span>
</span>
</div>
<div className="volume24h item">
<span className="label">거래량(24h)</span>
<span>
<span>{volumeFnc(data.volume24h)}</span>
<span> 백만</span>
</span>
</div>
</div>
<div className="btn-group">
<div>공시</div>
<div>비교</div>
</div>
</div>
);
};
// 상단의 하위 컴포넌트를 모두 합친 테이블 컴포넌트
const CoinInfoTable = (props: any) => {
const { market } = props;
const [TableData, setTableData] = useState(dummyCoinInfoData.datas);
const [Order, setOrder] = useState('');
const [OrderType, setOrderType] = useState<'' | 'ASC' | 'DESC'>('');
const handleASC = (value) => {
if (OrderType === 'DESC') {
setOrderType('ASC');
} else {
setOrderType('DESC');
}
};
useEffect(() => {
/* props로 내려받는 거래소 유형이 바뀔 때마다 setTableData 실행 */
}, [market]);
useEffect(() => {
/* TODO: Order/OrderType이 바뀔 때마다 TableData state 업데이트 */
}, [Order, OrderType]);
return (
<div className="coininfo-table wrapper">
<CoinInfoTableHeader />
<div className="coininfo-table body">
{TableData.map((el, index) => {
return <CoinInfoTableItem key={index} data={el} />;
})}
</div>
</div>
);
};
export default CoinInfoTable;
글쓰기 페이지 이동 버튼
- 지금으로서는 캐러셀을 쓸 때 페이지 라우팅을 할 수 없으니 게시판별 컴포넌트에다가 글쓰기 버튼 컴포넌트를 넣어서 사용해야한다.
props
에 게시판 유형을 넣어서 라우팅을 할 수 있게 한다.
/* WriteButton * ?
import Image from 'next/image';
import { useRouter } from 'next/router';
/* 이동해야할 게시판 URL, 카테고리(router.query) */
interface IProps {
category: string;
}
const WriteButton = (props) => {
const { category } = props;
const router = useRouter();
return (
<button
className="write-btn"
onClick={() => router.push({pathname: '/m/community/write';
query: {category: category})}
>
<Image src="/svg/write_button.svg" width={15} height={18} />
</button>
);
};
export default WriteButton;
// _write-button.scss
.write-btn {
max-width: 3.125rem;
max-height: 3.125rem;
min-width: 3.125rem;
min-height: 3.125rem;
background-color: #fff;
border: $border-style-default;
border-radius: 50%;
box-shadow: 0 3px 13px 0 #eaeef1;
}
Author And Source
이 문제에 관하여(2022/01/16), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@nahsooyeon/20220116저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)