下拉模糊搜索多选, 编辑,详情问题

看了最新代码,我理解你的目的了。下面我来详细讲解这个下拉多选和回显的完整逻辑:


📋 整体数据结构设计

字段 类型 存储格式 用途
oaId 数组(编辑)/字符串(提交) fdId1,fdId2 选中的 OA 流程 ID 列表
oaName 字符串 标题1$$链接1,标题2$$链接2 同时保存显示文本和跳转链接
oaProcessId 字符串 用户手动输入 OA 流程编码

🔧 编辑状态逻辑(isEdit = true)

1. 选择流程(getOaList)

javascript 复制代码
getOaList(e) {
  // e 是选中的 fdId 数组
  const choseItems = this.oaList.filter(item => e.includes(item.fdId))
  if (choseItems.length > 0) {
    this.$set(this.balic, 'oaName', 
      choseItems.map(item => `${item.fdSubject}$$${item.fdFormUrl}`).join(',')
    )
  }
}

作用 :多选下拉变化时,将选中的项拼接成 标题$$链接 格式存入 oaName

2. 远程搜索(getBpmList)

javascript 复制代码
getBpmList(keyword) {
  bpmList({ subject: keyword, ... }).then(res => {
    // 如果是编辑已有数据,需要把已选项合并到列表中
    if (this.balic.oaId && this.balic.oaId.length > 0) {
      const choseItems = this.oaList.filter(item => this.balic.oaId.includes(item.fdId))
      // 把已选项 unshift 到搜索结果前面,确保下拉框能显示已选
      choseItems.map(item => {
        if (!res.data.data.content.find(s => s.fdId === item.fdId)) {
          res.data.data.content.unshift(item)
        }
      })
    }
    this.oaList = res.data.data.content
  })
}

作用:远程搜索时保留已选项,否则下拉框会显示空白


👁️ 回显状态逻辑(isEdit = false)

1. 详情回显(detailInit)

javascript 复制代码
detailInit(detailId) {
  meetingDetail({ meetingId: detailId }).then(res => {
    if (res.data.oaId && res.data.oaId.length > 0) {
      res.data.oaId = res.data.oaId.split(',')  // 字符串转数组供 el-select 使用
      const temp = res.data.oaName.split(',')
      this.oaList = res.data.oaId.map((item, index) => {
        return {
          fdId: item,
          fdSubject: temp[index].split('$$')[0],  // 解析标题
          fdFormUrl: temp[index].split('$$')[1]   // 解析链接
        }
      })
    }
    this.balic = res.data
  })
}

作用 :从后端获取数据后,将 oaName 字符串还原成对象数组,填充 oaList 供下拉框回显

2. 页面展示(模板部分)

html 复制代码
<div v-else>
  <span v-if="balic.oaName">
    <a
      v-for="(item, index) in parseOaName(balic.oaName)"
      :key="index"
      :href="item.fdFormUrl"
      target="_blank"
      style="color: blue; margin-right: 15px; text-decoration: underline;"
    >
      {{ item.fdSubject }}
    </a>
  </span>-
  <span v-if="balic.oaProcessId">{{ balic.oaProcessId }}</span>
</div>

3. 解析方法(parseOaName)

javascript 复制代码
parseOaName(oaName) {
  if (!oaName) return []
  return oaName.split(',').map(item => {
    const parts = item.split('$$')
    return {
      fdSubject: parts[0] || '',
      fdFormUrl: parts[1] || ''
    }
  })
}

作用 :将 标题$$链接,标题$$链接 解析成 [{fdSubject, fdFormUrl}, ...] 数组供模板遍历


📊 数据流转图

复制代码
编辑时:
┌─────────────┐     选择     ┌─────────────────────────────┐
│  el-select  │ ───────────▶ │ oaName: "标题$$链接,标题$$" │
│  [fdId数组] │              │ oaId: [fdId1, fdId2]        │
└─────────────┘              └─────────────────────────────┘
                                    │
                                    ▼
                              提交时 join(',')
                                    │
                                    ▼
                           后端存储字符串

回显时:
┌─────────────┐     split    ┌─────────────────────────────┐
│  el-select  │ ◀─────────── │ oaId: "fdId1,fdId2"         │
│  [fdId数组] │              │ oaName: "标题$$链接,标题$$"  │
└─────────────┘              └─────────────────────────────┘
                                    │
                                    ▼ (split('$$'))
                           ┌─────────────────┐
                           │ 只显示标题+链接 │
                           └─────────────────┘

✅ 你的目的总结

  1. 编辑时:多选下拉框可以选择多个 OA 流程,选择后自动将标题和链接拼接保存
  2. 回显时:从后端取到拼接字符串,解析后只显示标题,点击能打开链接
  3. 兼顾:编辑状态下拉框要能正确回显之前选中的项

这个设计巧妙地用一个字段 oaName 同时存储了显示文本和跳转链接,避免了额外存储映射关系。

相关推荐
weixin_460443563 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
子兮曰4 小时前
把 649 种文件格式塞进一个网页里:一个「文件不出浏览器」的预览器
前端·javascript·后端
Cc.Y7 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
paopaokaka_luck7 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
阿森_dev7 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
by209997 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
笔墨登场说说7 小时前
flink bin/start-cluster.sh 帮我做成开机启动
开发语言·python
Sarvartha7 小时前
Lambda 表达式和函数式接口
java·开发语言
小白学大数据8 小时前
拼多多反爬对抗实战:Scrapy 中间件化采集架构解析
开发语言·scrapy·中间件·架构
溪语流沙8 小时前
【每天一个CSS | Day19】流光文字与一笔写成的手写签名
前端·javascript·css