# MatchBindRolePopup 绑定角色弹窗
# 介绍
绑定角色弹窗组件,用于用户绑定参赛角色时的手机号验证。组件包含用户信息展示、手机号输入、验证码输入、协议勾选、切换账号等功能,支持外部控制按钮状态和表单验证逻辑。
# 引入
import PressMatchBindRolePopup from 'press-next/press-match-bind-role-popup/press-match-bind-role-popup.vue';
# 代码演示
# 基础用法
<PressMatchBindRolePopup
:show="show"
:user-info="userInfo"
:title="title"
:button-text="buttonText"
:agreement-name="agreementName"
:send-code-disabled="sendCodeDisabled"
:confirm-button-disabled="confirmButtonDisabled"
@close="onClose"
@confirm="onConfirm"
@send-code="onSendCode"
@view-agreement="onViewAgreement"
@switch-account="onSwitchAccount"
@phone-change="onPhoneChange"
@verify-code-change="onVerifyCodeChange"
/>
export default {
data() {
return {
show: false,
userInfo: {
id: 'roleId123',
name: '角色昵称亲昵萌萌萌',
avatar: 'https://via.placeholder.com/60x60',
tagList: ['微信', 'VIP用户'],
},
title: '选择参赛角色',
buttonText: '确定',
agreementName: '用户协议',
sendCodeDisabled: false,
confirmButtonDisabled: false,
countdown: 0,
};
},
methods: {
onClose() {
this.show = false;
},
onConfirm(data) {
console.log('确认绑定:', data);
// data 包含: { phone: string, code: string, agreed: boolean }
this.show = false;
},
onSendCode(phoneNumber) {
console.log('发送验证码:', phoneNumber);
// 开始倒计时
this.startCountdown();
},
onViewAgreement() {
console.log('查看协议');
// 这里可以打开协议页面
},
onSwitchAccount() {
console.log('切换账号');
// 这里可以处理切换账号逻辑
},
onPhoneChange(phone) {
console.log('手机号变更:', phone);
// 可以在这里进行实时验证
this.updateButtonStates();
},
onVerifyCodeChange(code) {
console.log('验证码变更:', code);
// 可以在这里进行实时验证
this.updateButtonStates();
},
startCountdown() {
this.countdown = 60;
this.sendCodeDisabled = true;
const timer = setInterval(() => {
this.countdown--;
if (this.countdown <= 0) {
clearInterval(timer);
this.sendCodeDisabled = false;
}
}, 1000);
},
updateButtonStates() {
// 根据表单状态更新按钮状态
// 这里可以添加具体的验证逻辑
},
},
};
# 外部状态控制
组件支持外部控制按钮状态和表单值,提供更灵活的验证逻辑:
<PressMatchBindRolePopup
:show="show"
:user-info="userInfo"
:phone-value="phoneNumber"
:verify-code-value="verifyCode"
:agreed-value="agreed"
:send-code-disabled="sendCodeDisabled"
:confirm-button-disabled="confirmButtonDisabled"
:send-code-button-text="sendCodeButtonText"
@phone-change="onPhoneChange"
@verify-code-change="onVerifyCodeChange"
/>
export default {
data() {
return {
phoneNumber: '',
verifyCode: '',
agreed: false,
sendCodeDisabled: false,
confirmButtonDisabled: true,
sendCodeButtonText: '发送验证码',
};
},
methods: {
onPhoneChange(phone) {
this.phoneNumber = phone;
this.updateButtonStates();
},
onVerifyCodeChange(code) {
this.verifyCode = code;
this.updateButtonStates();
},
updateButtonStates() {
// 发送验证码按钮:手机号11位且不在倒计时中
this.sendCodeDisabled = this.phoneNumber.length !== 11 || this.countdown > 0;
// 确认按钮:手机号11位 + 验证码6位 + 已同意协议
this.confirmButtonDisabled = !(
this.phoneNumber.length === 11 &&
this.verifyCode.length === 6 &&
this.agreed
);
},
},
};
# API
# Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| show | 是否显示弹窗 | boolean | false |
| z-index | 弹窗层级 | number | 100 |
| custom-class | 自定义样式类 | string | '' |
| user-info | 用户角色信息 | RoleInfo | undefined |
| title | 弹窗标题 | string | '选择参赛角色' |
| is-pop-up-round | 弹窗是否圆角 | boolean | true |
| button-text | 确认按钮文案 | string | '确定' |
| show-switch-button | 是否显示切换账号按钮 | boolean | true |
| agreement-name | 协议名称 | string | '' |
| send-code-button-text | 验证码按钮文案 | string | '发送验证码' |
| send-code-disabled | 验证码按钮是否禁用 | boolean | false |
| confirm-button-disabled | 确认按钮是否禁用 | boolean | false |
| phone-value | 手机号输入框的值 | string | '' |
| verify-code-value | 验证码输入框的值 | string | '' |
| agreed-value | 协议勾选状态 | boolean | false |
# RoleInfo 数据结构
| 键名 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| id | 角色ID | string | - |
| name | 角色昵称 | string | - |
| avatar | 角色头像URL | string | - |
| tagList | 角色标签列表 | string[] | [] |
# Events
| 事件名 | 说明 | 回调参数 |
|---|---|---|
| close | 关闭弹窗时触发 | - |
| confirm | 确认绑定时触发 | data: { phone: string, code: string, agreed: boolean } |
| send-code | 发送验证码时触发 | phone: string |
| view-agreement | 查看协议时触发 | - |
| switch-account | 切换账号时触发 | - |
| phone-change | 手机号输入变更时触发 | phone: string |
| verify-code-change | 验证码输入变更时触发 | code: string |
# 组件内部状态
组件内部维护以下状态,可通过 Props 进行外部控制:
| 状态 | 说明 | 类型 | 对应 Props |
|---|---|---|---|
| phoneNumber | 手机号码 | string | phone-value |
| verifyCode | 验证码 | string | verify-code-value |
| agreed | 是否同意协议 | boolean | agreed-value |
# 插槽
| 插槽名 | 说明 | 插槽参数 |
|---|---|---|
| confirm-btn | 自定义确认按钮 | - |
# 功能特性
# 🔐 灵活的状态控制
- 支持外部控制按钮禁用状态
- 支持外部控制表单输入值
- 实时输入变更事件通知
- 可自定义验证逻辑
# 👤 丰富的用户信息展示
- 角色头像、昵称展示
- 可配置的角色标签列表
- 切换账号功能支持
- 响应式用户信息布局
# 💡 用户体验优化
- 协议未勾选时显示提示气泡
- 输入框支持清空功能
- 按钮禁用状态视觉反馈
- 响应式布局适配
# 🎨 高度可定制
- 支持自定义标题和按钮文案
- 支持自定义协议名称
- 完整的 SCSS 变量系统
- 语义化命名规范
- 主题色彩系统
# 📱 跨平台兼容
- 支持 H5、小程序等多端运行
- 微信小程序 WXSS 编译优化
- CSS 嵌套语法自动平铺处理
- 标签选择器兼容性适配
# 样式变量
组件提供了下列 SCSS 变量,可用于自定义样式。变量采用节点语义化命名规范,按功能区域分组。
# 变量命名规范
变量命名采用 $mbrp-{节点}-{属性} 的格式,其中:
mbrp是组件前缀 (match-bind-role-popup){节点}表示具体的 DOM 节点或功能区域{属性}表示具体的样式属性
# 间距系统
| 变量名 | 默认值 | 描述 |
|---|---|---|
$mbrp-header-area-padding-horizontal | var(--mbrp-header-area-padding-horizontal, .48rem) | 头部区域左右内边距 |
$mbrp-header-area-margin-bottom | var(--mbrp-header-area-margin-bottom, .48rem) | 头部区域下边距 |
$mbrp-user-info-area-padding | var(--mbrp-user-info-area-padding, .4rem) | 用户信息区域内边距 |
$mbrp-user-info-area-padding-vertical | var(--mbrp-user-info-area-padding-vertical, .32rem) | 用户信息区域垂直内边距 |
$mbrp-user-info-area-margin | var(--mbrp-user-info-area-margin, .2rem 0 .48rem) | 用户信息区域外边距 |
$mbrp-avatar-area-margin-right | var(--mbrp-avatar-area-margin-right, .32rem) | 头像右边距 |
$mbrp-user-details-area-min-height | var(--mbrp-user-details-area-min-height, .92rem) | 用户详情最小高度 |
$mbrp-user-details-area-flex | var(--mbrp-user-details-area-flex, 1) | 用户详情弹性宽度 |
$mbrp-username-area-margin-bottom | var(--mbrp-username-area-margin-bottom, .16rem) | 用户名下边距 |
$mbrp-user-tags-margin-top | var(--mbrp-user-tags-margin-top, .16rem) | 用户标签容器上间距 |
$mbrp-user-tags-area-gap | var(--mbrp-user-tags-area-gap, .1rem) | 用户标签容器间距 |
$mbrp-user-tag-area-padding | var(--mbrp-user-tag-area-padding, .02rem .1rem) | 单个用户标签内边距 |
$mbrp-form-item-area-margin-bottom | var(--mbrp-form-item-area-margin-bottom, .32rem) | 表单项下边距 |
$mbrp-form-item-area-padding-left | var(--mbrp-form-item-area-padding-left, .24rem) | 表单项左内边距 |
$mbrp-phone-input-area-margin-right | var(--mbrp-phone-input-area-margin-right, .24rem) | 手机号输入框右边距 |
$mbrp-agreement-area-margin-top | var(--mbrp-agreement-area-margin-top, 1.36rem) | 协议区域上边距 |
$mbrp-agreement-area-margin-bottom | var(--mbrp-agreement-area-margin-bottom, .4rem) | 协议区域下边距 |
$mbrp-agreement-area-gap | var(--mbrp-agreement-area-gap, .16rem) | 协议区域元素间距 |
$mbrp-agreement-tooltip-area-padding | var(--mbrp-agreement-tooltip-area-padding, 0 .16rem) | 协议提示框内边距 |
$mbrp-footer-area-margin-top | var(--mbrp-footer-area-margin-top, .48rem) | 底部区域上边距 |
# 尺寸系统
| 变量名 | 默认值 | 描述 |
|---|---|---|
$mbrp-avatar-area-size | var(--mbrp-avatar-area-size, 1.2rem) | 头像尺寸 |
$mbrp-user-tag-area-height | var(--mbrp-user-tag-area-height, .34rem) | 用户标签高度 |
$mbrp-phone-input-area-height | var(--mbrp-phone-input-area-height, .88rem) | 手机号输入框高度 |
$mbrp-verify-input-area-height | var(--mbrp-verify-input-area-height, .88rem) | 验证码输入框高度 |
$mbrp-send-code-btn-area-height | var(--mbrp-send-code-btn-area-height, .88rem) | 发送验证码按钮高度 |
$mbrp-send-code-btn-area-min-width | var(--mbrp-send-code-btn-area-min-width, 1.72rem) | 发送验证码按钮最小宽度 |
$mbrp-agreement-checkbox-area-size | var(--mbrp-agreement-checkbox-area-size, .32rem) | 协议复选框尺寸 |
$mbrp-agreement-checkbox-area-margin-top | var(--mbrp-agreement-checkbox-area-margin-top, .02rem) | 协议复选框上边距 |
$mbrp-agreement-tooltip-area-height | var(--mbrp-agreement-tooltip-area-height, .38rem) | 协议提示框高度 |
$mbrp-agreement-tooltip-area-margin-bottom | var(--mbrp-agreement-tooltip-area-margin-bottom, 1.12rem) | 协议提示框下边距 |
$mbrp-agreement-tooltip-arrow-area-width | var(--mbrp-agreement-tooltip-arrow-area-width, .16rem) | 协议提示框箭头宽度 |
$mbrp-agreement-tooltip-arrow-area-height | var(--mbrp-agreement-tooltip-arrow-area-height, .1rem) | 协议提示框箭头高度 |
$mbrp-confirm-btn-area-height | var(--mbrp-confirm-btn-area-height, .88rem) | 确认按钮高度 |
$mbrp-phone-input-area-width | var(--mbrp-phone-input-area-width, 6.4rem) | 手机号输入框宽度 |
# 颜色系统
| 变量名 | 默认值 | 描述 |
|---|---|---|
$mbrp-header-area-primary-color | var(--mbrp-header-area-primary-color, $color-text-brand) | 头部区域主色 |
$mbrp-header-area-bg-color | var(--mbrp-header-area-bg-color, $color-surface-default) | 头部区域背景颜色 |
$mbrp-header-area-text-color | var(--mbrp-header-area-text-color, $color-text-secondary) | 头部区域文本颜色 |
$mbrp-user-info-area-bg-color | var(--mbrp-user-info-area-bg-color, $color-surface-brand-light) | 用户信息区域背景颜色 |
$mbrp-username-area-text-color | var(--mbrp-username-area-text-color, $color-text-secondary) | 用户名文字颜色 |
$mbrp-user-tag-area-bg-color | var(--mbrp-user-tag-area-bg-color, $color-surface-brand-light2) | 用户标签背景颜色 |
$mbrp-user-tag-area-text-color | var(--mbrp-user-tag-area-text-color, $color-text-brand) | 用户标签文字颜色 |
$mbrp-form-area-disabled-color | var(--mbrp-form-area-disabled-color, $color-border-tertiary) | 表单禁用颜色 |
$mbrp-form-area-disabled-bg-color | var(--mbrp-form-area-disabled-bg-color, $color-surface-secondary) | 表单禁用背景颜色 |
$mbrp-form-area-disabled-text-color | var(--mbrp-form-area-disabled-text-color, $color-border-tertiary) | 表单禁用文字颜色 |
$mbrp-form-area-disabled-border-color | var(--mbrp-form-area-disabled-border-color, $color-surface-secondary) | 表单禁用边框颜色 |
$mbrp-confirm-btn-disabled-bg-color | var(--mbrp-confirm-btn-disabled-bg-color, $color-surface-secondary) | 确认按钮禁用背景颜色 |
$mbrp-confirm-btn-disabled-text-color | var(--mbrp-confirm-btn-disabled-text-color, $color-text-invert-default) | 确认按钮禁用文字颜色 |
$mbrp-confirm-btn-disabled-border-color | var(--mbrp-confirm-btn-disabled-border-color, $color-border-tertiary) | 确认按钮禁用边框颜色 |
$mbrp-agreement-area-text-color | var(--mbrp-agreement-area-text-color, $color-text-secondary) | 协议文本颜色 |
$mbrp-agreement-area-link-color | var(--mbrp-agreement-area-link-color, $color-text-brand) | 协议链接颜色 |
$mbrp-agreement-tooltip-area-bg-color | var(--mbrp-agreement-tooltip-area-bg-color, $color-surface-dark) | 协议提示框背景颜色 |
$mbrp-agreement-tooltip-area-text-color | var(--mbrp-agreement-tooltip-area-text-color, $color-text-invert-light) | 协议提示框文字颜色 |
# 字体系统
| 变量名 | 默认值 | 描述 |
|---|---|---|
$mbrp-header-area-text-align | var(--mbrp-header-area-text-align, center) | 头部区域文本对齐方式 |
$mbrp-header-title-area-font-size | var(--mbrp-header-title-area-font-size, .32rem) | 头部标题字体大小 |
$mbrp-header-title-area-font-weight | var(--mbrp-header-title-area-font-weight, 600) | 头部标题字重 |
$mbrp-header-title-area-line-height | var(--mbrp-header-title-area-line-height, .32rem) | 头部标题行高 |
$mbrp-header-title-area-margin | var(--mbrp-header-title-area-margin, 0) | 头部标题外边距 |
$mbrp-username-area-font-size | var(--mbrp-username-area-font-size, .28rem) | 用户名字体大小 |
$mbrp-username-area-font-weight | var(--mbrp-username-area-font-weight, 600) | 用户名字重 |
$mbrp-username-area-line-height | var(--mbrp-username-area-line-height, .42rem) | 用户名行高 |
$mbrp-user-tag-area-font-size | var(--mbrp-user-tag-area-font-size, .2rem) | 用户标签字体大小 |
$mbrp-user-tag-area-line-height | var(--mbrp-user-tag-area-line-height, .34rem) | 用户标签行高 |
$mbrp-send-code-btn-area-font-size | var(--mbrp-send-code-btn-area-font-size, .24rem) | 发送验证码按钮字体大小 |
$mbrp-agreement-area-font-size | var(--mbrp-agreement-area-font-size, .24rem) | 协议文本字体大小 |
$mbrp-agreement-area-line-height | var(--mbrp-agreement-area-line-height, .32rem) | 协议文本行高 |
$mbrp-agreement-tooltip-area-font-size | var(--mbrp-agreement-tooltip-area-font-size, .2rem) | 协议提示框字体大小 |
$mbrp-confirm-btn-area-font-size | var(--mbrp-confirm-btn-area-font-size, .28rem) | 确认按钮字体大小 |
# 圆角系统
| 变量名 | 默认值 | 描述 |
|---|---|---|
$mbrp-form-area-border-radius-md | var(--mbrp-form-area-border-radius-md, $border-radius-md) | 表单组件中等圆角 |
$mbrp-avatar-area-border-radius-circle | var(--mbrp-avatar-area-border-radius-circle, $border-radius-circle) | 头像圆形边框 |
$mbrp-button-area-border-radius-square | var(--mbrp-button-area-border-radius-square, $border-radius-none) | 按钮方形边框(无圆角) |
$mbrp-user-info-area-border-radius | var(--mbrp-user-info-area-border-radius, $border-radius-md $border-radius-md 0 0) | 用户信息区域圆角 |
$mbrp-agreement-tooltip-area-border-radius | var(--mbrp-agreement-tooltip-area-border-radius, $border-radius-xs) | 协议提示框圆角 |
# 边框系统
| 变量名 | 默认值 | 描述 |
|---|---|---|
$mbrp-form-input-area-border | var(--mbrp-form-input-area-border, .01rem solid $color-border-tertiary) | 表单输入框边框 |
$mbrp-form-input-area-border-width | var(--mbrp-form-input-area-border-width, .01rem) | 表单输入框边框宽度 |
$mbrp-send-code-btn-area-border-width | var(--mbrp-send-code-btn-area-border-width, .01rem 0 .01rem .01rem) | 发送验证码按钮边框宽度 |
$mbrp-confirm-btn-border-width | var(--mbrp-confirm-btn-border-width, .01rem) | 确认按钮边框宽度 |
$mbrp-confirm-btn-disabled-border-width | var(--mbrp-confirm-btn-disabled-border-width, .01rem) | 确认按钮禁用边框宽度 |
# 其他属性
| 变量名 | 默认值 | 描述 |
|---|---|---|
$mbrp-form-field-cell-vertical-padding | var(--mbrp-form-field-cell-vertical-padding, 0) | 表单字段单元格垂直内边距 |
$mbrp-form-field-cell-horizontal-padding | var(--mbrp-form-field-cell-horizontal-padding, 0) | 表单字段单元格水平内边距 |
$mbrp-form-field-cell-background-color | var(--mbrp-form-field-cell-background-color, transparent) | 表单字段单元格背景颜色 |
$mbrp-confirm-btn-area-disabled-opacity | var(--mbrp-confirm-btn-area-disabled-opacity, 1) | 确认按钮禁用透明度 |
$mbrp-send-code-btn-area-disabled-opacity | var(--mbrp-send-code-btn-area-disabled-opacity, 1) | 发送验证码按钮禁用透明度 |
$mbrp-confirm-btn-disabled-opacity | var(--mbrp-confirm-btn-disabled-opacity, 1) | 确认按钮禁用状态透明度 |
$mbrp-agreement-checkbox-area-unchecked-icon | var(--mbrp-agreement-checkbox-area-unchecked-icon, url(...)) | 协议复选框未选中图标 |
$mbrp-agreement-checkbox-area-checked-icon | var(--mbrp-agreement-checkbox-area-checked-icon, url(...)) | 协议复选框选中图标 |
$mbrp-agreement-checkbox-area-icon-position | var(--mbrp-agreement-checkbox-area-icon-position, center) | 协议复选框图标位置 |
$mbrp-agreement-checkbox-area-icon-size | var(--mbrp-agreement-checkbox-area-icon-size, 100% 100%) | 协议复选框图标尺寸 |
$mbrp-agreement-tooltip-arrow-area-clip-path | var(--mbrp-agreement-tooltip-arrow-area-clip-path, polygon(0% 0%, 100% 0%, 50% 100%)) | 协议提示框倒三角图形 |
$mbrp-agreement-tooltip-arrow-area-transform | var(--mbrp-agreement-tooltip-arrow-area-transform, translateX(-50%) translateY(100%)) | 协议提示框箭头位置 |
$mbrp-agreement-tooltip-arrow-area-position-left | var(--mbrp-agreement-tooltip-arrow-area-position-left, 50%) | 协议提示框箭头左定位 |
$mbrp-agreement-tooltip-arrow-area-position-bottom | var(--mbrp-agreement-tooltip-arrow-area-position-bottom, .02rem) | 协议提示框箭头底部定位 |
$mbrp-user-details-area-input-width | var(--mbrp-user-details-area-input-width, 100%) | 用户详情输入框宽度 |
$mbrp-input-icon-clear-font-family | var(--mbrp-input-icon-clear-font-family, 'press-icon') | 输入框清除按钮主题字体 |
$mbrp-input-icon-clear-font-color | var(--mbrp-input-icon-clear-font-color, #000) | 输入框清除按钮颜色 |
$mbrp-input-icon-clear-font-content | var(--mbrp-input-icon-clear-font-content, '\e68b') | 输入框清除按钮样式 |
$mbrp-input-icon-clear-font-size | var(--mbrp-input-icon-clear-font-size, .32rem) | 输入框清除按钮大小 |
$mbrp-input-field-control-font-size | var(--mbrp-input-field-control-font-size, .28rem) | 输入框控件字体大小 |
$mbrp-input-field-control-text-color | var(--mbrp-input-field-control-text-color, $color-text-primary) | 输入框控件文字颜色 |
$mbrp-input-field-control-font-weight | var(--mbrp-input-field-control-font-weight, normal) | 输入框控件字重 |
$mbrp-input-field-control-font-family | var(--mbrp-input-field-control-font-family, inherit) | 输入框控件字体 |