第7节:多选模式、自定义选项渲染、受控弹窗显隐

第7节:多选模式、自定义选项渲染、受控弹窗显隐

本节讲三个高频进阶点:多选标签、弹窗里自定义选项长什么样、用代码主动打开 / 关闭下拉弹窗。

核心知识点

  1. multiple:开启多选,选中项以 tag 标签形式展示
  2. collapse-tags:多选时折叠标签,只显示第一个 + "+N"
  3. el-option 默认插槽:自定义每一项的渲染内容(图标、状态、描述文字)
  4. v-model:visible:受控弹窗显隐,用代码主动控制弹窗打开 / 关闭(替代手动点)

完整可测试代码

复制代码
<template>
  <div class="container">
    <h4>多选 + 自定义选项 + 受控弹窗</h4>

    <el-select
      v-model="selectedList"
      multiple
      collapse-tags
      collapse-tags-tooltip
      :visible="popVisible"
      placeholder="请选择技术栈(可多选)"
      style="width: 360px"
      @visible-change="(v) => popVisible = v"
    >
      <!-- 自定义选项内容:图标 + 名称 + 描述 -->
      <el-option
        v-for="item in options"
        :key="item.value"
        :label="item.label"
        :value="item.value"
      >
        <div class="option-row">
          <span class="dot" :style="{ background: item.color }"></span>
          <span class="name">{{ item.label }}</span>
          <span class="desc">{{ item.desc }}</span>
        </div>
      </el-option>
    </el-select>

    <div style="margin-top: 16px">
      <el-button size="small" @click="popVisible = true">代码打开弹窗</el-button>
      <el-button size="small" @click="popVisible = false">代码关闭弹窗</el-button>
      <el-button size="small" @click="selectedList = ['vue', 'go']">代码默认选中两项</el-button>
    </div>

    <p style="margin-top: 12px">选中值:{{ selectedList }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue'

const selectedList = ref([])
const popVisible = ref(false)

const options = ref([
  { label: 'Vue', value: 'vue', desc: '渐进式框架', color: '#42b883' },
  { label: 'React', value: 'react', desc: 'UI 库', color: '#61dafb' },
  { label: 'Angular', value: 'angular', desc: '全功能框架', color: '#dd0031' },
  { label: 'Node.js', value: 'node', desc: '服务端 JS', color: '#68a063' },
  { label: 'Go', value: 'go', desc: '云原生首选', color: '#00add8' },
  { label: 'Python', value: 'python', desc: 'AI 首选', color: '#ffd43b' },
])
</script>

<style scoped>
.container { padding: 20px; }
.option-row {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
}
.dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  flex-shrink: 0;
}
.name { flex: 1; }
.desc {
  font-size: 12px;
  color: #909399;
}
</style>

测试要点

  1. 点开下拉,每个选项是自定义渲染:左侧彩色圆点 + 名称 + 灰色描述文字
  2. 多选几个选项,输入框里标签折叠成 "第一个 + 2",鼠标悬停 +2 能看到完整标签(collapse-tags-tooltip)
  3. 点 "代码打开弹窗" 按钮,弹窗自动弹出;点 "代码关闭弹窗" 自动收起
  4. 点 "代码默认选中两项",selectedList 被赋值,输入框同步显示对应标签

业务坑提醒

  • 自定义选项渲染时,label 必须保留:它负责选中后输入框显示的文字和搜索匹配,插槽只改弹窗里的长相
  • v-model:visible 受控后,一定要监听 @visible-change 把用户手动开合的状态同步回来,否则会 "点不开 / 关不掉"
相关推荐
paopaokaka_luck10 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
漫天转悠15 小时前
Vue3白屏排查实录-Transition与多根模板
vue.js·1024程序员节
jason.zeng@150220717 小时前
Nginx 配置详解(静态 HTML、下载目录、API 反向代理三套场景)
java·vue.js·1024程序员节
Bug收容所20 小时前
Vue+JS Day3
前端·javascript·vue.js·前端框架·1024程序员节
用户83134859306982 天前
Vue3 v-for:常用用法与开发高频坑点
前端·javascript·vue.js
林恒smileZAZ2 天前
用 Vue 3 + Electron 做桌宠:从启动退出到拖拽、单击与鼠标穿透
vue.js·electron·计算机外设
软件技术NINI2 天前
基于JavaWeb 汽车租聘
java·vue.js·spring boot·后端·python·毕业设计·毕设
2301_32241428042 天前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
酷炫码神2 天前
Day 8|Vue3 响应式:告别手动操作 DOM,让数据驱动界面
javascript·vue.js·ecmascript
星光不问赶路人2 天前
Vue 3 对象监听与快照:ref 和 reactive 的关键差异
前端·vue.js