【问题标题】:react-vega - get data on click event (add event listener for click events)react-vega - 获取点击事件的数据(为点击事件添加事件监听器)
【发布时间】:2018-12-27 19:16:15
【问题描述】:

我使用“react-vega”和“react-rooltip”。 它工作正常。 它获取正确的数据并将其显示在工具提示上。 但是我怎样才能得到点击事件的数据呢? 我试图在规范中添加信号,但它们不起作用。

这是带有简单 vega 图表的演示: https://codesandbox.io/s/w2lq37v7ll

我需要修改什么来为点击事件添加一个事件监听器。

我想要的是在用户点击 vega 图表上的任何对象时获得与工具提示相同的数据。

【问题讨论】:

    标签: reactjs vega


    【解决方案1】:

    下面的代码将被点击的国家形状的数据记录到浏览器控制台。

       "signals": [
        {
          "name": "signal_tooltip",
          "on": [
            {"events": "shape:click", "update": "warn(datum)"}
          ]
        }
      ],
    

    要监听图表上所有标记项目(符号类型、代码中的形状类型)的事件,请将{"events": "shape:click", ... 更改为"events": "*:click", ...}

    注意: 您也可以使用View API addEventListener,它具有item 作为第二个参数。 item.datum 将包含点击项目的数据。

    view.addEventListener('click', function(event, item) {
      console.log(item.datum);
    });
    

    完整的代码参考(使用信号):

    {
      "$schema": "https://vega.github.io/schema/vega/v4.json",
      "autosize": "pad",
      "padding": 5,
      "width": 800,
      "height": 500,
      "style": "cell",
      "signals": [
        {
          "name": "signal_tooltip",
          "on": [
            {"events": "shape:click", "update": "warn(datum)"}
          ]
        }
      ],
      "data": [
        {
          "name": "world",
          "url": "https://vega.github.io/editor/data/world-110m.json",
          "format": {
            "type": "topojson",
            "feature": "countries"
          }
        },
        {
          "name": "source_0",
          "values": [
            {
              "lon": -63.616672,
              "lat": -38.416097,
              "some_data01": 1000,
              "some_data02": 200,
              "code": "AR",
              "country": "Argentina"
            },
            {
              "lon": 133.775136,
              "lat": -25.274398,
              "some_data01": 1000,
              "some_data02": 200,
              "code": "AU",
              "country": "Australia"
            },
            {
              "lon": -95.712891,
              "lat": 37.09024,
              "some_data01": 1000,
              "some_data02": 200,
              "code": "US",
              "country": "UnitedStates"
            },
            {
              "lon": 78.96288,
              "lat": 20.593684,
              "some_data01": 1000,
              "some_data02": 200,
              "code": "IN",
              "country": "India"
            },
            {
              "lon": -106.346771,
              "lat": 56.130366,
              "some_data01": 50000,
              "some_data02": 2000,
              "code": "CA",
              "country": "Canada"
            },
            {
              "lon": 138.252924,
              "lat": 36.204824,
              "some_data01": 60000,
              "some_data02": 1000,
              "code": "JP",
              "country": "Japan"
            },
            {
              "lon": -3.435973,
              "lat": 55.378051,
              "some_data01": 60000,
              "some_data02": 1000,
              "code": "UK",
              "country": "United Kingdom"
            }
          ]
        },
        {
          "name": "data_1",
          "source": "source_0",
          "transform": [
            {
              "type": "geojson",
              "fields": ["lon", "lat"],
              "signal": "layer_1_layer_0_geojson_0"
            },
            {
              "type": "geopoint",
              "projection": "projection",
              "fields": ["lon", "lat"],
              "as": ["layer_1_layer_0_x", "layer_1_layer_0_y"]
            }
          ]
        },
        {
          "name": "data_2",
          "source": "source_0",
          "transform": [
            {
              "type": "geojson",
              "fields": ["lon", "lat"],
              "signal": "layer_1_layer_1_geojson_0"
            },
            {
              "type": "geopoint",
              "projection": "projection",
              "fields": ["lon", "lat"],
              "as": ["layer_1_layer_1_x", "layer_1_layer_1_y"]
            }
          ]
        }
      ],
      "projections": [
        {
          "name": "projection",
          "size": {
            "signal": "[width, height]"
          },
          "fit": {
            "signal": "[data('world'), layer_1_layer_0_geojson_0, layer_1_layer_1_geojson_0]"
          },
          "type": "mercator"
        }
      ],
      "marks": [
        {
          "name": "layer_0_marks",
          "type": "shape",
          "style": ["geoshape"],
          "from": {
            "data": "world"
          },
          "encode": {
            "update": {
              "fill": {
                "value": "lightgray"
              },
              "stroke": {
                "value": "white"
              }
            }
          },
          "transform": [
            {
              "type": "geoshape",
              "projection": "projection"
            }
          ]
        },
        {
          "name": "layer_1_layer_0_marks",
          "type": "symbol",
          "style": ["circle"],
          "from": {
            "data": "data_1"
          },
          "encode": {
            "update": {
              "opacity": {
                "value": 0.7
              },
              "fill": {
                "value": "orange"
              },
              "tooltip": {
                "signal": "{\"country\": ''+datum[\"country\"], \"some_data01\": format(datum[\"some_data01\"], \"\"), \"some_data02\": format(datum[\"some_data02\"], \"\")}"
              },
              "x": {
                "field": "layer_1_layer_0_x"
              },
              "y": {
                "field": "layer_1_layer_0_y"
              },
              "shape": {
                "value": "circle"
              }
            }
          }
        },
        {
          "name": "layer_1_layer_1_marks",
          "type": "text",
          "style": ["text"],
          "from": {
            "data": "data_2"
          },
          "encode": {
            "update": {
              "dy": {
                "value": -6
              },
              "fill": {
                "value": "black"
              },
              "tooltip": {
                "signal": "{\"country\": ''+datum[\"country\"], \"some_data01\": format(datum[\"some_data01\"], \"\"), \"some_data02\": format(datum[\"some_data02\"], \"\")}"
              },
              "x": {
                "field": "layer_1_layer_1_x"
              },
              "y": {
                "field": "layer_1_layer_1_y"
              },
              "text": {
                "signal": "''+datum[\"country\"]"
              },
              "align": {
                "value": "center"
              }
            }
          }
        }
      ],
      "config": {
        "axisY": {
          "minExtent": 30
        }
      }
    }
    
    

    【讨论】:

    • 我修改了规范,但看起来它仍然无法正常工作:codesandbox.io/s/m34mrnn379,我的意思是,它不会在控制台中打印任何内容。有什么想法吗?
    • 对,由于 logLevel 设置,它不会向控制台打印任何内容。 ` ` 添加 logLevel={2} 这是 vega.warn 级别。代码链接:codesandbox.io/s/pp1573nkp7
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多