跳到正文

第一张图表

在 Vue、React 或纯 HTML 中,用你自己的数据渲染一张 K 线图,无需任何行情后端。

想最快看到一张图表,就把数据直接交给它。本页通过 customData 传入几百根 K 线,图表直接绘制,不涉及任何行情服务。

准备 K 线数据

图表读取的是 KLineData:一个毫秒级 timestamp,加上 open、high、low、close,volume 可选。任何符合这个结构的数组都可以。下面的辅助函数会生成一段平滑的序列,方便上手。

bars.ts
import type { KLineData } from '@363045841yyt/klinechart-core'

export function makeBars(count: number): KLineData[] {
  const day = 86_400_000
  const start = Date.UTC(2026, 0, 1)
  let close = 100
  return Array.from({ length: count }, (_, i) => {
    const open = close
    close = open + Math.sin(i / 8) * 1.5 + Math.cos(i / 3) * 0.6
    return {
      timestamp: start + i * day,
      open,
      high: Math.max(open, close) + 0.8,
      low: Math.min(open, close) - 0.8,
      close,
      volume: 10_000 + Math.round(Math.abs(Math.sin(i / 5)) * 8_000),
    }
  })
}

customData 在 K 线之外再补充一点上下文。market 和 data 必填,symbol 和 period 用于标注这条序列。

const customData = {
  market: 'CN',
  symbol: 'DEMO',
  period: 'daily',
  data: makeBars(240),
}

渲染

图表会撑满父容器。请给父容器,或 <kline-chart> 元素本身,设置一个明确的高度。

App.vue
<script setup lang="ts">
import { KlineChart, type CustomDataSource } from '@363045841yyt/klinechart'
import { makeBars } from './bars'

const customData: CustomDataSource = {
  market: 'CN',
  symbol: 'DEMO',
  period: 'daily',
  data: makeBars(240),
}
</script>

<template>
  <div class="chart-host">
    <KlineChart :custom-data="customData" />
  </div>
</template>

<style>
.chart-host {
  height: 480px;
}
</style>

别忘了在入口文件中引入一次 @363045841yyt/klinechart/style.css。

KLineChartWC 会把 zoomLevels 这类布局属性转成 attribute 传下去,但 customData 这样的对象不会转发。需要通过 ref 拿到元素,把它设为 JavaScript 属性。

Chart.tsx
'use client'

import { useEffect, useRef } from 'react'
import { KLineChartWC, type KLineChartWCHandle } from '@363045841yyt/klinechart-react'
import type { CustomDataSource } from '@363045841yyt/klinechart-core'
import { makeBars } from './bars'

const customData: CustomDataSource = {
  market: 'CN',
  symbol: 'DEMO',
  period: 'daily',
  data: makeBars(240),
}

type ChartElement = KLineChartWCHandle & { customData?: CustomDataSource }

export function Chart() {
  const ref = useRef<KLineChartWCHandle>(null)

  useEffect(() => {
    const el = ref.current as ChartElement | null
    if (!el) return
    // 封装组件会在客户端延迟注册 <kline-chart>。
    void customElements.whenDefined('kline-chart').then(() => {
      el.customData = customData 
    })
  }, [])

  return <KLineChartWC ref={ref} style={{ display: 'block', height: 480 }} />
}

'use client' 用于支持服务端组件的框架,例如 Next.js App Router。

index.html
<kline-chart id="chart" style="display: block; height: 480px"></kline-chart>

<script type="module">
  import '@363045841yyt/klinechart/web-component'

  const day = 86_400_000
  const start = Date.UTC(2026, 0, 1)
  let close = 100
  const data = Array.from({ length: 240 }, (_, i) => {
    const open = close
    close = open + Math.sin(i / 8) * 1.5
    return {
      timestamp: start + i * day,
      open,
      high: Math.max(open, close) + 0.8,
      low: Math.min(open, close) - 0.8,
      close,
    }
  })

  const el = document.getElementById('chart')
  el.customData = { market: 'CN', symbol: 'DEMO', period: 'daily', data } 
</script>

对象和数组要以属性(property)的形式设置。只有 zoom-levels、timezone 这类基本类型的属性可以写成 attribute。

你会看到 240 根日 K 线,顶部是工具栏,左侧是画线工具。滚轮缩放,拖动平移。

更新数据

customData 是响应式的。换成一个新对象,图表就会按新数据重绘。内联数据不分页:图表不会去请求你没有提供的更早的 K 线。

如果想往现有序列里追加或推送实时 K 线,而不是整体替换,可以从 controllerReady 事件拿到 ChartController,调用 updateBars 或 appendData。详见嵌入应用。

接入数据源

内联数据适合初次体验,也适合你手里已有的数据。需要搜索、分页加载和实时更新时,请注册一个行情 Provider,并改用 symbols 属性。行情数据与 BYOK 介绍了整套模型,HTTP API 和实时 K 线两页说明了连接器需要实现的协议。

下一步

本页内容