消息转发页面
消息转发页面用于从聊天页面选择一个目标会话,并将当前选中的消息转发到该会话。当前源码实现的是单条消息转发,且不会在页面路由中传递消息内容,而是通过 messageStore 暂存选中的消息。
效果预览
配置页面路由
页面入口为 RCUIKit/pages/chat/forward-message.vue。在应用的 pages.json 中注册以下路由:
JSON
{
"path": "RCUIKit/pages/chat/forward-message",
"style": {
"navigationStyle": "custom"
}
}
Demo 源码还通过条件编译为抖音小程序使用原生导航栏,标题为“转发”;其他平台由页面内的 nav-bar.vue 展示“选择一个聊天”。如需保持相同的平台适配,请沿用 Demo pages.json 中的条件编译配置。
页面触发流程
消息转发的完整调用链如下:
message/message-item-common.vue在发送中或发送失败以外的消息长按菜单中显示“转发”。- 用户选择“转发”后,组件调用
messageStore.setSelectedMessages([message])暂存当前消息。 - 组件通过
uni.navigateTo打开/RCUIKit/pages/chat/forward-message。 - 页面挂载时调用
messageStore.getSelectedMessages()读取消息,并从conversationStore.conversations复制目标会话列表;系统会话会被过滤。 - 用户点击目标会话后,页面调用
messageStore.forwardMessage(conversation.key, selectedMessages[0])完成转发,然后返回聊天页面。
当前页面每次显示 15 个会话,滚动到底部后继续从内存会话列表中加载。当前实现点击会话后直接发送;源码中保留了确认弹层结构,但入口未启用。
Store 和 API 依赖
| 依赖 | 用途 |
|---|---|
conversationStore.conversations | 提供可选择的目标会话,页面排除 ConversationType.SYSTEM |
messageStore.setSelectedMessages() | 跳转前暂存待转发消息 |
messageStore.getSelectedMessages() | 转发页面读取待转发消息的副本 |
messageStore.forwardMessage() | 将目标会话 key 解码后,把消息加入消息发送队列 |
ErrorCode.SUCCESS | 判断转发请求是否成功 |
forwardMessage() 位于 packages/kit-store/store/RCKitMessageStore.ts,内部复用消息发送队列发送原消息。页面当前只取 selectedMessages[0],如需支持多条逐条转发或合并转发,需要同时扩展页面交互和 Store 层发送逻辑。
修改页面
| 修改目标 | 源码位置 |
|---|---|
| 页面标题、会话列表、分页数量、点击后的发送与提示逻辑 | RCUIKit/pages/chat/forward-message.vue |
| 目标会话头像和名称布局 | RCUIKit/pages/chat/message/select-member-item.vue |
| 消息长按菜单中的“转发”入口和跳转逻辑 | RCUIKit/pages/chat/message/message-item-common.vue |
| 转发消息的暂存与发送行为 | packages/kit-store/store/RCKitMessageStore.ts |
| 导航栏、图标、弹层基础样式 | RCUIKit/components/nav-bar.vue、rc-icon.vue、uni-components/uni-popup/ |
| 页面颜色和字号 | RCUIKit/styles/_variables.scss |
注意
转发页面依赖 messageStore 中的内存状态。请通过消息长按菜单进入页面,不要直接打开路由;如果没有先调用 setSelectedMessages(),页面将没有可转发的消息。替换 RCUIKit 源码目录进行版本升级时,也会覆盖以上 UI 修改,请提前保留差异。