elementUI两个select单选框联动

实现需求:两个单选框内容两栋,在选择第一个时,第二个选框能自动更新对应选项。且在切换第一个选项内容时,第二个选框会被清空且切换到新的对应选项。

设置值班班次和备班情况两个选项 ,完整代码如下:

复制代码
<template>
  <div class="content-box">
      <div class="container">
          <el-select v-model="leftValue" placeholder="请选择" @change="handleLeftChange">
              <!-- <el-option v-if="leftOptions.length !== 0" label="全选" value="all"></el-option> -->
              <el-option v-for="item in leftOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
          </el-select>

          <el-select
              style="margin-left: 20px"
              @change="handleRightChange"
              v-model="rightValue"
              disabled
              placeholder="请选择"
          >
              <el-option
                  v-for="item in leftOptions"
                  :key="item.value"
                  :label="item.name"
                  :value="item.id"
                  :disabled="rightDisabledOptions.includes(item.value)"
              ></el-option>
          </el-select>
      </div>
  </div>
</template>

<script>
export default {
  data() {
      return {
          leftValue: [],
          rightValue: [],
          leftOptions: [
              { value: '1', label: '白班', name: '否', id: 1 },
              { value: '2', label: '夜班', name: '否', id: 2 },
              { value: '3', label: '备班', name: '是', id: 3 },
              { value: '4', label: '全班', name: '否', id: 4 },
              { value: '5', label: '休班', name: '否', id: 5}
          ],
          rightDisabledOptions: [],
          selectData: [],
          updSelect: [] //为了不影响原始数据,不然原始数据勾选几次值全改变了
      };
  },
  mounted() {},
  methods: {
      handleLeftChange(value) {
          // 清空右边下拉框的选中值和禁用选项
          this.rightValue = [];
          this.rightDisabledOptions = [];
          this.selectData = [];

          // 根据左边下拉框的选中值更新右边下拉框的选中值和禁用选项
          // 左右结构一定要有一样的值,不然联动不了
          // 如果是全选,就让所有的select被选中
          if (value.includes('all')) {
              this.leftValue = this.leftOptions.map((option) => option.value);
              this.rightValue = this.leftOptions.map((option) => option.name);
              this.selectData = this.leftOptions;
          } else {
              this.leftOptions.forEach((option) => {
                  // 如果左侧选中的包含右侧的value值
                  if (this.leftValue.includes(option.value)) {
                      this.rightValue.push(option.name);// 把option.id改为option.name,显示出来的才是是否
                      this.selectData.push(option);
                  } else {
                      this.rightDisabledOptions.push(option.value);
                  }
              });
          }

          this.updSelect = JSON.parse(JSON.stringify(this.selectData));
      },
      // 右侧选择
      handleRightChange(value) {
        //将selectData值深拷贝给UpdSelect
          this.updSelect = JSON.parse(JSON.stringify(this.selectData));
          this.updSelect.forEach((item) => {
              if (!value.includes(item.id)) {
                  item.id = -1;
                  item.name = '';
              }
          });
          console.log(this.updSelect, '解决');
      }
  }
};
</script>

<style lang="scss" scoped></style>

由于第二个选框是和第一选框值同步的,第一个框有五个值,第二个框就也要五个选项,即使是重复的值。为了看起来没那么杂乱,我就把第二个选框禁用了(反正值能自己更新)

学习参考来源:俩个el-select的联动选择_el-select 联动-CSDN博客

相关推荐
木斯佳1 天前
前端八股文面经大全:26届秋招滴滴校招前端一面面经-事件循环题解析
前端·状态模式
光影少年1 天前
react状态管理都有哪些及优缺点和应用场景
前端·react.js·前端框架
晚烛1 天前
CANN + 物理信息神经网络(PINNs):求解偏微分方程的新范式
javascript·人工智能·flutter·html·零售
saber_andlibert1 天前
TCMalloc底层实现
java·前端·网络
逍遥德1 天前
如何学编程之01.理论篇.如何通过阅读代码来提高自己的编程能力?
前端·后端·程序人生·重构·软件构建·代码规范
冻感糕人~1 天前
【珍藏必备】ReAct框架实战指南:从零开始构建AI智能体,让大模型学会思考与行动
java·前端·人工智能·react.js·大模型·就业·大模型学习
程序员agions1 天前
2026年,“配置工程师“终于死绝了
前端·程序人生
alice--小文子1 天前
cursor-mcp工具使用
java·服务器·前端
晚霞的不甘1 天前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
小迷糊的学习记录1 天前
0.1 + 0.2 不等于 0.3
前端·javascript·面试