ghalex / vue3-charts

Vue3-Charts is an SVG-based charting library that is very easy to use and highly customizable
https://vue3charts.org
MIT License
135 stars 23 forks source link

Clickable bars or points #29

Closed nrocco closed 2 years ago

nrocco commented 2 years ago

Let me start by saying that this is an awesome charting library. Thanks for sharing it!

I have a Bar chart and I wish to make the bars clickable so I can execute some logic. I understand the basics of how to add custom layers.

Could you give some pointers on how to make Bars (or Points in a Line graph) clickable?

I can contribute the result as an example to https://vue3charts.org/ if that helps

ghalex commented 2 years ago

Hi @nrocco,

I have made a new release today (1.1.29) that has the ability to select a bar, here is a simple example on how to use it:

<template>
<div class="flex">
    <Chart
      :size="{ width: 800, height: 400 }"
      :data="data"
      :axis="axis"
      :margin="margin"
      :direction="direction"
    >
      <template #layers>
        <Grid strokeDasharray="2,2" :center="false" />
        <HoverBar />
        <Bar
          :dataKeys="['name', 'avg']"
          :barStyle="{ fill: '#FC96c7' }"
          :barStyleSelected="{ fill: '#b1517f' }"
          :selectedBar="selectedBar"
          @bar-click="onBarClick"
        />
      </template>
    </Chart>
    <div v-if="selectedBar">
      <div>Selected bar index: {{selectedBar.idx}}</div>
      <div>Selected bar props: {{selectedBar.props}}</div>
    </div>
  </div>
</template>

<script lang="ts">
import { defineComponent, ref } from '@vue/runtime-core'
import * as mockup from '@/mockup'

export default defineComponent({
  setup() {
    const data = ref<any>(mockup.plByMonth)
    const margin = ref({
      left: 10,
      top: 10,
      right: 10,
      bottom: 10
    })

    const selectedBar = ref(null)
    function onBarClick(bar: any) {
      selectedBar.value = bar
    }

    return { data, margin, selectedBar, onBarClick }
  }
})
</script>

Don't forget to add vue3-charts components if you don't import them:

import Vue3Charts from 'vue3-charts'
....
app.use(Vue3Charts)
nrocco commented 2 years ago

@ghalex Nice!

I can confirm that the new click functionality from 1.1.29 works.

Instead of @bar-click="onBarClick" I had to use @barClick="onBarClick" to make it work.

Tips for others reading this, if you want the mouse cursor to change to a pointer (similar to <a href />) use this in barStyle:

<Bar
  ...
  :barStyle="{ fill: '#rrggbb', cursor: 'pointer' }"
  ...
/>

I will close this issue.