功能:不清楚后端传过来的数据有多少组,动态接收不确定条数的折线图,展示的也可以是柱状图

    1. <template>
    2. <v-chart :options="option" :autoresize="true" theme="light"/>
    3. </template>
    4. <script>
    5. // 封装能动态接收摄像头评分的图表
    6. export default {
    7. props: {
    8. title: {
    9. // 图表标题
    10. type: String
    11. },
    12. color: {
    13. // 传给图例和图表的颜色
    14. type: Array
    15. },
    16. seriesNames: {
    17. // 图例或和统计图的名称,
    18. type: Array
    19. },
    20. xAxis: {
    21. // 图表的x轴数据,
    22. type: Array
    23. },
    24. seriesArr: {
    25. // 图表的整个series数据
    26. type: Array
    27. }
    28. },
    29. data () {
    30. return {
    31. option: {
    32. color: this.color,
    33. title: {
    34. text: this.title
    35. },
    36. tooltip: {
    37. trigger: 'axis'
    38. },
    39. legend: {
    40. data: this.seriesNames
    41. },
    42. grid: {
    43. top: '35%',
    44. left: '2%',
    45. right: '4%',
    46. },
    47. xAxis: {
    48. type: 'category',
    49. data: this.xAxis,
    50. boundaryGap: true,
    51. },
    52. yAxis: [
    53. {
    54. type: 'value',
    55. name: '分',
    56. axisLabel: {
    57. formatter: '{value}',
    58. textStyle: {
    59. color: 'rgba(255,255,255,.8)'
    60. }
    61. }
    62. },
    63. ],
    64. series: this.seriesArr // 重要的数据,获取正确的格式即可
    65. }
    66. }
    67. },
    68. watch: { // 监听
    69. title: {
    70. handler (value) {
    71. this.option.title.text = value
    72. }
    73. },
    74. seriesNames: {
    75. deep: true,
    76. handler (val) {
    77. this.option.legend.data = val
    78. }
    79. },
    80. xAxis: {
    81. deep: true,
    82. handler (value) {
    83. this.option.xAxis.data = value
    84. }
    85. },
    86. seriesArr: { // 监听 将获取的值赋给series
    87. deep: true,
    88. handler (value) {
    89. // console.log('监听是否得到数据', value) // 可正常打印
    90. this.option.series = value
    91. console.log('series值:', this.option.series)
    92. }
    93. },
    94. },
    95. }
    96. </script>
    97. <style lang="less" >
    98. </style>
    1. <template>
    2. <div class="center-chart charts-border">
    3. <!-- 评分表 -->
    4. <score-lines
    5. :title="this.infoTitle"
    6. :color="colorArr1"
    7. :seriesNames="seriesNames1"
    8. :xAxis="this.xAxis1"
    9. :seriesArr="seriesArr"
    10. class="center-info-chart"
    11. />
    12. </div>
    13. </template>
    14. <script>
    15. import ScoreLines from '@/components/context/ScoreLines'
    16. import
    17. {
    18. reqCameraScore,
    19. reqCameraChannel
    20. } from '@/api'
    21. export default {
    22. components: {
    23. ScoreLines
    24. },
    25. data () {
    26. return {
    27. // 评分表
    28. colorArr1: ['#319aff', '#ff5c1e', '##fccb00', '#FF0087', '#1bd175'],
    29. seriesNames1: [],
    30. cameraScoreArr: [],
    31. xAxis1: [],
    32. seriesArr: []
    33. }
    34. },
    35. watch: {
    36. },
    37. mounted () {
    38. }
    39. destroyed () {
    40. window.removeEventListener('resize', this.resizeChart)
    41. },
    42. methods: {
    43. resizeChart () {
    44. // 头部 64,按钮组 64 信息统计占96,上下留8px间隔
    45. const height = (window.innerHeight - 128 - 104) / 2
    46. const chartArr = document.getElementsByClassName('center-info-chart')
    47. chartArr[0].style.height = height + 'px'
    48. chartArr[1].style.height = height + 'px'
    49. },
    50. async getData (span) {
    51. // 获取该场景下的摄像头id
    52. const id = await reqCameraChannel({ category_code: this.category_code }) // 接口参数
    53. const checkoutId = id.category_map_channels.checkout
    54. console.log('有几号:', checkoutId) // ['2','20']
    55. const title = []
    56. for (let i = 0; i < checkoutId.length; i++) {
    57. cameraTitle.push(checkoutId[i] + "号摄像头")
    58. }
    59. // console.log('名称', title)
    60. this.seriesNames1 = title
    61. // console.log('名称', this.seriesNames1) // 正确打印所有名称
    62. const scoreData = []
    63. for (let i = 0; i < checkoutId.length; i++) {
    64. scoreData[i] = await reqCameraScore({ span, channel_id: checkoutId[i] })
    65. }
    66. // console.log('该场景下的数组们:', scoreData) // 正常
    67. this.xAxis1 = getxAxisArr(scoreData[1], isToday)
    68. // console.log('x轴:', this.xAxis1) // 正常
    69. const dataArr = []
    70. for (let i = 0; i < scoreData.length; i++) {
    71. // 取出scoreData中每一个对象属性的评分值组成一个新的数组
    72. dataArr.push(Object.values(scoreData[i]))
    73. }
    74. // console.log('series 的 data 数组:', dataArr)
    75. // 处理数据 乘以100并保留一位小数
    76. for (let i = 0; i < dataArr.length; i++) {
    77. for (let j = 0; j < dataArr[i].length; j++) {
    78. dataArr[i][j] = (dataArr[i][j] * 100).toFixed(1)
    79. }
    80. }
    81. // console.log('series 的 data 数组:', dataArr)
    82. // this.seriesArr = dataArr
    83. const allDataArr = []
    84. // 将数据转化为[{},{}]形式
    85. for (let i = 0; i < scoreData.length; i++) {
    86. allDataArr.push({ type: 'line', smooth: true, label: { show: false }, stack: 'Total', name: title[i], data: dataArr[i] })
    87. }
    88. this.seriesArr = allDataArr
    89. // console.log('series评分数组打印:', this.seriesArr)
    90. }
    91. }
    92. }
    93. </script>
    94. <style lang="less">
    95. </style>

    image.pngimage.png