一直在用ResizeObserver在D3中进行实验,问题是当轴重新呈现时,它留下了旧的呈现,留下了前一个轴的“跟踪”。
代码只是一个空白的图表模板,我使用ResizeObserver从contentRect获取div的尺寸大小。然而,它似乎确实在调整规模。
更好地在图像中解释:
我的代码:
const useResizeObserver = (ref) => {
const [dimensions, setDimensions] = useState(null);
useEffect(() => {
const observeTarget = ref.current;
const resizeObserver = new ResizeObserver(entries => {
entries.forEach(entry => {
setDimensions(entry.contentRect);
});
});
resizeObserver.observe(observeTarget);
return () => {
resizeObserver.unobserve(observeTarget);
};
}, [ref]);
return dimensions;
};
export default function BarChart() {
const [data, setData] = useState([10]);
const svgRef = useRef();
const wrapperRef = useRef();
const dimensions = useResizeObserver(wrapperRef);
useEffect(() => {
const margin = { top: 10, bottom: 10, right: 10, left: 10 };
const svg = select(svgRef.current);
if (!dimensions) return;
// xAxis
const xScale = scaleLinear()
.domain([0, 10])
.range([0, dimensions.width]);
const xAxisFormat = number => format('')(number);
const xAxis = axisBottom(xScale)
.ticks(10)
.tickFormat(xAxisFormat)
.tickPadding(10);
const xAxisG = svg.append('g')
.call(xAxis)
.attr('transform', `translate(0, ${height})`)
svg
.select('.xAxis')
.call(xAxis)
// yAxis
const yScale = scaleLinear()
.domain([0, 100])
.range([height, 0]);
const yAxisFormat = number => format('')(number);
const yAxis = axisLeft(yScale)
.ticks(10)
.tickFormat(yAxisFormat)
.tickPadding(10);
const yAxisG = svg.append('g')
.call(yAxis)
svg
.select('.xAxis')
.call(xAxis)
},[data, dimensions]);
return (
<React.Fragment>
<div ref={wrapperRef}>
<svg className="barChartSVG" ref={svgRef} width={width} height= {height} />
</div>
</React.Fragment>
);
}
发布于 2022-04-22 11:39:36
只需添加useEffect
下一行的末尾:
return () => {
svg.selectAll('*').remove()
}
https://stackoverflow.com/questions/61280133
复制相似问题