Order Book
在订单簿中检查买卖档位、累计深度与价格选择。
适用场景
- 当界面需要以下行为时使用 Order Book:在订单簿中检查买卖档位、累计深度与价格选择。
安装
选择安装方式,用法示例将同步更新导入路径。
$ bunx --bun shadcn-vue@2.8.2 add https://orvui.efu.me/r/order-book.json https://orvui.efu.me/r/button.json
首次使用时,将安装的 src/components/orvui/styles.css 导入项目样式入口。
示例
预览
SOL / USD Simulated
| Price USD | Size SOL | Cumulative total SOL |
|---|---|---|
| 782 | 8.6K | |
| 1.2K | 7.8K | |
| 1.1K | 6.6K | |
| 2.2K | 5.5K | |
| 1.8K | 3.3K | |
| 278 | 1.5K | |
| 363 | 1.2K | |
| 574 | 858 | |
| 284 | 284 |
Reference price: 245.85Spread 0.30 · 0.122%
| Price USD | Size SOL | Cumulative total SOL |
|---|---|---|
| 194 | 194 | |
| 543 | 737 | |
| 314 | 1.1K | |
| 592 | 1.6K | |
| 715 | 2.4K | |
| 744 | 3.1K | |
| 789 | 3.9K | |
| 735 | 4.6K | |
| 1.1K | 5.7K |
Hover a level to see the cost of filling up to it
Bids 40.0%Visible depthAsks 60.0%
Click a price to use it, for example in an order ticket.
packages/vue/src/charts/order-book/demo.vue
<script setup lang="ts">
import { computed, onBeforeUnmount, onMounted, ref } from "vue";
import { Button } from "@/components/orvui/motion/button";
import {
OrderBook,
OrderBookHeader,
OrderBookSide,
OrderBookSpread,
OrderBookBalance,
OrderBookDepthSummary,
} from "@/components/orvui/charts/order-book";
const sizes = {
ask: [284, 574, 363, 278, 1800, 2200, 1100, 1200, 782],
bid: [194, 543, 314, 592, 715, 744, 789, 735, 1100],
};
const playing = ref(true),
selected = ref<number | null>(null),
tick = ref(0);
function levels(side: "ask" | "bid") {
const direction = side === "ask" ? 1 : -1;
return sizes[side].map((size, index) => {
const phase = (index + (direction === 1 ? 1 : 0)) % 3;
const updated = tick.value - ((tick.value + phase) % 3);
return {
price: Number((245.85 + direction * (index + 1) * 0.15).toFixed(2)),
size:
updated <= 0
? size
: Math.round(
size *
(1 + Math.sin(updated * 1.3 + index * 2.1 + direction) * 0.32),
),
};
});
}
const book = computed(() => ({ asks: levels("ask"), bids: levels("bid") }));
let timer: ReturnType<typeof setInterval> | undefined;
onMounted(() => {
timer = setInterval(() => {
if (playing.value && !document.hidden) tick.value++;
}, 950);
});
onBeforeUnmount(() => clearInterval(timer));
function step() {
playing.value = false;
tick.value++;
}
</script>
<template>
<div class="w-full max-w-[520px] space-y-3">
<div class="flex flex-wrap items-center justify-between gap-3 px-1">
<div class="text-sm font-medium">
SOL / USD
<span
class="ml-2 rounded border border-border px-1.5 py-0.5 text-[9px] uppercase text-muted-foreground"
>Simulated</span
>
</div>
<div class="flex gap-2">
<Button variant="ghost" size="sm" @click="playing = !playing">{{
playing ? "Pause" : "Resume"
}}</Button
><Button variant="ghost" size="sm" @click="step">Step</Button>
</div>
</div>
<OrderBook
:bids="book.bids"
:asks="book.asks"
base-symbol="SOL"
quote-symbol="USD"
label="Simulated SOL / USD order book"
@level-select="selected = $event.price"
><OrderBookHeader /><OrderBookSide
side="ask" /><OrderBookSpread /><OrderBookSide
side="bid" /><OrderBookDepthSummary /><OrderBookBalance
/></OrderBook>
<p aria-live="polite" class="px-1 text-xs text-muted-foreground">
{{
selected === null
? "Click a price to use it, for example in an order ticket."
: `Selected ${selected.toFixed(2)} USD`
}}
</p>
</div>
</template>
packages/vue/src/charts/order-book/src/OrderBook.vue
状态与事件
需要由表单、路由或父组件管理时,绑定下列状态并接收对应更新。v-model 是属性与 update 事件的简写;值的类型应与 API 一致。
| 组件 | Vue 绑定 | 更新事件 |
|---|---|---|
OrderBook | v-model:activeLevelnull | { side: "bid" | "ask"; price: number; } | update:activeLevel |
可选受控属性未传入时,按组件文档的默认行为工作;不要用固定的 false 或空值代替未传入。异步请求和持久化在应用中处理,再把结果传回组件。
API 参考
OrderBook
bidsreadonly OrderBookLevel[]—asksreadonly OrderBookLevel[]—levels?number9lastPrice?number—label?string"Order book"baseSymbol?string""quoteSymbol?string"USD"formatPrice?(value: number) => string((value: number) => priceFormat.format(value))formatSize?(value: number) => stringformatCompactactiveLevel?null | { side: "bid" | "ask"; price: number; }—defaultActiveLevel?null | { side: "bid" | "ask"; price: number; }nullclassName?string—事件
update:activeLevel—@update:activeLevelactiveLevelChange—@activeLevelChangelevelSelect—@levelSelect插槽
default() => VNodeChild#defaultOrderBookSide
side"bid" | "ask"—OrderBookDepthSummary
placeholder?string"Hover a level to see the cost of filling up to it"插槽
default—作用域参数: summary
#defaultOrderBookDepthRow
rowDepthLevel—side"bid" | "ask"—inRange?booleanfalsefractionnumber—entranceIndexnumber—无障碍
为交互控件提供明确的无障碍名称。保留文档中的键盘路径、可见焦点与减少动态效果状态;自定义插槽应继续保留所替代部件的语义。
常见问题
- 如何配置 Order Book?
- 通过 bids、asks、levels、lastPrice、label、baseSymbol、quoteSymbol、formatPrice、formatSize、activeLevel、defaultActiveLevel、className 配置 Order Book;API 表列出其类型与默认值。
- 如何连接到应用状态?
- 监听 update:activeLevel、activeLevelChange、levelSelect,将组件连接到应用状态。
- 可以在服务端渲染吗?
- 可以在 Vue SSR 应用中正常渲染。服务端与客户端的初始 props 应保持一致;浏览器测量与交互资源在挂载后启动。
更新于
来源与许可 ↗MIT · 0.1.1