在Vue中如何根据下拉框选中的值 展示不同的输入框

大纲:

      🌳  1、怎么根据下拉框中选中的值展示不同的输入框呢?
        我们可以使用change事件来进行处理。当我们选中收费类型的其中一个就触发change事件,然后根据选中的value值,对数据进行展示与隐藏 即可。
      🥑  收费类型分为三种,即按天 按分钟 按次收费,而我们需要根据不同的收费类型展示类型中的数据。
        🟢1 按天收费:freeTime(免收分钟)、dayMaxPrice(每日最高金额)
     
        🟢2 按分钟收费:freeTime(免收分钟)、startPrice(起步金额)、startTime(起步分钟)、dayUnitTime(超/分钟)、dayUnitPrice(超/分钟 收费金额)
  
        🟢3 按次收费:unitPrice(每次收费金额)
        按天按分钟收费 共用字段:freeTime(免收分钟)


  代码展示:

<template>
    <avue-crud :option="option" :data="data" :page.sync="page" v-model="form" ref="crud" @search-change="searchChange" @search-reset="searchReset" @current-change="currentChange" @size-change="sizeChange" @row-save="rowSave" @row-del="rowDel">
    </avue-crud>
</template>

<script>
  import API from '@/components/common/Api';
  export default {
    data() {
      return {
        /* data:[]后端获取到的数据列表。option表格配置项.form 表单*/
        data: [],
        page: {
          total: 0, //总页码
          pageNo: 1, //页码
          pageSize: 10 //分页条数
        },
        form: {
          carParkType: '',
          carParkTypeId: '',
          rulesDetail: '',
          rulesName: '',
        },
        query: {}, //搜索键值
        option: {
          size: 'mini', //表格大小 medium/small/mini
          index: true, //序号
          border: true,
          searchMenuSpan: 4, //栅格占据的列数
          labelWidth: 160,
          searchLabelWidth: 120,
          viewBtn: true, //查看详情按钮
          delBtn: true, //删除按钮
          stripe: true, //斑马纹
          align: 'center',
          column: [{
              label: '车场名称', //表头
              prop: 'carParkName', //键值
              disabled: true,
              rules: [{
                required: true,
                message: "请输入车场名称",
                trigger: "blur",
              }, ],
            }, {
              label: '规则名称', //表头
              prop: 'rulesName', //键值
              search: true, //是否搜索
              rules: [{
                required: true,
                message: "请输入规则名称",
                trigger: "blur",
              }, ],
            }, {
              label: '收费类型', //表头
              prop: 'chargeTypeId', //键值
              type: 'select',
              search: true, //是否搜索
              dicData: [],
              props: {
                label: "name",
                value: "id",
              },
              rules: [{
                required: true,
                message: "请选择收费类型",
                trigger: "blur",
              }, ],
              change: (e) => {
                this.onChangeType(e)
              }
            }, {
              label: '汽车类型', //表头
              prop: 'carTypeId', //键值
              search: true, //是否搜索
              type: 'select',
              dicData: [],
              props: {
                label: "carTypeName",
                value: "carTypeId",
              },
              rules: [{
                required: true,
                message: "请选择汽车类型",
                trigger: "blur",
              }, ],
            }, {
              label: '车牌颜色', //表头
              prop: 'carPlateColorId', //键值
              search: true, //是否搜索
              type: 'select',
              dicUrl: "/api/dictionary/selectByType?type=car_color_type",
              props: {
                label: "name",
                value: "id",
              },
              rules: [{
                required: true,
                message: "请选择车牌颜色",
                trigger: "blur",
              }, ],
            }, {
              label: '节假日是否免费', //表头
              prop: 'festivalsFree', //键值
              type: 'select',
              dicData: [{
                label: '是',
                value: 1
              }, {
                label: '否',
                value: 2
              }]
            }, {
              label: '规则详情', //表头
              prop: 'rulesDetail', //键值
              type: 'textarea',
              row: true,
              disabled: true,
            },
            // 收费规则共用字段
            {
              label: '免收分钟', //表头
              prop: 'freeTime', //键值
              type: 'number',
              min: 0,
              display: false,
              rules: [{ required: true,message:"请输入免收分钟",trigger: "blur"}],
            },
            // 按天收费
            {
              label: '每日最高金额', //表头
              prop: 'dayMaxPrice', //键值
              type: 'number',
              min: 0,
              display: false,
              rules: [{required: true,message:"请输入每日最高金额",trigger: "blur"}],
            },
            // 按分钟收费
            {
              label: '起步金额', //表头
              prop: 'startPrice', //键值
              type: 'number',
              min: 0,
              display: false,
              rules: [{required: true,message:"请输入起步金额",trigger: "blur"}],
            }, {
              label: '起步分钟', //表头
              prop: 'startTime', //键值
              type: 'number',
              min: 0,
              display: false,
              rules: [{required: true,message:"请输入起步分钟",trigger: "blur"}],
            }, {
              label: '超/分钟', //表头
              prop: 'dayUnitTime', //键值
              type: 'number',
              min: 0,
              display: false,
              rules: [{required: true,message:"请输入超时分钟",trigger: "blur"}],
            }, {
              label: '超/分钟 收费金额', //表头
              prop: 'dayUnitPrice', //键值
              type: 'number',
              min: 0,
              display: false,
              rules: [{required: true,message:"请输入超时分钟收费金额",trigger: "blur"}],
            },
            // 按次收费
            {
              label: '每次收费金额', //表头
              prop: 'unitPrice', //键值
              type: 'number',
              min: 0,
              display: false,
              rules: [{required: true,message:"请输入每次收费金额",trigger: "blur"}],
            },
          ]
        },
        dicData: [],
      }
    },
    mounted() {
      this.form.carParkId = +this.$route.query.id
      this.form.carParkName = this.$route.query.name
      this.onLoad()
      //获取汽车类型
      this.getcarTypeList()
    },
    methods: {
      //搜索 val为搜索对象 val{} done() 停止
      searchChange(val, done) {
        this.query = val
        this.onLoad()
        done()
      },
      //重置
      searchReset() {
        this.query = {}
        this.onLoad()
      },

      // 根据接口获取data数据
      async onLoad() {
        let params = {
          data: {
            ...this.query,
            carParkId: +this.$route.query.id || ''
          },
          pageNum: this.page.pageNo,
          pageSize: this.page.pageSize,
        }
        await API.getParkingFeeList(params).then(res => {
          if (res.data.code == 0) {
            this.data = res.data.data.list;
            this.page.total = res.data.data.total;
          } else {
            this.$message({
              type: 'error',
              message: res.data.msg
            });
          }
        })
      },

      // 分页条数
      sizeChange(val, done) {
        this.page.pageSize = val;
        this.onLoad();
        done();
      },
      // 分页选择
      currentChange(val) {
        this.page.pageNo = val;
        this.onLoad();
      },

      // 新增数据保存
      rowSave(form, done, loading) {
        API.getParkingFeeAdd(form).then(res => {
          if (res.data.code == 0) {
            done(form);
            this.onLoad()
          } else {
            this.$message({
              type: 'error',
              message: res.data.msg
            });
            done(form);
            this.onLoad()
          }
        })
      },
      // 删除
      rowDel(val) {
        this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            API.getParkingFeeDel(val.id).then(res => {
              if (res.data.code === 0) {
                this.onLoad()
              } else {
                this.$message({
                  type: 'error',
                  message: res.data.msg
                });
              }
            });
          }).catch(() => {});
      },

      //获取汽车类型 收费规则类型
      getcarTypeList() {
        API.getcarTypeInfo().then(res => {
          if (res.data.code === 0) {
            this.option.column[3].dicData = res.data.data;
          }
        })

        API.xhtp({
          method: "get",
          url: '/api/dictionary/selectByType?type=charge_type'
        }).then(res => {
          if (res.data.code === 0) {
            this.option.column[2].dicData = res.data.data;
          }
        })
      },
      //收费类型
      onChangeType(e) {
        //根据value值判断选中收费类型的规则详情
        e.column.dicData.forEach(item => {
          if (e.value === item.id) { //规则详情赋值
            this.form.rulesDetail = item.describe
          }
        })
       
        //根据value(id)值 判断是否展示列表
        if (e.value == 26) { // 按次收费
          this.option.column.forEach(item => {
            if (item.prop === 'unitPrice') {
              item.display = true
            } else if (item.prop === 'dayMaxPrice' || item.prop === 'freeTime' ||
              item.prop === 'startPrice' || item.prop === 'startTime' || item.prop === 'dayUnitTime' || item
              .prop === 'dayUnitPrice') {
              item.display = false
            }
          })
        } else if (e.value == 27) { // 按分钟收费
          this.option.column.forEach(item => {
            if (item.prop === 'freeTime' || item.prop === 'startPrice' || item.prop === 'startTime' || item
              .prop === 'dayUnitTime' || item.prop === 'dayUnitPrice') {
              item.display = true
            } else if (item.prop === 'dayMaxPrice' || item
              .prop === 'unitPrice') {
              item.display = false
            }
          })
        } else if (e.value == 28) { // 按天收费
          this.option.column.forEach(item => {
            if (item.prop === 'freeTime' || item.prop === 'dayMaxPrice') {
              item.display = true
            } else if (item.prop === 'startPrice' ||
              item.prop === 'startTime' || item.prop === 'dayUnitTime' || item.prop === 'dayUnitPrice' || item
              .prop === 'unitPrice') {
              item.display = false
            }
          })
        }
      },

    }
  }
</script>

<style>
</style>

实现步骤:

 1、我们先调收费类型接口 获取收费类型的数据,然后给收费类型中加一个change事件;

打印看看e里面的内容是什么。

由图可知,e里面有value值(实际上就是选中类型的Id)、一些数据,而我们真正需要的数据就是dicData数组里边的数据【describe(规则详情) 、name(收费类型)】


  2、将按次、按天、按分钟收费需要展示的字段都先定义在options中,给展示的字段一个默认的初始值(display 是否显示) display: false;我们就让他默认隐藏。


 3、写一个专门判断选中类型的方法,通过 e.value 来判断选中的那个收费类型从而进行判断,遍历option.column,修改对应的属性值的状态,是否显示或隐藏。


 4、在change事件中调用判断选中类型的方法,change: (e) => {  this.onChangeType(e) }

 5、测试是否有效果


!!!注意:一定要给设置字段初始值(display: 'false'),不然的话判断了显示与隐藏也没效果 


 效果图:

        按次收费

         按分钟收费

        按天收费 


 视频效果展示:

收费规则

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vue 实现下拉框二级联动,可以采用以下步骤: 1. 定义两个数组,一个存储一级选项的数据,一个存储二级选项的数据。 2. 在模板使用 v-for 遍历一级选项数组,生成一级选项的下拉框。同时,绑定一个 change 事件,当一级选项改变时触发事件。 3. 在 change 事件,获取当前选中的一级选项的,根据这个从二级选项数组筛选出对应的数据,生成二级选项的下拉框。 4. 在二级选项的下拉框同样绑定一个 change 事件,当二级选项改变时触发事件。可以在此事件获取一级选项和二级选项的,进行其他操作。 以下是一个示例代码: ```html <template> <div> <select v-model="selectedOption1" @change="handleChangeOption1"> <option value="">请选择一级选项</option> <option v-for="option in options1" :value="option">{{ option }}</option> </select> <select v-model="selectedOption2" @change="handleChangeOption2"> <option value="">请选择二级选项</option> <option v-for="option in options2" :value="option">{{ option }}</option> </select> </div> </template> <script> export default { data() { return { options1: ['选项1', '选项2', '选项3'], options2: { '选项1': ['选项1-1', '选项1-2', '选项1-3'], '选项2': ['选项2-1', '选项2-2', '选项2-3'], '选项3': ['选项3-1', '选项3-2', '选项3-3'], }, selectedOption1: '', selectedOption2: '', }; }, methods: { handleChangeOption1() { this.selectedOption2 = ''; if (this.selectedOption1) { this.options2 = this.options2[this.selectedOption1]; } else { this.options2 = {}; } }, handleChangeOption2() { console.log('一级选项:', this.selectedOption1); console.log('二级选项:', this.selectedOption2); }, }, }; </script> ``` 在这个示例代码,options1 存储的是一级选项的数据,options2 存储的是二级选项的数据,使用对象来存储每个一级选项对应的二级选项数据。 在 handleChangeOption1 方法,根据当前选中的一级选项的,筛选出对应的二级选项数据并赋给 options2。如果当前选中的一级选项的为空,则清空 options2。 在 handleChangeOption2 方法,获取当前选中的一级选项和二级选项的,可以进行其他操作。 在模板,使用 v-model 绑定选中,使用 v-for 遍历选项数组生成下拉框。同时,使用 @change 绑定 change 事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值