Highcharts-vue:带有向下钻取的堆叠列

Highcharts-vue: Stacked Columns with Drilldown

我正在尝试使用 vue js 复制此图表http://jsfiddle.net/edzk8Loe/

老实说,我正在学习 vuejs,所以我正在尝试复制已经准备好的项目以快速获得自信。

我想我目前面临的问题是一个逻辑问题。当点击一列时,这些功能必须创建新的系列作为向下钻取,根本不会触发接缝。我在控制台中没有收到任何错误,我

我对结构还没有完全清楚的想法,我想我把代码弄乱了。下面是我在 VUE 中使用的代码。

            <template>
            <div class="chartElem">
                <div class="row">
                    <highcharts class="chart" :constructor-type="'chart'" :options="chartOptions"></highcharts>
                </div>
            </div>
        </template>
        <script>
            import HighchartsVue from "highcharts-vue";
            import Highcharts from "highcharts";
            import dataModule from "highcharts/modules/data";
            import drilldown from "highcharts/modules/drilldown";

            drilldown( Highcharts );
            dataModule( Highcharts );
            let drilldownChart, drilldownEvent, drilldownLevel = 0;
            const chartOptions = {
                chart: {
                    "type": "column",
                },
                credits: {
                    "enabled": false
                },
                plotOptions: {

                    column: {
                        stacking: "normal",
                        events: {
                            click: function ( event ) {
                                return false;
                            }
                        }
                    },
                    "series": {
                        "borderWidth": 0,
                        "dataLabels": {
                            "enabled": true,
                            "style": {
                                "textShadow": false,
                                "fontSize": "10px"
                            }
                        }
                    }
                },
                "legend": {
                    "enabled": false,
                },
                "yAxis": {
                    "stackLabels": {
                        "enabled": false,
                        "style": {
                            "fontWeight": "bold",
                            "color": "gray"
                        }
                    }
                },
                "title": {
                    "text": "Stacked Column Drilldown Chart",
                    "fontWeight": "bold"
                },
                "xAxis": {
                    "title": {},
                    "type": "category"
                },
                "yAxis": [ {
                    "title": {
                        "text": "Number of Students"
                    },
                    "min": 0,
                    "allowDecimals": false
                } ],
                "series": [ {

                    "name": "Outstanding",
                    "color": "rgb(102, 168, 255)",
                    "data": [ {
                        "name": "English",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "105"
                    }, {
                        "name": "Social Science",
                        "y": 1,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "119",
                        "drilldown": true
                    }, {
                        "name": "Science",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "126"
                    }, {
                        "name": "Maths",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "139"
                    }, {
                        "name": "Hindi",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "146"
                    } ]
                }, {
                    type: 'column',
                    "name": "Very Good",
                    "color": "rgb(128, 183, 255)",
                    "data": [ {
                        "name": "English",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "105"
                    }, {
                        "name": "Social Science",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "119",
                        "drilldown": true
                    }, {
                        "name": "Science",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "126"
                    }, {
                        "name": "Maths",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "139"
                    }, {
                        "name": "Hindi",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "146"
                    } ]
                }, {
                    type: 'column',
                    "name": "Satisfactory",
                    "color": "rgb(179, 212, 255)",
                    "data": [ {
                        "name": "English",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "105"
                    }, {
                        "name": "Social Science",
                        "y": 1,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "119",
                        "drilldown": true
                    }, {
                        "name": "Science",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "126"
                    }, {
                        "name": "Maths",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "139"
                    }, {
                        "name": "Hindi",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "146"
                    } ]
                }, {
                    type: 'column',
                    "name": "Needs Improvement",
                    "color": "rgb(204, 226, 255)",
                    "data": [ {
                        "name": "English",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "105"
                    }, {
                        "name": "Social Science",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "119",
                        "drilldown": true
                    }, {
                        "name": "Science",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "126"
                    }, {
                        "name": "Maths",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "139"
                    }, {
                        "name": "Hindi",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "146"
                    } ]
                }, {
                    type: 'column',
                    "name": "Not Performing",
                    "color": "rgb(230, 242, 255)",
                    "data": [ {
                        "name": "English",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "105"
                    }, {
                        "name": "Social Science",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "119",
                        "drilldown": true
                    }, {
                        "name": "Science",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "126"
                    }, {
                        "name": "Maths",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "139"
                    }, {
                        "name": "Hindi",
                        "y": 0,
                        "parentCategoryHierarchyId": "0",
                        "graphParentId": "146"
                    } ]
                } ]
            };



            export default {
                data: () => ( {
                    chartOptions,
                    drilldownChart,
                    drilldownEvent,
                    drilldownLevel
                } ),
                methods: {},
                computed:{
                    drilldown: function ( e ) {
                            if ( !e.seriesOptions ) {
                                updateGraph( true, this, e );
                            }
                        },

                        drillup: function ( e ) {
                            if ( !e.seriesOptions.flag ) {
                                drilldownLevel = e.seriesOptions._levelNumber;
                                updateGraph( false );
                            }
                        }
                },
                mounted() {
                    function updateGraph( isDrilldown, chart, e ) {
                        if ( isDrilldown ) {
                            drilldownLevel++;
                            drilldownChart = chart;
                            drilldownEvent = e;
                            if ( drilldownLevel === 1 ) {
                                var drilldowns = {
                                        'Social Science': {
                                            name: 'Outstanding',
                                            color: 'rgb(102, 168, 255)',
                                            data: [ {
                                                name: 'Geography',
                                                y: 7,
                                                drilldown: true
                                            }, {
                                                name: 'History',
                                                y: 4
                                            }, {
                                                name: 'Civics',
                                                y: 9
                                            } ]
                                        }
                                    },
                                    drilldowns2 = {
                                        'Social Science': {
                                            name: 'Very Good',
                                            color: 'rgb(128, 183, 255)',
                                            data: [ {
                                                name: 'Geography',
                                                y: 4,
                                                drilldown: true
                                            }, {
                                                name: 'History',
                                                y: 8
                                            }, {
                                                name: 'Civics',
                                                y: 2
                                            } ],
                                        },
                                    },
                                    drilldowns3 = {
                                        'Social Science': {
                                            name: 'Satisfactory',
                                            color: 'rgb(179, 212, 255)',
                                            data: [ {
                                                name: 'Geography',
                                                y: 4,
                                                drilldown: true
                                            }, {
                                                name: 'History',
                                                y: 7
                                            }, {
                                                name: 'Civics',
                                                y: 1
                                            } ],
                                        }
                                    },
                                    drilldowns4 = {
                                        'Social Science': {
                                            name: 'Needs Improvement',
                                            color: 'rgb(204, 226, 255)',
                                            data: [ {
                                                name: 'Geography',
                                                y: 2,
                                                drilldown: true
                                            }, {
                                                name: 'History',
                                                y: 7
                                            }, {
                                                name: 'Civics',
                                                y: 2
                                            } ]
                                        }
                                    },
                                    drilldowns5 = {
                                        'Social Science': {
                                            name: 'Not Performing',
                                            color: 'rgb(230, 242, 255)',
                                            data: [ {
                                                name: 'Geography',
                                                y: 6,
                                                drilldown: true
                                            }, {
                                                name: 'History',
                                                y: 3
                                            }, {
                                                name: 'Civics',
                                                y: 0
                                            } ],
                                        }
                                    },
                                    series = drilldowns[ e.point.name ],
                                    series2 = drilldowns2[ e.point.name ],
                                    series3 = drilldowns3[ e.point.name ],
                                    series4 = drilldowns4[ e.point.name ],
                                    series5 = drilldowns5[ e.point.name ];
                                chart.addSingleSeriesAsDrilldown( e.point, series );
                                chart.addSingleSeriesAsDrilldown( e.point, series2 );
                                chart.addSingleSeriesAsDrilldown( e.point, series3 );
                                chart.addSingleSeriesAsDrilldown( e.point, series4 );
                                chart.addSingleSeriesAsDrilldown( e.point, series5 );
                                chart.applyDrilldown();
                            } else if ( drilldownLevel === 2 ) {
                                var drilldown1 = {
                                    "Geography": {
                                        "name": "Yes",
                                        stacking: 'percent',
                                        color: 'red',
                                        "data": [ {
                                            "name": "Q1",
                                            "y": 1
                                        }, {
                                            "name": "Q2",
                                            "y": 2
                                        }, {
                                            "name": "Q3",
                                            "y": 3
                                        }, {
                                            "name": "Q4",
                                            "y": 4
                                        } ]
                                    }
                                };
                                var drilldown2 = {
                                    "Geography": {
                                        "name": "No",
                                        stacking: 'percent',
                                        color: 'green',
                                        "data": [ {
                                            "name": "Q1",
                                            "y": 1
                                        }, {
                                            "name": "Q2",
                                            "y": 2
                                        }, {
                                            "name": "Q3",
                                            "y": 3
                                        }, {
                                            "name": "Q4",
                                            "y": 4
                                        } ]
                                    }
                                };
                                var drilldown3 = {
                                    "exampleDrilldown": {
                                        type: 'line',
                                        "name": "Example",
                                        color: 'black',
                                        "data": [ {
                                            "name": "Q1",
                                            "y": 10
                                        }, {
                                            "name": "Q2",
                                            "y": 20
                                        }, {
                                            "name": "Q3",
                                            "y": 30
                                        }, {
                                            "name": "Q4",
                                            "y": 40
                                        } ]
                                    }
                                }
                                chart.addSingleSeriesAsDrilldown( e.point, drilldown1[ e.point.name ] );
                                chart.addSingleSeriesAsDrilldown( e.point, drilldown2[ e.point.name ] );
                                chart.addSingleSeriesAsDrilldown( e.point, drilldown3[ 'exampleDrilldown' ] );
                                console.log( e );
                                chart.applyDrilldown();
                            }
                        }
                    }
                }
            }

        </script>

我不是找人代替我做任务,我不会学到任何东西。非常欢迎提出想法和提示。

干杯

您在代码中犯了几个简单的错误。

1) 将 updateGraph 函数添加到图表方法 - 这样您就可以在向下钻取回调中调用此方法

2) 在图表对象中保存图表组件引用,以便能够使用向下钻取回调函数中的 updateGraph 方法。你可以使用 mounted() hook:

mounted() {
  this.$children[0].chart.vueRef = this;
}

3) 数据应该是一个函数,returns 一个具有以下属性的对象:

data() {
   return {
     chartOptions,
     drilldownChart,
     drilldownEvent,
     drilldownLevel
   }
}

4) 添加 drilldowndrillup 回调到 chart.events 对象。您可以从保存在挂钩中的图表组件引用中调用 updateGraph 方法:

chart: {
  "type": "column",
  events: {
    drilldown: function(e) {
      if (!e.seriesOptions) {
        this.vueRef.updateGraph(true, this, e);
      }
    },
    drillup: function(e) {
      if (!e.seriesOptions.flag) {
        this.vueRef.drilldownLevel = e.seriesOptions._levelNumber;
        this.vueRef.updateGraph(false);
      }
    }
  }
}

演示: