# MatchScheduleArenaRank 竞技场排行榜

竞技场比赛排行榜组件,用于展示前三名玩家的颁奖台布局,支持自定义玩家信息和交互操作。

# 引入

import PressMatchScheduleArenaRank from 'press-next/press-match-schedule-arena-rank/press-match-schedule-arena-rank.vue';

# 代码演示

# 基础用法

展示前三名玩家的颁奖台布局,自动按照第二名-第一名-第三名的顺序排列。

<template>
  <PressMatchScheduleArenaRank
    :players="players"
    @view-ranking-click="handleViewRankingClick"
  />
</template>

<script setup lang="ts">
import PressMatchScheduleArenaRank from 'press-next/press-match-schedule-arena-rank/press-match-schedule-arena-rank.vue';

interface Player {
  id?: string | number;
  rank: number;
  nickname: string;
  avatar: string;
  killCount: number;
}

const players: Player[] = [
  {
    id: 1,
    rank: 2,
    nickname: '银牌选手',
    avatar: 'https://avatars.githubusercontent.com/u/1680273?v=4',
    killCount: 12,
  },
  {
    id: 2,
    rank: 1,
    nickname: '金牌选手',
    avatar: 'https://avatars.githubusercontent.com/u/499550?v=4',
    killCount: 15,
  },
  {
    id: 3,
    rank: 3,
    nickname: '铜牌选手',
    avatar: 'https://avatars.githubusercontent.com/u/9919?v=4',
    killCount: 10,
  },
];

const handleViewRankingClick = () => {
  console.log('查看完整排行榜');
};
</script>

# 自定义底部按钮

通过插槽自定义底部按钮内容。

<template>
  <PressMatchScheduleArenaRank :players="players">
    <template #foot-btn>
      <PressButton
        type="primary"
        block
        @click="handleCustomAction"
      >
        自定义操作
      </PressButton>
    </template>
  </PressMatchScheduleArenaRank>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import PressMatchScheduleArenaRank from 'press-next/press-match-schedule-arena-rank/press-match-schedule-arena-rank.vue';
import { PressButton } from 'press-ui';

const players = ref([
  { id: 1, rank: 1, nickname: '金牌选手', avatar: 'https://avatars.githubusercontent.com/u/499550?v=4', killCount: 15 },
  { id: 2, rank: 2, nickname: '银牌选手', avatar: 'https://avatars.githubusercontent.com/u/1680273?v=4', killCount: 12 },
  { id: 3, rank: 3, nickname: '铜牌选手', avatar: 'https://avatars.githubusercontent.com/u/9919?v=4', killCount: 10 },
]);

const handleCustomAction = () => {
  console.log('自定义操作');
};
</script>

# 动态数据更新

支持动态更新玩家排名数据。

<template>
  <div>
    <PressMatchScheduleArenaRank :players="currentPlayers" />
    <PressButton
      type="primary"
      block
      style="margin-top: 16px;"
      @click="updateRanking"
    >
      更新排名
    </PressButton>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import PressMatchScheduleArenaRank from 'press-next/press-match-schedule-arena-rank/press-match-schedule-arena-rank.vue';
import { PressButton } from 'press-ui';

const currentPlayers = ref([
  { id: 1, rank: 1, nickname: '玩家A', avatar: 'https://avatars.githubusercontent.com/u/499550?v=4', killCount: 20 },
  { id: 2, rank: 2, nickname: '玩家B', avatar: 'https://avatars.githubusercontent.com/u/1680273?v=4', killCount: 18 },
  { id: 3, rank: 3, nickname: '玩家C', avatar: 'https://avatars.githubusercontent.com/u/9919?v=4', killCount: 15 },
]);

const updateRanking = () => {
  // 模拟排名变化
  currentPlayers.value = [
    { id: 2, rank: 1, nickname: '玩家B', avatar: 'https://avatars.githubusercontent.com/u/1680273?v=4', killCount: 25 },
    { id: 1, rank: 2, nickname: '玩家A', avatar: 'https://avatars.githubusercontent.com/u/499550?v=4', killCount: 22 },
    { id: 3, rank: 3, nickname: '玩家C', avatar: 'https://avatars.githubusercontent.com/u/9919?v=4', killCount: 20 },
  ];
};
</script>

# API

# Props

参数 说明 类型 默认值
players 玩家列表数据 Player[] []

# Player 数据结构

属性 说明 类型 必填
id 玩家唯一标识 string | number
rank 玩家排名 number
nickname 玩家昵称 string
avatar 玩家头像URL string
killCount 击杀数量 number

# Events

事件名 说明 回调参数
view-ranking-click 点击查看榜单按钮时触发 -

# Slots

名称 说明
foot-btn 自定义底部按钮内容

# 主题定制

组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 ConfigProvider 组件。

# 样式变量

# 间距系统

名称 默认值 描述
--pmsar-list-mb $spacing-xl 列表下边距
--pmsar-list-gap $spacing-sm 列表项间距
--pmsar-stats-padding-lr $spacing-sm 统计区域左右内边距
--pmsar-container-padding-tb .4rem 容器上下内边距
--pmsar-container-padding-lr .28rem 容器左右内边距
--pmsar-badge-offset-y -.24rem 排名徽章底部偏移
--pmsar-nickname-first-mt .56rem 第一名昵称上边距
--pmsar-nickname-second-mt .4rem 第二名昵称上边距
--pmsar-nickname-third-mt .36rem 第三名昵称上边距
--pmsar-stats-mt $spacing-xs 统计区域上边距

# 尺寸系统

名称 默认值 描述
--pmsar-avatar-size 1rem 头像尺寸
--pmsar-item-first-height 3.2rem 第一名高度
--pmsar-item-second-height 2.76rem 第二名高度
--pmsar-item-third-height 2.56rem 第三名高度
--pmsar-badge-width-size .44rem 排名徽章宽度
--pmsar-badge-height-size .48rem 排名徽章高度
--pmsar-nickname-width 1.8rem 昵称最大宽度
--pmsar-stats-height .36rem 统计区域行高
--pmsar-stats-width 1.6rem 统计区域最大宽度

# 颜色系统

名称 默认值 描述
--pmsar-container-bg $color-surface-default 容器背景色
--pmsar-avatar-border-color $color-border-brand 头像边框色
--pmsar-badge-bg red 排名徽章背景色
--pmsar-nickname-text-color $color-text-primary 昵称文字色
--pmsar-stats-bg rgba(54, 111, 244, .3) 击杀统计背景色
--pmsar-stats-color $color-text-invert-light 击杀统计文字色
--pmsar-item-bg url(...) 排行项背景图
--pmsar-item-badge-bg1 url(...) 第一名徽章背景图
--pmsar-item-badge-bg2 url(...) 第二名徽章背景图
--pmsar-item-badge-bg3 url(...) 第三名徽章背景图

# 字体系统

名称 默认值 描述
--pmsar-nickname-font-size $font-size-md 昵称字体大小
--pmsar-stats-font-size $font-size-sm 统计字体大小
--pmsar-nickname-font-weight 500 昵称字体粗细

# 圆角系统

名称 默认值 描述
--pmsar-container-border-radius 0 容器圆角
--pmsar-avatar-border-radius 50% 头像圆角
--pmsar-stats-border-radius .28rem 统计区域圆角

# 其他

名称 默认值 描述
--pmsar-badge-text-indent -999em 隐藏徽章文字

# 常见问题

# 如何自定义排名徽章图片?

通过 CSS 变量可以自定义前三名的徽章背景图:

<template>
  <PressMatchScheduleArenaRank
    :players="players"
    custom-class="custom-badge"
  />
</template>

<style>
.custom-badge {
  --pmsar-item-badge-bg1: url('your-first-badge.png');
  --pmsar-item-badge-bg2: url('your-second-badge.png');
  --pmsar-item-badge-bg3: url('your-third-badge.png');
}
</style>

# 如何处理头像加载失败?

建议在数据层面提供默认头像:

const playersWithFallback = players.map(player => ({
  ...player,
  avatar: player.avatar || 'https://example.com/default-avatar.png',
}));

# 颁奖台的排列顺序是什么?

组件会自动按照颁奖台布局排序:第二名(左)- 第一名(中)- 第三名(右),无需手动调整数据顺序。

# 如何自定义不同排名的高度?

通过 CSS 变量可以分别设置前三名的高度:

.custom-height {
  --pmsar-item-first-height: 3.5rem;
  --pmsar-item-second-height: 3rem;
  --pmsar-item-third-height: 2.8rem;
}