【问题标题】:Using Vega inside web components在 Web 组件中使用 Vega
【发布时间】:2019-07-24 09:00:13
【问题描述】:

Vega 可作为 CDN 脚本使用,可以包含在 HTML 中并直接在 js 代码中使用。

但是,如果我们希望将其用于使用聚合物或 StencilJS 构建的通用 Web 组件,该如何进行。包括 CDN js 在那里不是一个好主意。

有没有办法将 vega 作为 npm 模块包含在此类项目中?

【问题讨论】:

    标签: web-component custom-component vega stenciljs


    【解决方案1】:

    看看这个小提琴它是一个使用 vega 的原生 webComponent:

    <script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
    <script src="https://cdn.jsdelivr.net/npm/vega-lite@3"></script>
    <script src="https://cdn.jsdelivr.net/npm/vega-embed@4"></script>
    <script type="module">
    	const barChart = {
      "$schema": "https://vega.github.io/schema/vega/v5.json",
      "width": 400,
      "height": 200,
      "padding": 5,
    
      "data": [
        {
          "name": "table",
          "values": [
            {"category": "A", "amount": 28},
            {"category": "B", "amount": 55},
            {"category": "C", "amount": 43},
            {"category": "D", "amount": 91},
            {"category": "E", "amount": 81},
            {"category": "F", "amount": 53},
            {"category": "G", "amount": 19},
            {"category": "H", "amount": 87}
          ]
        }
      ],
    
      "signals": [
        {
          "name": "tooltip",
          "value": {},
          "on": [
            {"events": "rect:mouseover", "update": "datum"},
            {"events": "rect:mouseout",  "update": "{}"}
          ]
        }
      ],
    
      "scales": [
        {
          "name": "xscale",
          "type": "band",
          "domain": {"data": "table", "field": "category"},
          "range": "width",
          "padding": 0.05,
          "round": true
        },
        {
          "name": "yscale",
          "domain": {"data": "table", "field": "amount"},
          "nice": true,
          "range": "height"
        }
      ],
    
      "axes": [
        { "orient": "bottom", "scale": "xscale" },
        { "orient": "left", "scale": "yscale" }
      ],
    
      "marks": [
        {
          "type": "rect",
          "from": {"data":"table"},
          "encode": {
            "enter": {
              "x": {"scale": "xscale", "field": "category"},
              "width": {"scale": "xscale", "band": 1},
              "y": {"scale": "yscale", "field": "amount"},
              "y2": {"scale": "yscale", "value": 0}
            },
            "update": {
              "fill": {"value": "steelblue"}
            },
            "hover": {
              "fill": {"value": "red"}
            }
          }
        },
        {
          "type": "text",
          "encode": {
            "enter": {
              "align": {"value": "center"},
              "baseline": {"value": "bottom"},
              "fill": {"value": "#333"}
            },
            "update": {
              "x": {"scale": "xscale", "signal": "tooltip.category", "band": 0.5},
              "y": {"scale": "yscale", "signal": "tooltip.amount", "offset": -2},
              "text": {"signal": "tooltip.amount"},
              "fillOpacity": [
                {"test": "datum === tooltip", "value": 0},
                {"value": 1}
              ]
            }
          }
        }
      ]
    }
      class VegaElement extends HTMLElement { 
      	constructor() { 
        	super() 
          this.innerHTML = "<div id='view'></div>"
        } 
        connectedCallback() { 
        	vegaEmbed( '#view', barChart ); } 
          
      }
      customElements.define('vega-element', VegaElement);
    </script>
    <vega-element></vega-element>

    【讨论】:

    • 你是对的,但我不想包含脚本,但希望将 vega 作为依赖项与我使用 StencilJS 创建的 Web 组件库捆绑在一起。
    猜你喜欢
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2016-12-05
    相关资源
    最近更新 更多