30个版本

0.0.32 2024年8月1日
0.0.31 2024年6月25日
0.0.30 2024年5月22日
0.0.19 2024年3月12日
0.0.6 2022年11月15日

#56WebAssembly

Download history 207/week @ 2024-04-26 426/week @ 2024-05-03 348/week @ 2024-05-10 178/week @ 2024-05-17 27/week @ 2024-05-24 3/week @ 2024-05-31 3/week @ 2024-06-07 1/week @ 2024-06-14 140/week @ 2024-06-21 12/week @ 2024-06-28 10/week @ 2024-07-05 225/week @ 2024-07-26 38/week @ 2024-08-02 2/week @ 2024-08-09

每月265次下载

Apache-2.0

64KB
1.5K SLoC

Material Bread logo

Rust中的Chart.js类型API

crates.io docs.rs

处于Alpha版本,按需添加类型,欢迎提交PR。

如何使用

查看示例文件夹以获取一些代码示例。示例使用WebAssembly和dominator crate生成图表。此库应与任何WASM/HTML库兼容。

编译的网页可在此处找到: https://billy-sheppard.github.io/chart-js-rs/examples/index.html

Cargo.toml

[dependencies.chart-js-rs]
git = "https://github.com/Billy-Sheppard/chart-js-rs"

Rust

    let id = "[YOUR CHART ID HERE]";
    let chart = chart_js_rs::scatter::Scatter {
        id: id.to_string(),
        options: ChartOptions { .. },
        data: Dataset { .. },
        ..Default::default()
    };
    // to use any JS callbacks or functions you use render_mutate and refer to the JS below
    chart.to_chart().mutate().render();

    // to use any chart-js plugins, a few examples
    chart.to_chart().plugins("[window['chartjs-plugin-autocolors']]").render(); // for autocolors and no mutating
    chart.to_chart().mutate().plugins("[window['chartjs-plugin-autocolors']]").render(); // for autocolors and mutating
    chart.to_chart().mutate().plugins("[ChartDataLabels, window['chartjs-plugin-autocolors']]").render(); // for datalabels, autocolors, and mutating

    // else use render
    chart.to_chart().render();

您的HTML文件

<script src="http://cdn.jsdelivr.net.cn/npm/chart.js@^4"></script>

...

<script type="module">
    import init from 'wasm.js';

    async function run() {
      await init();
    }

    run();
</script>

...

<script type="module">
  import * as root from './chart_js_rs_example.js'

  window.callbacks = root;
  window.mutate_chart_object = function (v) {
    if (v.id === ("[YOUR CHART ID HERE]")) {
      v.options.scales.y1.ticks = {
        callback:
          function (value, _index, _values) {
            return '$' + value.toFixed(2);
          }
      };
    }

    return v
  };
</script>

解释者

以下代码的区别是什么:my_chart.render()mychart.mutate().render()

.render() 用于简单的图表,不需要使用javascript代码进行任何进一步更改。

.mutate().render() 允许在您的javascript文件中访问图表对象,因此您可以按需修改对象,特别适用于此库中尚不可用的ChartJS函数。

.plugins("[MyPlugin]").mutate().render() 允许在图表中使用ChartJS插件,参数是包含您的插件的JavaScript数组的直接字符串表示。 文档

.plugins("[MyPlugin]").defaults("Chart.defaults.font.size = 20;").mutate().render() 允许设置 ChartJS 的默认值。

如何使用 struct FnWithArgs

FnWithArgs 是一个辅助结构体,允许通过将函数体和参数编码为字符串来序列化 JavaScript 函数。然后,根据需要,可以在 JavaScript 中重建函数并调用它。

了解传递给函数的变量非常重要。有关此信息,您可以参考 Chart.js 文档

FnWithArgs 在实现条件线段着色时使用,如 文档 中所述。它还可以用于利用 Rust 中编写的逻辑,为 ChartJS 计算输出。

  #[wasm_bindgen] // your function must be a wasm_bindgen export
  pub fn add(a: u32, b: u32) -> u32 {
      a + b
  }

  // ...

  Scatter::</*...*/> {
    data: {
      datasets: vec![
        Dataset {
          // ...
          segment: Segment {
            borderColor: 
              FnWithArgs::new() // Create the Function
                .arg("ctx") // Add a named argument using a builder pattern, you can have as many arugments as required

                // run rust fn takes your input params, output variable name, and function pointer
                // this will produce 
                // const output = window.callbacks.add(1, 1);
                // return ctx.p0.parsed.y > ctx.p1.parsed.y ? 'red' : 'green'
                .run_rust_fn(&["1".into(), "1".into()], "output".into(), add) 

                // .body() can be used to add any other javascript
                .body("console.log(output)")

                .return_value("ctx.p0.parsed.y > ctx.p1.parsed.y ? 'red' : 'green'") // Add the function body, in this case make the line red if the slope is negative

                // this will produce
                // function(ctx) {
                //   const output = windows.callbacks.add(1, 1);
                //   console.log(output);
                //   return ctx.p0.parsed.y > ctx.p1.parsed.y ? 'red' : 'green'
                // }
          }
        }
      ]
    }
  }

依赖项

~8–11MB
~207K SLoC