xtraderClient/docs/components/TradeComponent.md
2026-02-28 23:08:48 +08:00

3.9 KiB
Raw Blame History

TradeComponent.vue

路径src/components/TradeComponent.vue

功能用途

交易核心组件,支持 Buy/Sell、Market/Limit、Merge/Split。根据 marketinitialOption 展示 Yes/No 或 Up/Down 价格,计算 Total、To win、You'll receive 等,并调用 pmOrderPlacepmMarketSplitpmMarketMerge

Props

属性 类型 说明
market object 市场信息,含 marketId、clobTokenIds、outcomes、outcomePrices 等
initialOption 'yes' | 'no' 初始选中的选项
embeddedInSheet boolean 是否嵌入底部弹窗(移动端)
positions TradePositionItem[] 当前市场持仓列表用于计算可合并份额Merge 功能)

TradePositionItem

interface TradePositionItem {
  id: string
  outcomeWord: 'Yes' | 'No'  // 持仓方向
  shares: string             // 份额展示文本,如 "5 shares"
  sharesNum?: number         // 份数数值(可选,优先使用)
}

可合并份额计算逻辑:取 Yes 和 No 持仓份数的最小值成对数量。例如Yes 持仓 10 份No 持仓 8 份,则可合并份额为 8。

核心能力

  • Buy/Sell Tab 切换
  • Market/Limit 类型、Merge/Split 菜单
  • Buy 模式 Amount 区:无论余额是否充足,均显示 Amount 标签、Balance、可编辑金额输入框v-text-field带 $ 前缀variant="outlined")、+$1/+$20/+$100/Max 快捷按钮(桌面端、嵌入弹窗、移动端弹窗一致)
    • 输入框支持直接输入金额(>= 0支持小数
    • 事件处理:onAmountInputonAmountKeydownonAmountPaste
  • 余额不足时 Buy 显示 Deposit 按钮
  • 25%/50%/Max 快捷份额
  • Sell 模式 UI 优化
    • Shares 标签与 Max shares 提示同行显示(max-shares-inline
    • 输入框独占一行(shares-input-wrapper
    • 25%/50%/Max 按钮独立一行(sell-shares-buttons
    • 整体布局更清晰:Shares Max: 2[输入框][25%][50%][Max]
  • 调用 market API 下单、Split、Merge
  • submitOrder size 统一乘 1_000_000:无论 Market Buyamount、Market Sell、Limit Buy、Limit Sellshares传入 pmOrderPlacesize 均先取原始值再 Math.round(rawSize * 1_000_000)
  • 合并/拆分成功后触发事件mergeSuccesssplitSuccess,父组件监听后可刷新持仓列表
  • 401 权限错误提示:通过 useAuthError().formatAuthError 统一处理,未登录显示「请先登录」,已登录显示「权限不足」

使用方式

<TradeComponent
  :market="tradeMarketPayload"
  :initial-option="tradeInitialOption"
  :positions="marketPositions"
  embedded-in-sheet
/>

positions 示例

const marketPositions = [
  { id: '1', outcomeWord: 'Yes', shares: '10 shares', sharesNum: 10 },
  { id: '2', outcomeWord: 'No', shares: '8 shares', sharesNum: 8 }
]
// 可合并份额 = min(10, 8) = 8

Events

事件名 说明
optionChange 选项切换yes/no
orderSuccess 下单成功
mergeSuccess 合并份额成功,父组件应监听并刷新持仓
splitSuccess 拆分份额成功,父组件应监听并刷新持仓
submit 提交订单前的回调,携带订单 payload

国际化

Merge/Split 弹窗文案均通过 trade.* 键国际化:

  • Merge 弹窗mergeDialogTitlemergeDialogDescmergeAvailableSharesmergeNoMarketmergeSubmitBtn;复用 trade.amounttrade.max
  • Split 弹窗splitDialogTitlesplitDialogDescsplitAmountLabelsplitNoMarketsplitSubmitBtn

mergeDialogDescsplitDialogDescmergeNoMarketsplitNoMarket 支持 {yesLabel}{noLabel} 插值。

扩展方式

  1. Limit 单:完善 Limit 模式下的价格输入与下单逻辑
  2. 订单确认:增加确认弹窗
  3. 滑点设置:增加滑点配置