@tanzhenxing/zx-popup-message
Version:
一个功能丰富的消息提示组件,基于 `zx-popup` 组件构建,支持多种消息类型和自定义配置。
491 lines (403 loc) • 10.9 kB
Markdown
# zx-popup-message 消息提示
一个功能丰富的消息提示组件,基于 `zx-popup` 组件构建,支持多种消息类型和自定义配置。
## 特性
- 🎨 **多种消息类型**:支持成功、警告、错误、信息四种主题
- 🎯 **灵活配置**:可自定义图标、持续时间、关闭按钮等
- 📱 **跨平台兼容**:支持 H5、小程序、App 平台
- 🎭 **主题丰富**:内置多种消息主题样式
- 🔧 **事件完整**:提供完整的生命周期事件
- 🛡️ **类型安全**:完整的 TypeScript 类型定义
- 🎪 **动画流畅**:基于 zx-popup 的流畅动画效果
- 🌙 **深色模式**:支持深色模式适配
## 基本用法
### 基础消息
```vue
<template>
<view>
<zx-button @click="showMessage = true">显示消息</zx-button>
<zx-popup-message
v-model:show="showMessage"
type="success"
message="操作成功!"
/>
</view>
</template>
<script setup>
import { ref } from 'vue';
const showMessage = ref(false);
</script>
```
### 不同类型的消息
```vue
<template>
<view>
<zx-button @click="showSuccess">成功消息</zx-button>
<zx-button @click="showWarning">警告消息</zx-button>
<zx-button @click="showError">错误消息</zx-button>
<zx-button @click="showInfo">信息消息</zx-button>
<zx-popup-message
v-model:show="showMsg"
:type="msgType"
:message="msgText"
/>
</view>
</template>
<script setup>
import { ref } from 'vue';
const showMsg = ref(false);
const msgType = ref('info');
const msgText = ref('');
const showSuccess = () => {
msgType.value = 'success';
msgText.value = '操作成功!';
showMsg.value = true;
};
const showWarning = () => {
msgType.value = 'warning';
msgText.value = '请注意相关风险!';
showMsg.value = true;
};
const showError = () => {
msgType.value = 'error';
msgText.value = '操作失败,请重试!';
showMsg.value = true;
};
const showInfo = () => {
msgType.value = 'info';
msgText.value = '这是一条信息提示';
showMsg.value = true;
};
</script>
```
### 自定义图标
```vue
<template>
<zx-popup-message
v-model:show="showMessage"
type="info"
message="使用自定义图标"
icon="star-fill"
:icon-size="20"
/>
</template>
```
### 不显示图标
```vue
<template>
<zx-popup-message
v-model:show="showMessage"
type="info"
message="这条消息不显示图标"
:show-icon="false"
/>
</template>
```
### 显示关闭按钮
```vue
<template>
<zx-popup-message
v-model:show="showMessage"
type="warning"
message="这条消息可以手动关闭"
closable
:duration="0"
/>
</template>
```
### 自定义持续时间
```vue
<template>
<view>
<!-- 1秒后自动关闭 -->
<zx-popup-message
v-model:show="showMessage1"
message="1秒后关闭"
:duration="1000"
/>
<!-- 不自动关闭 -->
<zx-popup-message
v-model:show="showMessage2"
message="不会自动关闭"
:duration="0"
closable
/>
</view>
</template>
```
### 显示遮罩
```vue
<template>
<zx-popup-message
v-model:show="showMessage"
type="error"
message="重要消息,显示遮罩"
mask-show
closable
:duration="0"
/>
</template>
```
### 拦截关闭操作
```vue
<template>
<zx-popup-message
v-model:show="showMessage"
type="warning"
message="关闭前会弹出确认"
:before-close="beforeClose"
closable
:duration="0"
/>
</template>
<script setup>
const beforeClose = () => {
return new Promise((resolve) => {
uni.showModal({
title: '提示',
content: '确定要关闭这条消息吗?',
success: (res) => {
resolve(res.confirm);
}
});
});
};
</script>
```
### 方法调用
```vue
<template>
<view>
<zx-button @click="openMessage">打开消息</zx-button>
<zx-button @click="closeMessage">关闭消息</zx-button>
<zx-popup-message
ref="messageRef"
type="success"
message="通过方法调用"
:duration="0"
/>
</view>
</template>
<script setup>
import { ref } from 'vue';
const messageRef = ref();
const openMessage = () => {
messageRef.value?.open();
};
const closeMessage = () => {
messageRef.value?.close();
};
</script>
```
### 自定义内容
```vue
<template>
<zx-popup-message
v-model:show="showMessage"
type="info"
:duration="0"
closable
>
<view class="custom-content">
<view class="custom-title">自定义消息内容</view>
<view class="custom-desc">这是一个使用插槽的自定义消息</view>
<view class="custom-actions">
<zx-button size="mini" type="primary" @click="handleAction">确定</zx-button>
<zx-button size="mini" @click="showMessage = false">取消</zx-button>
</view>
</view>
</zx-popup-message>
</template>
<style>
.custom-content {
padding: 4px 0;
}
.custom-title {
font-size: 16px;
font-weight: 600;
margin-bottom: 8px;
}
.custom-desc {
font-size: 14px;
color: #666;
margin-bottom: 12px;
}
.custom-actions {
display: flex;
gap: 8px;
justify-content: flex-end;
}
</style>
```
## API
### Props
| 参数 | 说明 | 类型 | 默认值 |
|------|------|------|--------|
| show | 是否显示消息 | `boolean` | `false` |
| type | 消息类型 | `'success' \| 'warning' \| 'error' \| 'info'` | `'info'` |
| message | 消息文本 | `string` | `''` |
| duration | 显示时长(毫秒),0 表示不自动关闭 | `number` | `3000` |
| show-icon | 是否显示图标 | `boolean` | `true` |
| icon | 自定义图标名称 | `string` | `''` |
| icon-size | 图标大小 | `number \| string` | `18` |
| closable | 是否显示关闭按钮 | `boolean` | `false` |
| mask-show | 是否显示遮罩 | `boolean` | `false` |
| mask-background-color | 遮罩背景色 | `string` | `'rgba(0, 0, 0, 0.1)'` |
| z-index | z-index 层级 | `number` | `1000` |
| animation | 是否开启动画 | `boolean` | `true` |
| before-close | 关闭前的回调函数 | `function` | `null` |
### Events
| 事件名 | 说明 | 回调参数 |
|--------|------|----------|
| update:show | 显示状态改变时触发 | `(show: boolean)` |
| open | 打开消息时触发 | `()` |
| opened | 打开消息且动画结束后触发 | `()` |
| close | 关闭消息时触发 | `()` |
| closed | 关闭消息且动画结束后触发 | `()` |
| click | 点击消息时触发 | `()` |
### Methods
| 方法名 | 说明 | 参数 |
|--------|------|------|
| open | 打开消息 | `()` |
| close | 关闭消息 | `()` |
### Slots
| 插槽名 | 说明 |
|--------|------|
| default | 自定义消息内容,会覆盖 message 属性 |
## 消息类型
### success - 成功消息
- **图标**:checkmark-circle-fill
- **颜色**:#67C23A(绿色)
- **背景**:#f0f9ff
- **边框**:#e1f5fe
- **使用场景**:操作成功、保存成功、提交成功等
### warning - 警告消息
- **图标**:warning-fill
- **颜色**:#E6A23C(橙色)
- **背景**:#fdf6ec
- **边框**:#faecd8
- **使用场景**:风险提示、注意事项、确认操作等
### error - 错误消息
- **图标**:close-circle-fill
- **颜色**:#F56C6C(红色)
- **背景**:#fef0f0
- **边框**:#fde2e2
- **使用场景**:操作失败、验证错误、系统错误等
### info - 信息消息
- **图标**:information-circle-fill
- **颜色**:#409EFF(蓝色)
- **背景**:#f4f4f5
- **边框**:#e9e9eb
- **使用场景**:一般信息、提示说明、状态更新等
## 主题定制
### 自定义消息样式
可以通过 CSS 变量自定义消息样式:
```scss
.zx-popup-message {
// 自定义成功消息样式
&--success {
background: linear-gradient(135deg, #f0f9ff 0%, #e1f5fe 100%);
border-color: #67C23A;
.zx-popup-message__message {
color: #67C23A;
font-weight: 600;
}
}
// 自定义圆角
border-radius: 12px;
// 自定义阴影
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
}
```
### 响应式设计
组件已内置响应式设计,在不同屏幕尺寸下会自动调整:
- **桌面端**(≥500px):居中显示,最大宽度 500px,最小宽度 300px
- **移动端**(<500px):左右边距 8px,自适应宽度
### 深色模式
组件支持深色模式,会根据系统设置自动切换:
```scss
@media (prefers-color-scheme: dark) {
.zx-popup-message {
&--success {
background-color: rgba(103, 194, 58, 0.1);
border-color: rgba(103, 194, 58, 0.2);
}
// ... 其他类型
}
}
```
## 注意事项
1. **依赖组件**:本组件依赖 `zx-popup` 和 `zx-icon` 组件,请确保已正确引入
2. **层级管理**:默认 z-index 为 1000,如有层级冲突可通过 z-index 属性调整
3. **性能优化**:频繁显示消息时建议复用组件实例,避免重复创建
4. **无障碍访问**:组件已考虑基本的无障碍访问,建议添加适当的 aria 标签
5. **平台差异**:在不同平台上动画效果可能略有差异,这是正常现象
6. **内存管理**:组件会自动清理定时器,无需手动处理
## 实际应用场景
### 表单验证
```vue
<script setup>
const validateForm = () => {
if (!form.username) {
showMessage('warning', '请输入用户名');
return false;
}
if (!form.password) {
showMessage('warning', '请输入密码');
return false;
}
return true;
};
const submitForm = async () => {
if (!validateForm()) return;
try {
await api.login(form);
showMessage('success', '登录成功!');
} catch (error) {
showMessage('error', '登录失败:' + error.message);
}
};
</script>
```
### 网络请求状态
```vue
<script setup>
const loadData = async () => {
try {
const data = await api.getData();
showMessage('success', '数据加载成功');
return data;
} catch (error) {
if (error.code === 'NETWORK_ERROR') {
showMessage('error', '网络连接失败,请检查网络设置');
} else {
showMessage('error', '数据加载失败,请稍后重试');
}
}
};
</script>
```
### 操作确认
```vue
<script setup>
const deleteItem = async (id) => {
try {
await api.delete(id);
showMessage('success', '删除成功');
refreshList();
} catch (error) {
showMessage('error', '删除失败:' + error.message);
}
};
</script>
```
## 更新日志
### v1.0.0
- 🎉 初始版本发布
- ✨ 支持四种消息类型(success、warning、error、info)
- ✨ 支持自定义图标和持续时间
- ✨ 支持关闭按钮和遮罩显示
- ✨ 支持拦截关闭操作
- ✨ 支持自定义内容插槽
- ✨ 完整的事件系统
- ✨ 响应式设计和深色模式支持
- ✨ 跨平台兼容性(H5、小程序、App)