javascript - D3.js ResizeObserver 呈现问题。调整大小后未删除轴

标签 javascript d3.js

在 D3 中尝试使用 ResizeObserver,问题是当轴重新渲染时它会留下旧渲染,留下前一个轴的“痕迹”。

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

最好用图片解释:

Before resizing the browser After resizing the browser

我的代码:

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>
);
}

最佳答案

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

return () => {
      svg.selectAll('*').remove()
    }

关于javascript - D3.js ResizeObserver 呈现问题。调整大小后未删除轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61280133/

相关文章:

javascript - D3回调函数的 `this`阴影对象的 `this`

javascript - D3.js 决策树 - 文本换行、边界框、负载圈数

javascript - 将 <link rel ="stylesheet"> 原始内容加载到 &lt;style&gt; 标签中

javascript - 带有 [ngmodel] 的 Angular Material 2 日期选择器

javascript - JavaScript 中提升名称解析顺序如何工作?

javascript - D3js 如何在 .enter 上下文中追加 2 个相同级别的 child

javascript - 使用正方形表示 map 中的计数

javascript - "i = (i + 1) % word.length "背后的逻辑是什么

php - 控制别人的窗口屏幕

javascript - 如何向服务请求 d3 数据?