Vue - @change应用实现下拉框联动功能

需求:目前列表页面上有两个下拉框类型和模板,分别默认查询所有数据。用户需要在选择类型时,刷新并过滤模板下拉框的数据,此处我们需要用到change事件。

在 Vue.js 中,@change 是用于监听表单元素值变化的事件处理器,常与 v-model 搭配,实现数据的双向绑定。它的触发时机与 @input 不同,@change 只会在值改变且元素失去焦点(或按下回车)时触发,非常适合处理用户输入的最终确认逻辑。

一、准备工作

1.下载vscode

2.下拉代码

3.下载项目依赖:打开终端【ctrl + · 】,执行:npm i

4.执行项目:npm run dev

5.访问页面:http://localhost:端口号

二、原代码分析

1.根据【页面地址】或【菜单名称】,查询到对应的js文件

2.再根据component获得vue文件路径

3.vue文件中:

(1)template下是样式,通过可以找到对应的下拉框数据源定义是models

(2)data(){}下是字段定义,其中定义了models:\[\]是空数组

(3)methods:{}下是方法调用,在其中找到了models的赋值方法:getDictList,目前是无参调用的modelList接口

原代码:

javascript 复制代码
<template>
...
 <el-col :span="6">
                <el-form-item label="类型">
                  <el-select v-model="listquery.model.type" placeholder="请选择类型" clearable size="mini" style="width:95%">
                    <el-option v-for="item in types" :key="item.key" :label="item.value" :value="item.key" />
                  </el-select>
                </el-form-item>
              </el-col>
              <el-col :span="6">
                <el-form-item label="模版">
                  <el-select v-model="listquery.model.templateCode" placeholder="请选择模版" clearable size="mini" style="width:95%">
                    <el-option v-for="item in models" :key="item.templateCode" :label="item.templateName" :value="item.templateCode" />
                  </el-select>
                </el-form-item>
              </el-col>
...
</template>
<script>
...
// 引入模板列表方法 (js文件)
import { modelList } from '@/api/model'
...
export default {
data() {
listquery: {
        currentPage: 1,
        map: {},
        model: {
          templateCode: '',
          type: '',
        },
        pageSize: 10
      },
 models:[],
 types:[]
},
methods: {
// ...

getDictList () { // 获取字典表
      modelList({}).then(res => {
        if (res.data.isSuccess) {
          this.models = res.data.data
        }
      })
    }
//...
}
javascript 复制代码
// src/api/model.js
import request from '@/utils/request'

// 模板列表
export function modelList(data) {
returnrequest({
url:'/system/model/modelList',
method:'post',
data
})
}
}
...

三、代码改造

1.新增change事件:在选择类型时触发

2.新增含参的模板下拉数据查询方法

3.在getDictList中调用无参的模板下拉方法

javascript 复制代码
<template>
...
// modify:增加@change事件
 <el-col :span="6">
                <el-form-item label="类型">
                  <el-select v-model="listquery.model.type" placeholder="请选择类型" clearable size="mini" style="width:95%" @change="changeTemplateType>
                    <el-option v-for="item in types" :key="item.key" :label="item.value" :value="item.key" />
                  </el-select>
                </el-form-item>
              </el-col> 
...
</template>
...
<script>
methods: {
// ...
getDictList () { // 获取字典表
   /**   modelList({}).then(res => {
        if (res.data.isSuccess) {
          this.models = res.data.data
        }
      })
      */
  // modify:获取全部模板数据(不传类型参数)
  this.getModelList('')
},
/**
  * add :短信类型变化
 */
 changeTemplateType(val) {
      // 短信类型change
      this.listquery.model.templateCode = ''
     // 当类型变化时,获取模板下拉数据
     this.getModelList(val)
    },
 /**
  *add: 获取模板下拉数据
 */
 getModelList(type) {
      const params = {}
      // 如果选择了类型则传入参数,否则不传
      if (type) {
        params.type = type;
      }
      modelList(params).then(res => {
        const {data: {data, code }} = res
        if (code === 0) {
          this.risks = res.data.data
				 // 若需要对结果进行进一步过滤
				 // this.riskTypes = res.data.data.filter(item => item.key === '1')
        }
      })
    },

//...
}
相关推荐
追逐时光者13 分钟前
别再满网找零散工具了,腾讯 QQ 浏览器这个“帮小忙”工具箱真能省时间
前端·后端
如果超人不会飞14 分钟前
脉络清晰的业务演进:TinyVue Timeline 时间线组件全方位实战指南
vue.js
如果超人不会飞16 分钟前
从扁平到立体:掌握 TinyVue Grid 树形表格的高级实战指南
vue.js
To_OC2 小时前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
Asmewill2 小时前
grep&curl命令学习笔记
前端
stringwu2 小时前
Flutter 开发必备:MVI 架构的高效实现指南
前端·flutter
用户2136610035723 小时前
Vue2组件化开发与父子通信
前端·vue.js
Momo__4 小时前
TypeScript satisfies 操作符——比 as 更安全的类型守门员
前端·typescript
用户2136610035724 小时前
Vue2事件系统与指令进阶
前端·vue.js
labixiong4 小时前
实现一个能跑的迷你版Promise(一)
前端·javascript·面试