You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+Highcharts:如何从饼图点击事件访问组件实例

解决React组件中Highcharts饼图点击事件的this指向问题

有三种常用方法可以让你在Highcharts的点击事件回调中获取到React组件实例:

方法一:使用箭头函数

箭头函数不会创建自己的this,它会继承外层作用域的this(也就是组件实例)。直接把点击事件的回调改成箭头函数即可:

class MyChart extends Component<IProps_Chart, IState_Chart> {
    constructor(props: IProps_Chart) {
        super(props);
        Highcharts.setOptions(theme);
        const pieOptions: any = this.props.compact ? {
            chart: { type: 'pie' },
            series: [{
                data: this.props.data,
                point: {
                    events: {
                        // 改用箭头函数,this指向组件实例
                        click: (event: Highcharts.SeriesClickCallbackFunction) => {
                            this.setState({id: event.pointerId});
                        }
                    }
                }
            }]
        };
        this.state = { options: pieOptions };
    }
    render() {
        return (<HighchartsReact options={this.state.options} highcharts={Highcharts}/>);
    }
}

方法二:提前保存组件实例的引用

在构造函数里把组件的this赋值给一个变量(比如that),然后在回调函数中使用这个变量来调用组件的方法:

class MyChart extends Component<IProps_Chart, IState_Chart> {
    constructor(props: IProps_Chart) {
        super(props);
        Highcharts.setOptions(theme);
        // 保存组件实例的引用
        const that = this;
        const pieOptions: any = this.props.compact ? {
            chart: { type: 'pie' },
            series: [{
                data: this.props.data,
                point: {
                    events: {
                        click: function(event: Highcharts.SeriesClickCallbackFunction) {
                            // 使用that代替this,指向组件实例
                            that.setState({id: event.pointerId});
                        }
                    }
                }
            }]
        };
        this.state = { options: pieOptions };
    }
    render() {
        return (<HighchartsReact options={this.state.options} highcharts={Highcharts}/>);
    }
}

方法三:将回调抽为类方法并绑定this

如果点击逻辑比较复杂,可以把它抽成组件的类方法,然后在构造函数中绑定this:

class MyChart extends Component<IProps_Chart, IState_Chart> {
    constructor(props: IProps_Chart) {
        super(props);
        Highcharts.setOptions(theme);
        // 绑定类方法的this到组件实例
        this.handlePieClick = this.handlePieClick.bind(this);
        const pieOptions: any = this.props.compact ? {
            chart: { type: 'pie' },
            series: [{
                data: this.props.data,
                point: {
                    events: {
                        click: this.handlePieClick
                    }
                }
            }]
        };
        this.state = { options: pieOptions };
    }

    // 抽离的点击处理方法
    handlePieClick(event: Highcharts.SeriesClickCallbackFunction) {
        this.setState({id: event.pointerId});
    }

    render() {
        return (<HighchartsReact options={this.state.options} highcharts={Highcharts}/>);
    }
}

内容的提问来源于stack exchange,提问作者Zhihar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:50:26