【问题标题】:How to make react-google Chart label clickable如何使 react-google 图表标签可点击
【发布时间】:2021-08-25 19:00:42
【问题描述】:

我正在研究 react google-chart react-google-chart 并且运行良好。 我想要做的是将点击事件添加到水平轴的标签并获取标签名称并做我想做的事情

我google了很多,但没有找到正确的解决方案

我做的是这个

import React, { Component } from 'react'
import { Chart } from "react-google-charts";
export default class manpowerGraph extends Component {
    render() {
     const data=[
        ['Year', 'Sales'],
        ['jan', 20],
        ['feb', 100],
        ['march', 55],
        ['april', 120],
        ['may', 200],
        ['june', 220],


      ]
     const options={
        // Material design options
        chart: {
          title: 'Manpower',
        },
      }
        return (
            <div className="manpowerChart">
<Chart
  chartType="Bar"
  width="100%"
  height="400px"
  data={data}
  options={options}
  legendToggle
  chartEvents={[
    {
      eventName: "ready",
      callback: ({ chartWrapper, google }) => {
        const chart = chartWrapper.getChart();
        google.visualization.events.addListener(chart, "onmouseover", e => {
          const { row, column } = e;
          console.warn("MOUSE OVER ", { row, column });
        });
        google.visualization.events.addListener(chart, "onmouseout", e => {
          const { row, column } = e;
          console.warn("MOUSE OUT ", { row, column });
        });
      }
    }
  ]}
/>

            </div>
        )
}
}

工作代码Working code I want when user click on month label it should fire any event or console

我在Javascript with Javascript 找到了这个

【问题讨论】:

    标签: javascript reactjs react-google-charts


    【解决方案1】:

    将图表类型更改为ColumnChart,然后从ready 处理程序添加click 处理程序。

            <Chart
              chartType="ColumnChart"
              width="80%"
              height="400px"
              data={data}
              options={options}
              legendToggle
              chartEvents={[
                {
                  eventName: "ready",
                  callback: ({ chartWrapper, google }) => {
                    const chart = chartWrapper.getChart();
                    var handler = function(e) {
                      console.log(e);
                      var parts = e.targetID.split("#");
                      if (parts.indexOf("label") >= 0) {
                        let idx = parts[parts.indexOf("label") + 1];
                        idx = parseInt(idx);
                        alert(data[idx + 1][0]);
                      }
                    };
                    google.visualization.events.addListener(
                      chartWrapper.getChart(),
                      "click",
                      handler
                    );
                  }
                }
              ]}
            />
    
    

    https://codesandbox.io/s/react-google-charts-columnchart-with-click-handler-cqe1l

    编辑

    回答其他问题:

    您可以通过在options 中设置hAxis.textStyle 来对x 轴标签进行有限的样式设置,支持的样式选项可以在这里找到https://developers.google.com/docs/api/reference/rest/v1/documents#TextStyle。但是,您不能使用textStyle 设置cursor

    您不能通过外部 css 设置 svg 样式。但是您可以在svg 标签内添加style 标签。同样,并非所有 CSS 样式都有效,但幸运的是,cursor 确实有效。

    svg 中添加style 的一种粗略方法是使用document.querySelector 获取svg 元素,然后将style 添加为子元素。这可以通过您的 ready 处理程序来完成,因为在触发 ready 事件时已经创建了 svg 元素。

    更新后的代码现在看起来像:

    import React from "react";
    import ReactDOM from "react-dom";
    import Chart from "react-google-charts";
    const data = [
      ["Year", "Sales"],
      ["2004", 1000],
      ["2005", 1170],
      ["2006", 660],
      ["2008", 1030],
      ["2009", 1000],
      ["2010", 1170],
      ["2011", 660],
      ["2012", 1030]
    ];
    const options = {
      title: "Company Performance",
      curveType: "function",
      legend: { position: "bottom" },
      enableInteractivity: true,
      hAxis: { textStyle: { color: "blue", underline: true } }
    };
    class App extends React.Component {
      render() {
        return (
          <div className="App">
            <Chart
              chartType="ColumnChart"
              width="80%"
              height="400px"
              data={data}
              options={options}
              legendToggle
              chartEvents={[
                {
                  eventName: "ready",
                  callback: ({ chartWrapper, google }) => {
                    let svg = document.querySelector("svg");
                    let styles = 'text[text-anchor="middle"] { cursor: pointer; }';
                    var css = document.createElement("style");
                    if (css.styleSheet) {
                      css.styleSheet.cssText = styles;
                    } else {
                      css.appendChild(document.createTextNode(styles));
                    }
                    svg.appendChild(css);
    
                    const chart = chartWrapper.getChart();
                    var handler = function(e) {
                      console.log(e);
                      var parts = e.targetID.split("#");
                      if (parts.indexOf("label") >= 0) {
                        let idx = parts[parts.indexOf("label") + 1];
                        idx = parseInt(idx);
                        alert(data[idx + 1][0]);
                      }
                    };
                    google.visualization.events.addListener(
                      chartWrapper.getChart(),
                      "click",
                      handler
                    );
                  }
                }
              ]}
            />
          </div>
        );
      }
    }
    
    const rootElement = document.getElementById("root");
    ReactDOM.render(<App />, rootElement);
    
    

    工作沙盒:https://codesandbox.io/s/react-google-charts-columnchart-with-click-handler-k6fv2

    【讨论】:

    • 嘿,这很酷,但是如何为这些标签添加样式以使其看起来像链接,如何添加外部样式?
    • 在选项中添加`hAxis: {textStyle: {color:"blue", "underline":true}}`。查看更新的沙盒:codesandbox.io/s/…
    • 是否有任何样式文档,就像您为下划线所做的那样,我必须添加几种样式,例如 cursor:'pointer' 等等,您能帮我处理任何文档
    • 经过大量搜索,我终于可以找到文档:developers.google.com/docs/api/reference/rest/v1/… 但是,这没有您正在寻找的光标之类的选项。
    • 那么我怎样才能改变光标请帮我一次
    【解决方案2】:

    目前在 react-google-charts 中可点击的工具提示似乎是有限的。

    但是,为了为 react 配置可点击的工具提示,您需要像这样设置工具提示选项:

    tooltip: { isHtml: true, trigger: "selection" }

    (以便在您单击时保持显示)并且您已经设置了一个selectchartEvent 事件,如下所示:

      chartEvents={[
            {
              eventName: "select",
              callback: ({ chartWrapper, google }) => {
                var selection = chartWrapper.getChart().setAction({
                  id: "alertAction",
                  text: "Click Me!",
                  action: function() {
                    alert("Stay away Corona Virus!!");
                  }
                });
                console.warn(selection);
              }
            }
          ]}
    

    See my codesandbox here.

    And here's some google documentation on setAction() function,就像我在示例中的编码方式一样。此外,还有与同一文档页面上的图表工具提示相关的 getAction()removeAction() 函数。

    希望这对你有所帮助。

    【讨论】:

    • 嘿,我发现了这种用于点击图表列的示例,我想要的是在标签上添加点击事件,即 jan、feb 等以及在您的代码 2011、2012 中年我想在标签上添加点击事件。上面的代码对我没有帮助
    【解决方案3】:

    为了使标签可点击,在charts下作为props传递的chartEvents中

     <Chart 
      chartEvents = {**chartEvents**}
      rootProps={{ 'data-testid': '3' }}  
    />
    

    使用可以将其作为 chartEvents 传递

        const chartEvents = [
      {
        eventName: "select",
        callback({ chartWrapper }) {
          console.log("Selected ", chartWrapper.getChart().Ufa.Ei);
        }
      }
    ];
    

    这将返回您单击的图表的标签名称

    working example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 2020-10-07
      • 1970-01-01
      • 2016-07-09
      • 2019-09-26
      • 1970-01-01
      相关资源
      最近更新 更多