el-Dropdown 两个下拉框之间的动态绑定 实现默认选中值

news2024/11/18 1:48:08

目录

业务场景

官方链接

实现效果

使用框架

代码展示

template代码

script代码

变量定义

事件定义

        onMounted事件

        courseClass事件--课程班级绑定

        defaultValue事件

        optionChange事件

        changeClass事件

                为什么要给课程的每个选项也绑定click事件?作用是什么?

        classChange事件

        getIndex事件

完整代码

总结


业务场景

有时候我们在项目中可能多个下拉框之间的数据具有一个级联绑定关系,通过切换某个下拉框的选项值之后,另一个下拉框的中的选项也随之改变。

这个在项目中是经常使用到的一种场景,今天我来分享分享我们具体的实现和需要注意的一些点

官方链接

Checkbox 多选框:Checkbox 多选框 | Element Plus

实现效果

这篇博客要实现的是课程和班级的一个绑定关系,当页面加载之后给课程和班级下拉框一个默认值,通过切换课程班级下拉框中的选项之后班级下拉框中的选项也随之变换成,当前选中课程下的所有班级名

使用框架

Vue3+element-plus(1.2.0-beta.5)

代码展示

template代码

<!-- 课程 -->
      <span style="margin-left: 110px">课程:</span>
      <el-select
        v-model="allCourse"
        filterable
        placeholder="请选择课程"
        @change="optionChange()"
      >
        <el-option
          v-for="(item, index) in courseOptions"
          :key="item.value"
          :label="item.label"
          :value="{ value: item.value, label: item.label }"
          @click="changeClass(index)"
        />
      </el-select>

<!-- 班级 -->
      <span style="margin-left: 80px">班级:</span>
      <el-select
        v-model="allClass"
        filterable
        placeholder="请选择班级"
        @change="classChange()"
      >
        <el-option
          v-for="item in classOptions"
          :key="item.value"
          :label="item.label"
          :value="{ value: item.value, label: item.label }"
        />
      </el-select>

script代码

变量定义

//课程
const allCourse = ref("");

//班级
const allClass = ref({
    id: "",
    name: "",
});

//课程选项
const courseOptions = ref([]);

//班级选项
const classOptions = ref([]);

事件定义

onMounted事件

当页面一加载就对课程和班级下拉框赋一个默认值

这里的课程ID和班级ID的变量是从缓存中获取的,你们也可以修改成自己需要的

onMounted(() => {
      console.log("进入到onMounted了");

      courseClass();
      classID.value = localStorage.getItem("classId");
      courseID.value = localStorage.getItem("courseId");

      //班级名称
      coursename.value = localStorage.getItem("className");
      //课程名称
      coursename.value = localStorage.getItem("courseName");
      
    });

courseClass事件--课程班级绑定

在实例中班级和课程的信息是调用后端接口获取到的。

//课程-班级级联
async function courseClass() {
      try {
        await getCourseIdAndClassId({
          cookie: localStorage.getItem("cookie"),
          userCode: localStorage.getItem("phone"),
          status: "teach",
        }).then((res) => {
          CourseAndClass.value = res;
          // for循环将所有的课程id与name组成courseOptions
          for (let i = 0; i < res.length; i++) {
            var o = new Object();
            o.value = res[i].id;
            o.label = res[i].name;
            o.classInfo = res[i].classInfo;
            courseOptions.value.push(o);
          }
          // 获取缓存中的值
          defaultValue();
        });
      } catch (error) {
        console.log(error);
      }
}

defaultValue事件

// 课程与班级下拉框的默认值
function defaultValue() {
      //为下拉框进行一个默认选中功能
      var index = courseOptions.value.findIndex((item) => {
         //判断当前遍历元素的label值(课程名称)是否与缓存中的一致
        if (item.label == localStorage.getItem("courseName")) {
          //一致,返回true,并且将当前元素的index赋值给变量
          return true;
        }
      });

      //获取课程数组中指定索引的课程
      allCourse.value = courseOptions.value[index];

      // 获取class
      getIndex(index);
      //为下拉框进行一个默认选中功能
      var proNum = classOptions.value.findIndex((item) => {
       //判断当前遍历元素的label值(班级名称)是否与缓存中的一致
        if (item.label == localStorage.getItem("className")) {
          //一致,返回true,并且将当前元素的index赋值给变量
          return true;
        }
      });

      //获取课程数组中指定索引的班级
      allClass.value = classOptions.value[proNum];
}

optionChange事件

// 课程选择器的变化事件
async function optionChange() {
      // 清空当前班级的下拉框
      allClass.value = [];
}

changeClass事件

//重选课程后,班级为重选课程的第一个班级
    function changeClass(index) {
      searchContent.value = "";
      //班级为默认班级
      getIndex(index);
      allClass.value = classOptions.value[0];

      //课程总时长和已推送活动总时长
      courseID.value = allCourse.value.value;
      classID.value = allClass.value.value;
      coursename.value = allCourse.value.label;
      classname.value = allClass.value.label;
      courseAllTime(courseID.value);
      pushedActivityTime(classID.value, courseID.value);

      //表格数据
      currentPage.value = 1;
      studentData(
        allClass.value.value,
        courseOptions.value[index].value,
        currentPage.value,
        pageSize.value
      );
      //更新导出Excel
      tableData.value = [];
      getAllStuStudying(courseID.value, classID.value);
      excelHandle(true);
      //导出Excel时文件名称
      title.value =
        coursename.value + "--" + classname.value + "--学生学习数据";
    }

为什么要给课程的每个选项也绑定click事件?作用是什么?

这里想要实现的效果是当对课程下拉框重新选择之后,班级下拉框也能够实现同步改变,给一个默认选项。从整体业务场景来看,防止用户在选择了课程下拉框之后班级下拉框不改变,给用户造成触发事件失效等现象

classChange事件

//班级改变重新获取值进行存储
async function classChange() {
      //存储课程与班级id,到变量中
      courseID.value = allCourse.value.value;
      classID.value = allClass.value.value;
      coursename.value = allCourse.value.label;
      classname.value = allClass.value.label;     
}

getIndex事件

// 单击下拉框
function getIndex(index) {
      // 获取课程中的索引进行查询到该课程下的班级
      var body = CourseAndClass.value[index].classInfo;
      classOptions.value = [];
      for (let i = 0; i < body.length; i++) {
        var o = new Object();
        o.value = body[i].id;
        o.label = body[i].name;
        classOptions.value.push(o);
      }
}

完整代码

<template>
  <div>
    <div style="color: #409eff; font-size: 20px">
      <!-- 课程 -->
      <span style="margin-left: 110px">课程:</span>
      <el-select
        v-model="allCourse"
        filterable
        placeholder="请选择课程"
        @change="optionChange()"
      >
        <el-option
          v-for="(item, index) in courseOptions"
          :key="item.value"
          :label="item.label"
          :value="{ value: item.value, label: item.label }"
          @click="changeClass(index)"
        />
      </el-select>

      <!-- 班级 -->
      <span style="margin-left: 80px">班级:</span>
      <el-select
        v-model="allClass"
        filterable
        placeholder="请选择班级"
        @change="classChange()"
      >
        <el-option
          v-for="item in classOptions"
          :key="item.value"
          :label="item.label"
          :value="{ value: item.value, label: item.label }"
        />
      </el-select>
    </div>
  </div>


</template>

<script>
import { reactive, ref, onMounted } from "vue";
import { Grid } from "@element-plus/icons-vue";
import {
  getAllChapterTimeByCourseId,
  getCourseIdAndClassId,
} from "@/api/CourseAndClassAndStudentManage/CourseManage";

export default {
  components: {
    Grid,
  },
  setup() {

    //课程
    const allCourse = ref("");
    
    //班级
    const allClass = ref({
        id: "",
        name: "",
    });
    
    //课程选项
    const courseOptions = ref([]);
    
    //班级选项
    const classOptions = ref([]);


    onMounted(() => {
      console.log("进入到onMounted了");

      courseClass();
      classID.value = localStorage.getItem("classId");
      courseID.value = localStorage.getItem("courseId");

      //班级名称
      coursename.value = localStorage.getItem("className");
      //课程名称
      coursename.value = localStorage.getItem("courseName");
      
    });

    
   // 课程选择器的变化事件
	async function optionChange() {
      // 清空当前班级的下拉框
      allClass.value = [];
	}

    
    //班级改变重新获取值进行存储
	async function classChange() {
          //存储课程与班级id,到变量中
          courseID.value = allCourse.value.value;
          classID.value = allClass.value.value;
          coursename.value = allCourse.value.label;
          classname.value = allClass.value.label;     
	}

    

   // 课程与班级下拉框的默认值
	function defaultValue() {
          //为下拉框进行一个默认选中功能
          var index = courseOptions.value.findIndex((item) => {
             //判断当前遍历元素的label值(课程名称)是否与缓存中的一致
            if (item.label == localStorage.getItem("courseName")) {
              //一致,返回true,并且将当前元素的index赋值给变量
              return true;
            }
          });
    
          //获取课程数组中指定索引的课程
          allCourse.value = courseOptions.value[index];
    
          // 获取class
          getIndex(index);
          //为下拉框进行一个默认选中功能
          var proNum = classOptions.value.findIndex((item) => {
           //判断当前遍历元素的label值(班级名称)是否与缓存中的一致
            if (item.label == localStorage.getItem("className")) {
              //一致,返回true,并且将当前元素的index赋值给变量
              return true;
            }
          });
    
          //获取课程数组中指定索引的班级
          allClass.value = classOptions.value[proNum];
	}

    //重选课程后,班级为重选课程的第一个班级
    function changeClass(index) {
          //班级为默认班级
          getIndex(index);
         //给班级下拉框默认勾选第一个班级
          allClass.value = classOptions.value[0];
    
          //重新获取课程班级的ID和名称
          courseID.value = allCourse.value.value;
          classID.value = allClass.value.value;
          coursename.value = allCourse.value.label;
          classname.value = allClass.value.label;      
	}

    
    // 单击下拉框
	function getIndex(index) {
          // 获取课程中的索引进行查询到该课程下的班级
          var body = CourseAndClass.value[index].classInfo;
          classOptions.value = [];
          for (let i = 0; i < body.length; i++) {
            var o = new Object();
            o.value = body[i].id;
            o.label = body[i].name;
            classOptions.value.push(o);
          }
	}
    
   //课程-班级级联
    async function courseClass() {
          try {
            await getCourseIdAndClassId({
              cookie: localStorage.getItem("cookie"),
              userCode: localStorage.getItem("phone"),
              status: "teach",
            }).then((res) => {
              CourseAndClass.value = res;
              // for循环将所有的课程id与name组成courseOptions
              for (let i = 0; i < res.length; i++) {
                var o = new Object();
                o.value = res[i].id;
                o.label = res[i].name;
                o.classInfo = res[i].classInfo;
                courseOptions.value.push(o);
              }
              // 获取缓存中的值
              defaultValue();
            });
          } catch (error) {
            console.log(error);
          }
    }




    return {
      changeClass,
      courseID,
      classID,
      coursename,
      classname,    
      defalutCourse,
      defalutClass,    
      CourseAndClass,
      allCourse,
      courseOptions,
      allClass,
      classOptions,
      optionChange,
      classChange,
      defaultValue,
      courseClass,
      getIndex,
      loading,    
      checkBoxGroup,
      reload,

    };
  },
};
</script>

<style>


</style>

总结

多看官方文档,我们遇到的很多问题其实文档中都有详细说明。

如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞、收藏脚印支持一下博主~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字化时代,基于令牌的身份验证是如何工作?

一、背景 数字化转型给用户带来了安全问题&#xff0c;以保护他们的身份免受假冒。据美国诺顿称&#xff0c;平均每年有 80 万个帐户被黑客入侵。需要用于身份验证的高安全性系统和网络安全法规。 传统方法依赖于使用用户名和密码的单级身份验证来授予对 Web 资源的访问权限。…

Superset安装与使用

第1章 Superset入门 1.1 Superset概述 Apache Superset是一个开源的、现代的、轻量级BI分析工具&#xff0c;能够对接多种数据源、拥有丰富的图表展示形式、支持自定义仪表盘&#xff0c;且拥有友好的用户界面&#xff0c;十分易用。 1.2 Superset应用场景 由于Superset能够…

局域网yum仓库搭建

有时候在线的yum源安装特别慢还经常会断,制作自己的一个本地yum源是有必要的。 使用场景,一个服务器集群,只有一台服务器能连接外网,连接外网那台服务器就可以通过reposync把外网源的包全部同步下来放在本地,集群中其他服务器就以这台服务器为包库使用 yum 安装,当然,同…

nginx 后退

nginx 后退目录概述需求&#xff1a;设计思路实现思路分析1.使用nginx的2.配置nginx属性即可参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for chang…

TextMeshPro快速上手

Text Mesh Pro是Unity的新的文本显示对象&#xff0c;最大的优点是放大以后不会有锯齿&#xff0c;而且有更多的显示效果。缺点是需要配置才能使用&#xff0c;不像原来的直接就可以用。 官方资源 http://digitalnativestudios.com/textmeshpro/docs/ https://docs.unity3d.c…

MrDoc的excel文件导入(Luckysheet)空白行问题问题

今天继续测试MrDoc&#xff0c;虽然写这个文的时候我的MrDoc的文还没整完。。 但是今天这个问题是一个比较独立的模块&#xff0c;就单独说吧。 文章目录问题&#xff1a;导入缓慢省流&#xff1a;修改Luckysheet的初始化参数寻找&#xff1a;MrDoc使用的表格技术破案&#xff…

【Redis—过期策略和内存淘汰策略】

Reids过期策略 设置过期时间 expire <key> <n>&#xff1a;设置 key 在 n 秒后过期&#xff0c;比如 expire key 100 表示设置 key 在 100 秒后过期&#xff1b; pexpire <key> <n>&#xff1a;设置 key 在 n 毫秒后过期&#xff0c;比如 pexpire ke…

二极管与三极管

能带Energy band 能带理论是用量子力学的方法研究固体内部电子运动的理论。 能带理论的作用&#xff1a;说明了导体与绝缘体、半导体的区别所在&#xff1b;解释了晶体中电子的平均自由程问题。 根据电子填充的情况&#xff0c;能带分为传导带&#xff08;简称导带&#xff0c…

(二十二)Vue之脚手架的使用

文章目录基本使用脚手架文件结构分析mian.js文件关于不同版本的Vue关于render函数关于vue.config.js配置文件关于index.html文件演示程序Vue学习目录 上一篇&#xff1a;&#xff08;二十一&#xff09;Vue之单文件组件 Vue 脚手架是 Vue 官方提供的标准化开发工具&#xff0…

数据库,计算机网络、操作系统刷题笔记17

数据库&#xff0c;计算机网络、操作系统刷题笔记17 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

圣诞节,来棵Golang的圣诞树吧

一、前言 2022年的圣诞到啦&#xff0c;不知道大家都&#x1f411;了吗&#xff01;博主已经挺进了决赛圈&#xff0c;希望可以继续稳如老狗&#xff01;本来今天是想继续深挖一下git&#xff0c;但打开博客看到这个圣诞活动&#xff0c;还可以赢徽章&#xff0c;那我肯定要把…

C++基础之提高5

C提高编程 本阶段主要针对C泛型编程和STL技术做详细讲解&#xff0c;探讨C更深层的使用 1 模板 1.1 模板的概念 模板就是建立通用的模具&#xff0c;大大提高复用性 例如生活中的模板 一寸照片模板&#xff1a; PPT模板&#xff1a; 模板的特点&#xff1a; 模板不可以直…

Maven 运行性期间不报错

Maven 运行性期间不报错目录概述需求&#xff1a;设计思路实现思路分析1.正确引入maven问题2.编译maven 无问题3.运行出错了参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a…

第14章_MySQL事务日志

第14章_MySQL事务日志第14章_MySQL事务日志1. redo日志1.1 为什么需要REDO日志1.2 REDO日志的好处、特点1.3 redo的组成1.5 redo log的刷盘策略1.6 不同刷盘策略演示1.7 写入redo log buffer 过程1.8 redo log file1. 相关参数设置2. 日志文件组3. checkpoint1.9 redo log小结2…

python基础语法——变量和变量类型

文章目录变量命名规则使用变量和修改变量变量的类型整数 int浮点数 float字符串 string布尔动态类型特征变量命名规则 软性规则&#xff1a; 1.给变量命名的时候&#xff0c;尽量使用描述性的单词来表示&#xff0c;尽量通过名字来表现出变量的作用 2. 当我们使用一个单词描述…

实战讲解时区处理基于SimpleDateFormat和LocalDateTime

1 缘起 最近在做海外的项目&#xff0c; 需要根据时区转换时间&#xff0c;起初&#xff0c;项目使用的时区格式为{area}/{city}&#xff0c; 可直接使用SimpleDateFormat处理&#xff0c;后面由于要添加其他地区&#xff0c; 统一将时区改为UTC格式&#xff0c;此时&#xff…

AndroidQ兼容性适配指南

AndroidQ Android 10 中的隐私权变更 隐私权变更受影响的应用缓解策略✅分区存储 针对外部存储的过滤视图&#xff0c;可提供对特定于应用的文件和媒体集合的访问权限访问和共享外部存储中的文件的应用使用特定于应用的目录和媒体集合目录 了解详情✅增强了用户对位置权限的控…

Viewer.js点击按钮放大图片用法

1、Viewer.js点击按钮放大图片用法 <div onclick"getHideBig(hide_img_weight1)" id"btn_img_weight1">查看图片</div> <img src"tibet-3.jpg" id"hide_img_weight1" style"display: none;"/><script…

异常的认识 -(java)

文章目录前言1. 什么时异常&#xff1f;2. 异常的分类2.1 运行时异常/非受查异常2.2 编译时异常/受查异常3. 处理异常3.1 抛出异常3.2 声明异常3.3 try catch处理异常总结✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来&#xff01; 编程真是一件很奇妙的东西。你只是…

java 之 git 手把手教学

什么是git? Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xff08;Java类、xml文件、html页面等&#xff09;&#xff0c;在软件开发过程中被广泛使用。 学完之后能干什么&#xff1f; Git 简介 Git 代码托管服务 Git 常用命令 git add前…