📍원래의 코드
const adFormatDataGraph = {
labels: adFormatData.labels,
datasets: [
{
labels: adFormatData.labels,
data: adFormatData.data,
borderWidth: 0,
// 추후 옵션 설정의 값 갯수에 따라 컬러 추가 필요합니다.
backgroundColor: [
'rgba(66, 165, 245, 1)',
'rgba(102, 187, 106, 1)',
'rgba(158, 189, 178, 1)',
],
},
],
};
const funnelLevelDataGraph = {
labels: funnelLevelData.labels,
datasets: [
{
labels: funnelLevelData.labels,
data: funnelLevelData.data,
borderWidth: 0,
backgroundColor: [
'rgba(66, 165, 245, 1)',
'rgba(102, 187, 106, 1)',
'rgba(158, 189, 178, 1)',
],
},
],
};
기존의 코드는 데이터가 들어올때마다 다른 색상들을 보여주는게 아닌,
color를 설정한 기준으로 만드는 순서에 따라
하늘 - 연두 - 회색 이런식으로 생성 되었다.
single-media, search, collection
awareness, conversion, consideration
총 6가지 데이터를 차트에 받아와야했고,
6가지 color로 구분을 지어주어야했다.
데이터를 불러올 때 경우의 수를 생각함
collection <-> search
collection <-> single-media
search <-> single-media
awareness <-> conversion
consideration <-> conversion
awareness <-> consideration
우선은 데이터가 하나만 들어올때, 두개가 들어올때, 세개 다 들어올때의 경우의 수를
적어보았다.
const adFormatDataGraphSingle = {
labels: adFormatData.labels,
datasets: [
{
labels: adFormatData.labels,
data: adFormatData.data,
borderWidth: 0,
// 추후 옵션 설정의 값 갯수에 따라 컬러 추가 필요합니다.
backgroundColor: [
(adFormatData?.labels?.length === 1) &
(adFormatData?.labels?.[0] === 'search')
? 'rgba(179, 157, 219, 1)'
: (adFormatData?.labels?.length === 1) &
(adFormatData?.labels?.[0] === 'single-media')
? 'rgba(67, 165, 245, 1)'
: (adFormatData?.labels?.length === 1) &
(adFormatData?.labels?.[0] === 'collection')
? 'rgba(102, 187, 106, 1)'
: null,
],
},
],
};
하나만 들어올 땐,
삼항연산자를 활용하여 간단히 해결.
두개만 들어올 땐?
// collection <-> search
const adFormatDataGraphDouble1 = {
labels: adFormatData.labels.sort(),
datasets: [
{
labels: adFormatData.labels.sort(),
data: adFormatData.data,
borderWidth: 0,
backgroundColor: ['rgba(102, 187, 106, 1)', 'rgba(179, 157, 219, 1)'],
},
],
};
// collection <-> single-media
const adFormatDataGraphDouble2 = {
labels: adFormatData.labels.sort(),
datasets: [
{
labels: adFormatData.labels.sort(),
data: adFormatData.data,
borderWidth: 0,
backgroundColor: ['rgba(102, 187, 106, 1)', 'rgba(67, 165, 245, 1)'],
},
],
};
// search <-> single-media
const adFormatDataGraphDouble3 = {
labels: adFormatData.labels.sort(),
datasets: [
{
labels: adFormatData.labels.sort(),
data: adFormatData.data,
borderWidth: 0,
backgroundColor: ['rgba(179, 157, 219, 1)', 'rgba(67, 165, 245, 1)'],
},
],
};
adFormatDataGraphDouble1,2,3 이라는 함수를 만들고,
그안에 로직을 구현하였다.
여기서 문제가 ?
데이터의 color 값은 순서대로만 받아 올 수 있기때문에
search, single-media, collection 의 알파벳 순서에 따라
sort() 메소드를 활용하여 collection, search, single-media 의 순서대로
데이터 값을 받아 올 수 있도록 구현하였다.
두개짜리 데이터들이 잘 들어오는 모습
세개짜리 데이터는?
const adFormatDataGraphTriple = {
labels: adFormatData.labels.sort(),
datasets: [
{
labels: adFormatData.labels.sort(),
data: adFormatData.data,
borderWidth: 0,
backgroundColor: [
'rgba(102, 187, 106, 1)',
'rgba(179, 157, 219, 1)',
'rgba(67, 165, 245, 1)',
],
},
],
};
세개짜리 데이터도 잘들어옴.
<Pie
options={adFormatGraphOptions}
data={
adFormatData?.labels?.length === 1
? adFormatDataGraphSingle
: (adFormatData?.labels?.length === 2) &
(adFormatData?.labels.sort()?.[0] === 'search')
? adFormatDataGraphDouble3
: (adFormatData?.labels?.length === 2) &
(adFormatData?.labels.sort()?.[0] === 'collection') &
(adFormatData?.labels.sort()?.[1] === 'search')
? adFormatDataGraphDouble1
: (adFormatData?.labels?.length === 2) &
(adFormatData?.labels.sort()?.[0] === 'collection') &
(adFormatData?.labels.sort()?.[1] === 'single-media')
? adFormatDataGraphDouble2
: adFormatData?.labels?.length === 3
? adFormatDataGraphTriple
: adFormatDataGraphTriple
}
/>
pie 컴포넌트안에 위에서 구현한 함수를 넣어준다 .
awareness, consideration, conversion 도 똑같이 만들어주면되는데
여기서 주의해야할점은?
위의
collection, search, single-media 의 데이터와 똑같이 기능을 구현하게 되면
알파벳 순서가 다르기때문에 원하는 색깔의 데이터가 안들어올지도 모른다.
각각의 알파벳 순서를 생각하며 알맞게 넣어주면 끝!
'개발이야기 > React.js' 카테고리의 다른 글
[React] 참조형 State (1) | 2022.05.24 |
---|---|
[React] useState Hook (0) | 2022.05.23 |
React에서 Click 한 메뉴만 활성화하는 법 (한글 및 띄어쓰기 메뉴 해결 방법) (0) | 2022.05.03 |
[react] 프로젝트 초기세팅 (0) | 2022.05.03 |
[React] map() (2) | 2022.04.17 |