首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >D3.js ResizeObserver呈现问题。调整大小后未移除轴

D3.js ResizeObserver呈现问题。调整大小后未移除轴
EN

Stack Overflow用户
提问于 2020-04-17 20:28:36
回答 1查看 208关注 0票数 3

一直在用ResizeObserver在D3中进行实验,问题是当轴重新呈现时,它留下了旧的呈现,留下了前一个轴的“跟踪”。

代码只是一个空白的图表模板,我使用ResizeObserver从contentRect获取div的尺寸大小。然而,它似乎确实在调整规模。

更好地在图像中解释:

我的代码:

代码语言:javascript
运行
复制
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>
);
}
EN

回答 1

Stack Overflow用户

发布于 2022-04-22 11:39:36

只需添加useEffect下一行的末尾:

代码语言:javascript
运行
复制
return () => {
      svg.selectAll('*').remove()
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61280133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档