Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何实现两个下拉选择框 select选中联动效果?

如何实现两个下拉选择框 select选中联动效果?

原创
作者头像
喵喵侠
修改于 2024-06-13 08:09:00
修改于 2024-06-13 08:09:00
1.4K1
举报

目录

前言

最近接到一个需求,大概是这样的:

某一个页面,上面是查询项,下面是列表。查询项中有两个下拉选择框,都是查询条件。这两个选择框是父子级的关系。当我选中第一个选择框某一项时,第二个选择框的下拉项会发生变化;当选择第二个选择框的某一项时,需要回填第一个选择框的值。

大概是这么个效果,这么描述起来有点复杂。下面我们来看一个实际案例,这样就会清晰很多。

案例

假设现在有两个下拉选择框,选择框1代表公司,选择框 2 代表产品。如下图所示:

实现的功能要求如下:

  1. 默认情况下,选择框 1 点击可以查看所有的公司选项,选择框 2 可以看到所有的产品选项(不区分公司)。
  2. 选择选择框 1 中,任意一个公司后(如:腾讯),选择框 2 中只会出现与该公司(如:腾讯)相关的产品选项。
  3. 如果一开始选中的选择框 2的某个产品(如:微信),那么选择框 1 会被默认选中该产品对应的公司(如:腾讯)
  4. 再外加一个重置的按钮,点击重置后,两个选择框都恢复到初始状态,也就是单独点击可以查看全部选项。

通过这个案例描述,加上配图,是不是就清晰许多了。下面我们来一起实现这样的功能吧。

功能实现

首先我们写一个页面布局,可以手写,也可以借助腾讯云 AI 代码助手来生成。

这里我以 element ui 为例子,用 AI 助手来生成了,prompt 如下:

代码语言:vue
AI代码解释
复制
请帮我生成一个 element-ui 表单页面,这个页面有两个选择框,分别是:
选择框el-select 公司(腾讯、百度、阿里)
选择框el-select 产品(QQ、微信、钉钉、淘宝、百度网盘、百度输入法)
其中QQ、微信是腾讯的产品,钉钉、淘宝是阿里的产品,百度网盘、百度输入法是百度的产品。
他们有从属关系,我需要你帮我实现以下功能:
1. 默认情况下,选择框 1 点击可以查看所有的公司选项,选择框 2 可以看到所有的产品选项(不区分公司)。
2. 选择选择框 1 中,任意一个公司后(如:腾讯),选择框 2 中只会出现与该公司(如:腾讯)相关的产品选项。
3. 如果一开始选中的选择框 2的某个产品(如:微信),那么选择框 1 会被默认选中该产品对应的公司(如:腾讯)
4. 再外加一个重置的按钮,点击重置后,两个选择框都恢复到初始状态,也就是单独点击可以查看全部选项。
-----满足上面这些要求后,给我生成一个 bootcdn 版本的element-ui 的html 版本的 demo

于是我们得到了下面的文件内容:

代码语言:html
AI代码解释
复制
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Element UI 表单页面</title>
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
</head>
<body>
    <div id="app">
        <el-form ref="form" label-position="left" label-width="120px">
            <el-form-item label="公司">
                <el-select v-model="company" placeholder="请选择公司">
                    <el-option
                        v-for="item in companies"
                        :key="item.value"
                        :label="item.label"
                        :value="item.value"
                    ></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="产品">
                <el-select v-model="product" placeholder="请选择产品">
                    <el-option
                        v-for="item in products"
                        :key="item.value"
                        :label="item.label"
                        :value="item.value"
                    ></el-option>
                </el-select>
            </el-form-item>
            <el-form-item>
                <el-button @click="resetForm">重置</el-button>
            </el-form-item>
        </el-form>
    </div>

   <script src="https://unpkg.com/vue@2.6.12/dist/vue.js"></script>
   <script src="https://unpkg.com/element-ui@2.15.7/lib/index.js"></script>
   <script>
        new Vue({
            el: '#app',
            data() {
                return {
                    company: '',
                    product: '',
                    companies: [
                        { label: '腾讯', value: 'tencent' },
                        { label: '百度', value: 'baidu' },
                        { label: '阿里', value: 'alibaba' }
                    ],
                    products: [
                        { label: 'QQ', value: 'qq', company: 'tencent' },
                        { label: '微信', value: 'wechat', company: 'tencent' },
                        { label: '钉钉', value: 'dingtalk', company: 'alibaba' },
                        { label: '淘宝', value: 'taobao', company: 'alibaba' },
                        { label: '百度网盘', value: 'baidunetdisk', company: 'baidu' },
                        { label: '百度输入法', value: 'baiduinput', company: 'baidu' }
                    ]
                };
            },
            watch: {
                company(newValue) {
                    this.product = '';
                    if (newValue === 'tencent') {
                        this.products = [
                            { label: 'QQ', value: 'qq', company: 'tencent' },
                            { label: '微信', value: 'wechat', company: 'tencent' }
                        ];
                    } else if (newValue === 'alibaba') {
                        this.products = [
                            { label: '钉钉', value: 'dingtalk', company: 'alibaba' },
                            { label: '淘宝', value: 'taobao', company: 'alibaba' }
                        ];
                    } else if (newValue === 'baidu') {
                        this.products = [
                            { label: '百度网盘', value: 'baidunetdisk', company: 'baidu' },
                            { label: '百度输入法', value: 'baiduinput', company: 'baidu' }
                        ];
                    }
                },
                product(newValue) {
                    this.company = newValue.company;
                }
            },
            methods: {
                resetForm() {
                    this.company = '';
                    this.product = '';
                }
            }
        });
    </script>
</body>
</html>

AI 助手虽然给我做出了页面,但是没有替换 cdn,联动还是有问题。不过不要紧,我们来手动实现下功能需求。

从上面代码可以注意到,products 作为第二个选择框的选项,额外引入了company的字段,这个字段非常关键,当你选中某一项的产品的时候,你能立马知道对应的公司是哪家。真实业务开发过程中,这一点需要跟后端开发沟通,要求对方通过接口返回的数据,包括company这一项。

仔细想想,其实公司的选项是不需要做过滤的,只有产品需要做过滤。那么思路就很清晰了,如何给产品做过滤,以及如何回显公司。

给产品做过滤,我有两个思路:

  1. 备份一下原有的全量数据,写到 data 里面命名为productsDefault,当选中公司后,将productsDefault用 filter 方法,判断筛选出等于当前公司的项,返回数组并赋值给products。
  2. 还是用原来的 products 这个数组,只是给每一项额外新增一个字段,比方说叫 display,设置为 true 就是显示,设置为 false 就是隐藏,绑定到 el-option上,控制是否渲染。

其实两个方法思路都是过滤,只是思路2 不需要额外准备一个备份的变量。但思路 2 需要注意一点,v-if 和 v-for 不能混用,这里需要再外层用 template 上加 v-for,然后再在里面加 v-if。

至于公司的选中的回显,只需要在产品选择框上加一个 change 事件,每次改变后,根据当前产品的 value ,用 find 方法查询对应的公司,然后把公司选择框的 v-model 赋值一下就好了。

重置就更好做了,直接用 forEach 把products所有的每一项的 display 设置为 true ,把两个选择框的 v-mol 置为空字符串即可。

另外需要注意一点,每次选择公司后,需要把上次选中的产品给清空掉,我是写完才发现有这个问题的。

下面附上完整的代码吧:

代码语言:html
AI代码解释
复制
<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Element UI 表单页面</title>
  <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
</head>

<body>
  <div id="app">
    <el-form ref="form" label-position="left" label-width="120px">
      <el-form-item label="公司">
        <el-select v-model="company" placeholder="请选择公司" @change="handleChange1">
          <el-option v-for="item in companies" :key="item.value" :label="item.label" :value="item.value"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="产品">
        <el-select v-model="product" placeholder="请选择产品" @change="handleChange2">
          <template v-for="item in products">
          <el-option
            v-if="item.display" :key="item.value" :label="item.label" :value="item.value"></el-option>
          </template>
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button @click="resetForm">重置</el-button>
      </el-form-item>
    </el-form>
  </div>
  <script src="https://unpkg.com/vue@2.6.12/dist/vue.js"></script>
  <script src="https://unpkg.com/element-ui@2.15.7/lib/index.js"></script>
  <script>
    new Vue({
      el: '#app',
      data() {
        return {
          company: '',
          product: '',
          companies: [
            { label: '腾讯', value: 'tencent' },
            { label: '百度', value: 'baidu' },
            { label: '阿里', value: 'alibaba' }
          ],
          products: [
            { label: 'QQ', value: 'qq', company: 'tencent' },
            { label: '微信', value: 'wechat', company: 'tencent' },
            { label: '钉钉', value: 'dingtalk', company: 'alibaba' },
            { label: '淘宝', value: 'taobao', company: 'alibaba' },
            { label: '百度网盘', value: 'baidunetdisk', company: 'baidu' },
            { label: '百度输入法', value: 'baiduinput', company: 'baidu' }
          ]
        };
      },
      created() {
        this.products.forEach(item => item.display = true)
      },
      methods: {
        // 选择公司
        handleChange1(value) {
          // 根据公司过滤产品,用 forEach 过滤
          this.products.forEach(item => item.display = item.company == value)
          // 重置产品
          this.product = '';
        },
        // 选择产品
        handleChange2(value) {
          // 找到选中的那一项
          const findProduct = this.products.find(item => item.value === value);
          // 把这一项的对应的公司,赋值给 company(注意:这里要加个判断,不然undefined 再取值会报错)
          if(findProduct){
            this.company = findProduct.company;
          }
        },
        resetForm() {
          this.company = '';
          this.product = '';
          this.products.forEach(item => item.display = true)
        }
      }
    });
  </script>
</body>

</html>

实现效果如下:

这样一来,该有的功能就都实现了,用户体验也会比好很多。如果只需要选择产品的话,可以试试级联选择器,改天我写一篇关于级联选择器的文章。

总结

即使面对一个小案例,实现起来也可能存在一些细节需要注意。稍不留神,就有可能出现各种问题。本文根据我个人在实际业务场景中的需求,设计了一个小案例作为模拟。希望通过这个案例的分享能够为你提供一些帮助和启发。愿这个案例也能够激发更多类似的实际应用场景的思考和探讨。


我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
跟朋友聊了下,其实在产品下拉选项里面,用 v-for 里面写 filter 更简单一些,这样就不需要 template 和额外的 display 属性了。
跟朋友聊了下,其实在产品下拉选项里面,用 v-for 里面写 filter 更简单一些,这样就不需要 template 和额外的 display 属性了。
回复回复1举报
推荐阅读
编辑精选文章
换一批
JS如何使用隐藏控件为表单添加参数
在一些前端动态网页的表单里,并不是所有的参数都需要填写或选择,有些需要隐藏起来,然后跟着小单一起提交传递给后台,发送到服务器端
itclanCoder
2023/02/26
11.2K0
JS如何使用隐藏控件为表单添加参数
el-select选中变色及百分比怎么做
1.A思路:用的是获取dom节点,每切换一次就获取dom节点,然后给它变色;但是这样子的缺点就是有时候切换就会不显示颜色,这个原因是它捕获不到最新的dom节点。 2.B思路:用的vue里面的:class,并且就是设置一个变量,如果这个变量为true就是红色,否则就是false黄色,但是这样子不能正确显示百分比出来。 3.C思路:就是在外面蒙一层div,设置宽度和颜色为变量,定义一个函数,在改变下拉框的时候调用函数并且传入参数。
程序媛夏天
2024/01/18
2820
el-select选中变色及百分比怎么做
vue实现下拉框二级联动效果
数据格式不一定和上面的一样,我上一篇文章是把这个数据格式用在了树形控件上面,这里放在二级联动上面。
别团等shy哥发育
2023/02/25
3.8K1
vue实现下拉框二级联动效果
vue-element怎么给select下拉框赋值?
看文档真的是一件非常快乐的事情,看别人写的代码,再跟自己写的代码一对比,立刻会发现有很多不同的地方,也可以学到很多新技能,从最简单的阅读学习起来,今天看的是select下拉框相关的。
王小婷
2020/10/14
5.1K0
VUE下拉框双向联动
在开发前端页面的时候,常常需要写下拉框,普通常见的下拉框有在页面写死固定值的下拉框,有通过调用后台接口服务而获取的值列表等。无论是原始的jsp页面html页面等,还是现在流行的vue angluar.js等,逻辑都是一样。但是大多数时候我们只需要开发一个下拉框即可,本文讲解VUE页面中,通过实际案例场景讲解多个下拉框如何实现双向动态联动效果。
程序大视界
2022/09/22
2K1
两个Select选择器实现联动(vue+element)
1.需求:点击某个设备组获取该设备组的所有的商品。 2.效果图 47acf6e9eadfd45156ea1e82bc73fda6b27.jpg 3e4432180dd2cfb058e0315749b1c6caea0.jpg 3.实现: (1)前端 <el-select v-model="listQuery.groupId" @change="selectGoodsByGroupId($event)" clearable placeholder="请选择设备组" filterable> <el
用户6493868
2022/03/08
6.4K0
前端表单输入框自动填充和覆盖逻辑的实现
你好,我是喵喵侠。在Web开发中,动态表单的联动操作,是非常常见的需求,尤其是在需要实现复杂逻辑时,更是不可或缺。正好我在工作中,好几次遇到了输入框内容需要被填充的需求,本文将会为你详细介绍这样的需求案例,展示具体实现的思路和实战代码。
喵喵侠
2024/06/20
8163
前端表单输入框自动填充和覆盖逻辑的实现
猿实战08——属性库实现之属性关系绑定
属性和属性值,看上去很不起眼,数据粒度也很小,但是正式因为数据粒度小,灵活多变,组织得当可以强有力的区分千变万化的商品。
山旮旯的胖子
2020/09/05
8700
猿实战08——属性库实现之属性关系绑定
【黄啊码】ElementUI从入门到放弃,不会来找我
以上是ElementUI的常规使用代码,来自官网整理,有一些来自自己的小改动,官网地址:Element - The world's most popular Vue UI frameworkElement,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库
黄啊码
2022/01/10
6570
【黄啊码】ElementUI从入门到放弃,不会来找我
vue提交select下拉框选中的值
vue-element-admin 是一个后台前端解决方案,它基于 vue 和 element-ui实现。
王小婷
2021/11/24
5.6K0
vue提交select下拉框选中的值
vue的select下拉框多选项-multiple属性
最近在使用vue-element-admin这个后台管理框架开源模板在做一个管理后台,使用起来其实还挺方便的,大部分的组件源码里面都已经写好了,用的时候只需要把源码拿出来修改修改,也就成了。
王小婷
2020/09/03
10.2K0
vue-element的select下拉框赋值
当我们从后端获取到返回值之后,需要进行一些处理,渲染到前端的界面里面。 但是后端有时候的返回值的数据类型都是不一样的 就那select下拉框赋值来说: 1:当返回值是对象数组的时候 <template> <el-select v-model="value" placeholder="请选择"> <el-option v-for="item in options" :key="item.value" :label="item.label" :va
王小婷
2020/09/27
4.7K0
微服务项目:尚融宝(38)(核心业务流程:申请借款额度(1))
step1:用户在个人中心点击 “立即借款”  (http://localhost:3000/user/borrower)
一个风轻云淡
2022/11/15
4480
微服务项目:尚融宝(38)(核心业务流程:申请借款额度(1))
Element UI el-select 默认选中第一项
思路: v-model的值为当前被选中的el-option的 value 的属性值 <template> <el-select v-model="select" placeholder="请选择"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select
圆圆的冬瓜
2021/08/18
13.1K0
Element UI el-select 默认选中第一项
前端如何借助 AI 工具提升开发效率
大家好,我是喵喵侠。在日新月异的前端开发领域,开发效率的提升显得尤为重要。随着人工智能(AI)技术的不断进步,各种AI工具在前端开发中的应用也越来越广泛。目前市面上的 AI 工具有很多,但基本用法都大差不大。所以在这篇文章,我会告诉你 AI 工具的通用技巧,带你了解如何借助AI工具来提升前端开发效率,并通过实际的业务场景和案例展示这些工具的实际应用效果。
喵喵侠
2024/06/07
1.1K2
前端如何借助 AI 工具提升开发效率
vue3+element plus实现查询条件展开和收起功能
如图所示,这样一个查询页面,上面的条件太多,使得下面的列表展示的空间就变得很小了。所以,需要有一个东西控制,当条件太多时,就展示一个展开/收起按钮,可以控制查询条件的展开和收起。
啦啦啦啦
2023/11/30
1.8K0
vue3+element plus实现查询条件展开和收起功能
Vue+ElementUI 搭建后台管理系统(实战系列四)
使用ElementUI已经有一段时间了,在一边上手开发后台管理系统的同事,也记录了一些笔记,一直都没有时间将这些零零散散的笔记总结起来,整理成一个比较系统详细一点的教程,可以留着以后来看。
王小婷
2021/11/24
1.7K0
Vue+ElementUI 搭建后台管理系统(实战系列四)
vue el-select 默认选中「建议收藏」
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说vue el-select 默认选中「建议收藏」,希望能够帮助大家进步!!!
Java架构师必看
2022/08/18
5.1K0
猿实战12——类目属性之动态绑定
猿实战是一个原创系列文章,通过实战的方式,采用前后端分离的技术结合SpringMVC Spring Mybatis,手把手教你撸一个完整的电商系统,跟着教程走下来,变身猿人找到工作不是问题。更多精彩内容,敬请大家关注公主号猿人工厂,点击猿人养成获取!
山旮旯的胖子
2020/09/14
6900
Element ui select 同时获取value和label的值
html <el-form-item label="单位名称" prop="checkInUnitName"> <el-select v-model="checkInUnitId" class="w440" @change="selectUnitName" placeholder="请选择你的单位名称" > <el-option :label="list.name" :va
用户7043603
2022/02/27
2.7K0
相关推荐
JS如何使用隐藏控件为表单添加参数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档