참고 문서
https://www.chartjs.org/docs/latest/samples/legend/html.html
https://www.chartjs.org/docs/latest/developers/plugins.html
https://react-chartjs-2.js.org/components/line
리액트에서 Line 컴포넌트 plugins 프롭스에 custom legend 함수 작성해주면된다.
<Line
options={options}
data={data}
plugins={[htmlLegendPlugin]}
/>
콘솔로 찍어가면서 html 생성해주고, css로 마무리하면된다.
const getOrCreateLegendList = (chart, id) => {
const legendContainer = document.getElementById(id);
let listContainer = legendContainer.querySelector('ul');
if (!listContainer) {
listContainer = document.createElement('ul');
listContainer.style.display = 'flex';
listContainer.style.flexDirection = 'row';
listContainer.style.margin = 0;
listContainer.style.padding = 0;
legendContainer.appendChild(listContainer);
}
return listContainer;
};
const htmlLegendPlugin = {
id: 'htmlLegend',
afterUpdate(chart, args, options) {
const ul = getOrCreateLegendList(chart, options.containerID);
// Remove old legend items
while (ul.firstChild) {
ul.firstChild.remove();
}
// Reuse the built-in legendItems generator
const items = chart.options.plugins.legend.labels.generateLabels(chart);
items.forEach(item => {
const li = document.createElement('li');
li.style.alignItems = 'center';
li.style.cursor = 'pointer';
li.style.display = 'flex';
li.style.flexDirection = 'row';
li.style.marginLeft = '10px';
li.onclick = () => {
const {type} = chart.config;
if (type === 'pie' || type === 'doughnut') {
// Pie and doughnut charts only have a single dataset and visibility is per item
chart.toggleDataVisibility(item.index);
} else {
chart.setDatasetVisibility(item.datasetIndex, !chart.isDatasetVisible(item.datasetIndex));
}
chart.update();
};
// Color box
const boxSpan = document.createElement('span');
boxSpan.style.background = item.fillStyle;
boxSpan.style.borderColor = item.strokeStyle;
boxSpan.style.borderWidth = item.lineWidth + 'px';
boxSpan.style.display = 'inline-block';
boxSpan.style.height = '20px';
boxSpan.style.marginRight = '10px';
boxSpan.style.width = '20px';
// Text
const textContainer = document.createElement('p');
textContainer.style.color = item.fontColor;
textContainer.style.margin = 0;
textContainer.style.padding = 0;
textContainer.style.textDecoration = item.hidden ? 'line-through' : '';
const text = document.createTextNode(item.text);
textContainer.appendChild(text);
li.appendChild(boxSpan);
li.appendChild(textContainer);
ul.appendChild(li);
});
}
};
'Frontend > React' 카테고리의 다른 글
[Yarn] react에서 yarn berry (pnp) 에러 (0) | 2023.05.04 |
---|---|
[React] 리액트 range slider 라이브러리 사용해서 range bar 만들기 (0) | 2023.04.26 |
[React Chart] 리액트 chart.js tooltip custom 하기 (0) | 2023.04.24 |
[React Swiper] loop={true} 마지막 페이지 먼저보이는 에러 (0) | 2023.04.13 |
[React Swiper] import css 안될 때 (0) | 2023.04.13 |