Element Plus 组件库 - Select 选择器 value 为 index 时的一些问题

Select 选择器 value 为 index 时的一些问题

html 复制代码
<el-select v-model="packageSelect" placeholder="请选择升级包">
    <el-option v-for="(item, index) in packages" :key="item.id" :label="`${item.packageName}(${item.host})`" :value="index" />
</el-select>

<el-button @click="deleteFirstItem">删除第一项(模拟数据变化)</el-button>
<el-button @click="showSelectedInfo">显示当前选中信息</el-button>
js 复制代码
const packageSelect = ref(null);

const packages = ref([
    { id: 1, packageName: "升级包 A", host: "192.168.1.1" },
    { id: 2, packageName: "升级包 B", host: "192.168.1.2" },
    { id: 3, packageName: "升级包 C", host: "192.168.1.3" },
]);

const deleteFirstItem = () => {
    packages.value.shift();
};

const showSelectedInfo = () => {
    if (packageSelect.value === null) {
        console.log("请先选择一个项");
        return;
    }

    const selectedItem = packages.value[packageSelect.value];

    console.log("当前选中的项:", selectedItem);
};
  1. 用户选择"升级包 A",此时,packageSelect 为 1,点击"显示当前选中信息",输出结果如下

    当前选中的项: Proxy(Object) {id: 2, packageName: '升级包 B', host: '192.168.1.2'}

  2. 点击"删除第一项"后,数据变为如下

js 复制代码
[
    { id: 2, packageName: "升级包 B", host: "192.168.1.2" },
    { id: 3, packageName: "升级包 C", host: "192.168.1.3" },
]
  1. 此时,packageSelect 任然为 1,点击"显示当前选中信息",输出结果如下

    当前选中的项: Proxy(Object) {id: 3, packageName: '升级包 C', host: '192.168.1.3'}

  • 问题是用户原本选择的是"升级包 B",数据变化后,选择变成了"升级包 C"

解决方案

  1. 使用唯一标识符作为 value 值
html 复制代码
<el-select v-model="packageSelect" placeholder="请选择升级包">
    <el-option v-for="item in packages" :key="item.id" :label="`${item.packageName}(${item.host})`" :value="item.id" />
</el-select>

<el-button @click="deleteFirstItem">删除第一项(模拟数据变化)</el-button>
<el-button @click="showSelectedInfo">显示当前选中信息</el-button>
js 复制代码
const packageSelect = ref(null);

const packages = ref([
    { id: 1, packageName: "升级包 A", host: "192.168.1.1" },
    { id: 2, packageName: "升级包 B", host: "192.168.1.2" },
    { id: 3, packageName: "升级包 C", host: "192.168.1.3" },
]);

const deleteFirstItem = () => {
    packages.value.shift();
};

const showSelectedInfo = () => {
    if (packageSelect.value === null) {
        console.log("请先选择一个项");
        return;
    }

    const selectedItem = packages.value.find((item) => item.id === packageSelect.value);

    console.log("当前选中的项:", selectedItem);
};
  1. 使用拼接后的字符串作为 value 值
html 复制代码
<el-select v-model="packageSelect" placeholder="请选择升级包">
    <el-option v-for="item in packages" :key="item.packageName + item.host" :label="`${item.packageName}(${item.host})`" :value="item.packageName + item.host" />
</el-select>

<el-button @click="deleteFirstItem">删除第一项(模拟数据变化)</el-button>
<el-button @click="showSelectedInfo">显示当前选中信息</el-button>
js 复制代码
const packageSelect = ref(null);

const packages = ref([
    { packageName: "升级包 A", host: "192.168.1.1" },
    { packageName: "升级包 B", host: "192.168.1.2" },
    { packageName: "升级包 C", host: "192.168.1.3" },
]);

const deleteFirstItem = () => {
    packages.value.shift();
};

const showSelectedInfo = () => {
    if (packageSelect.value === null) {
        console.log("请先选择一个项");
        return;
    }

    const selectedItem = packages.value.find((item) => item.packageName + item.host === packageSelect.value);

    console.log("当前选中的项:", selectedItem);
};
  1. 使用 index 作为 value 值,同时在数据变化时,手动将 packageSelect 重置为 null
html 复制代码
<el-select v-model="packageSelect" placeholder="请选择升级包">
    <el-option v-for="(item, index) in packages" :key="item.id" :label="`${item.packageName}(${item.host})`" :value="index" />
</el-select>

<el-button @click="deleteFirstItem">删除第一项(模拟数据变化)</el-button>
<el-button @click="showSelectedInfo">显示当前选中信息</el-button>
js 复制代码
const packageSelect = ref(null);

const packages = ref([
    { id: 1, packageName: "升级包 A", host: "192.168.1.1" },
    { id: 2, packageName: "升级包 B", host: "192.168.1.2" },
    { id: 3, packageName: "升级包 C", host: "192.168.1.3" },
]);

const deleteFirstItem = () => {
    packages.value.shift();
    packageSelect.value = null;
};

const showSelectedInfo = () => {
    if (packageSelect.value === null) {
        console.log("请先选择一个项");
        return;
    }

    const selectedItem = packages.value[packageSelect.value];

    console.log("当前选中的项:", selectedItem);
};
相关推荐
橘子编程9 分钟前
JavaScript与TypeScript终极指南
javascript·ubuntu·typescript
hoiii1879 分钟前
CSTR反应器模型的Simulink-PID仿真(MATLAB实现)
开发语言·matlab
王夏奇15 分钟前
python中的__all__ 具体用法
java·前端·python
炘爚41 分钟前
C++ 右值引用与程序优化
开发语言·c++
叫我一声阿雷吧1 小时前
JS 入门通关手册(45):浏览器渲染原理与重绘重排(性能优化核心,面试必考
javascript·前端面试·前端性能优化·浏览器渲染·浏览器渲染原理,重排重绘·reflow·repaint
大家的林语冰1 小时前
《前端周刊》尤大开源 Vite+ 全家桶,前端工业革命启动;尤大爆料 Void 云服务新产品,Vite 进军全栈开发;ECMA 源码映射规范......
前端·javascript·vue.js
si莉亚1 小时前
ROS2安装EVO工具包
linux·开发语言·c++·开源
清心歌1 小时前
CopyOnWriteArrayList 实现原理
java·开发语言
jiayong231 小时前
第 8 课:开始引入组合式函数
前端·javascript·学习
田八1 小时前
聊聊AI的发展史,AI的爆发并不是偶然
前端·人工智能·程序员