reactjs 图表无响应-react-plotly.js

pvabu6sv  于 2023-03-17  发布在  React
关注(0)|答案(2)|浏览(189)

我已经使用react-plotly.js实现了散点图,我希望图表在页面布局改变时能够自动调整大小,但目前图表的布局不会自动改变,如果我显式地在图表上执行一些函数,强制图表自动重绘,那么只有图表宽度会改变。
我应用了useResizeHandler属性,并将autosize设置为true,但这也没有任何区别。

<Plot
   useResizeHandler
   style={{ width: '100%' }}
   data={chartData}
   onClick={(data) => this.handlePlotClick(data)}
   type={'scatter'}
   layout={this.layout} />

 const layout = {
      autosize: true,
      dragmode: true,
      margin: {
        l: 5,
        r: 5,
        t: 10,
        b: 10,
        pad: 0,
        autoexpand: true
      },
      hovermode: 'closest',
      hoverlabel: {
        bgcolor: 'rgba(0,0,0,1)',
        bordercolor: 'rgba(200,200,200,1)'
      },
      height: '650',
      yaxis: {
        visible: false
      },
      xaxis: {
        autorange: false,
        showline: true,
        fixedrange: false, // true disables range selection on main graph
        rangeslider: {
          range: this.state.sliderRange,
          visible: true,
          borderwidth: 1,
          bordercolor: '#000'
        }
      }
    };
  }

x1c 0d1x正如你在上面的屏幕截图中看到的,div.svg-container和main-svg的宽度相同。但是它仍然在右边留白色。我无法调试为什么它会这样。如果我显式地在图表上执行缩放来重绘绘图,那么它会正确地工作。但是我希望它在页面布局改变时自动调整大小。

gcuhipw9

gcuhipw91#

我也被这个问题卡住了。试试http://codrate.com/questions/how-can-trigger-the-window-resize-event-manually-in-javascript中的window.dispatchEvent(new Event('resize ')
当通过拖动调整图表大小时,我调用了resizeHandler。

resizeHandler = () => {
    this.child.resizeHandler();
    window.dispatchEvent(new Event('resize'));
}

图表总是在调整大小时自动缩放,所以我基本上是在图表大小改变时触发窗口大小调整,所以对您来说,当您检测到页面布局改变时,可以触发窗口大小调整。

wmomyfyw

wmomyfyw2#

下面是一个完整的实现,它包含一个可调整大小的div,这样用户就可以通过调整父div的大小来调整绘图的大小;它使用的是ResizeObserver。这与您的问题略有不同,但我觉得它对其他搜索此问题的人会很有用。
这个精巧的图形位于一个定制的ResizableDiv组件中。

import _ from "lodash";
import PropTypes from "prop-types";
import React, {Component} from "react";
import ReactDOM from "react-dom";
import Plot from "react-plotly.js";

class ResizableDiv extends Component {
    constructor(props) {
        super(props);
        this.ref = React.createRef();
    }
    componentDidMount() {
        this.observer = new window.ResizeObserver(
            _.debounce(item => window.dispatchEvent(new Event("resize")), 1000)
        );
        this.observer.observe(this.ref.current);
    }
    componentWillUnmount() {
        this.observer.unobserve();
    }
    render() {
        return (
            <div style={{resize: "both", overflow: "hidden"}} ref={this.ref}>
                {this.props.children}
            </div>
        );
    }
}
ResizableDiv.propTypes = {
    children: PropTypes.element,
};

class PlotlyFigure extends Component {
    render() {
        const {data, layout} = this.props;
        return (
            <ResizableDiv>
                <Plot
                    data={data}
                    layout={layout}
                    useResizeHandler={true}
                    style={{width: "100%", height: "100%"}}
                />
            </ResizableDiv>
        );
    }
}
PlotlyFigure.propTypes = {
    data: PropTypes.array,
    layout: PropTypes.object,
};

相关问题