vue表单控件的联动实现

临近过年,假期前两天,用 Vue Element 写后台管理页面,记录下来,方便查看。
需求:实现联动效果,重跑类型 选择 按任务ID -> TaskId 文本框显示;选择 按任务类型 -> 任务类型。
1)弹框布局

<template>
    <div>
        <el-dialog title="手动重跑任务" :visible.sync="dialogHandleTask" width="60%">
            <el-form ref="queryForm" :rules="handleJobRulesForm" :model="queryForm" size="medium" label-width="20%">
                <el-form-item label="重跑类型:" prop="handleType">
                    <el-select v-model="queryForm.handleType" placeholder="请选择重跑类型" style="width: 40%;">
                        <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" >
                        </el-option>
                    </el-select>
                </el-form-item>
                <el-form-item label="TaskId:" prop="taskId" > 
                    <el-input v-model="queryForm.taskId" placeholder="请输入TaskId" style="width: 40%;" clearable></el-input>
                </el-form-item>
                <el-form-item label="任务类型:" prop="taskPeriod" >
                    <el-select v-model="queryForm.taskPeriod"  placeholder="请选择任务类型" style="width: 40%;">
                <el-option v-for="item in allTaskPerod" :key="item.value" :label="item.label" :value="item.value"></el-option>
                </el-select>
                </el-form-item>
            </el-form>
            <span slot="footer" class="dialog-footer">
                <el-button @click="editDialogVisible = false">取 消</el-button>
                <el-button type="primary" @click="eidtUserInfo">确 定</el-button>
            </span>
        </el-dialog>
    </div>
</template>

2)数据定义

return {
	options: [
	    {
	      value: "1",
	      label: "按任务ID"
	    },
	    {
	      value: "2",
	      label: "按任务类型"
	    }
	  ],
	  // 定时任务类型
	  allTaskPerod:[
	    {
	      value: "Y",
	      label: "按年统计"
	    },
	    {
	      value: "M",
	      label: "按月统计"
	    },
	    {
	      value: "D",
	      label: "按日统计"
	    },
	    {
	      value: "H",
	      label: "按小时统计"
	    }
	  ],
	handleJobForm:{
          handleType:'按任务ID',
          taskPeriod:"",
        },
    queryForm: {
        taskId: '',
        taskPeriod: ''
      },
 }

页面布局效果如下图所示。
在这里插入图片描述

方法一、根据 选中的queryForm.handleType 值 v-if 判断

直接在 TaskId 控件任务类型 控件 添加 v-if 判断 根据选中的类型来显示控件。可以实现关联展示,但输入结果后,切换回来,数据仍然存在。

// 数据绑定
<el-form-item label="TaskId:" prop="taskId" v-if="queryForm.handleType == '1'"> 
	<el-input v-model="queryForm2.taskId" placeholder="请输入TaskId" style="width: 40%;" clearable></el-input>
</el-form-item>
<el-form-item label="任务类型:" prop="taskPeriod" v-if="queryForm.handleType == '2'">
	<el-select v-model="queryForm2.taskPeriod"  placeholder="请选择任务类型" style="width: 40%;">
		<el-option v-for="item in allTaskPerod" :key="item.value" :label="item.label" :value="item.value"></el-option>
	</el-select>
</el-form-item>

实现效果如下图所示。
在这里插入图片描述

方法二、v-if + 深度监听

添加事件监听,当控件切换时进行 v-if 赋值,并清空控件中已经选择的值。

// 添加监听
watch:{
        'queryForm':{
        // deep,默认值是 false,代表是否深度监听
          deep:true,
            handler:function(newValue,oldValue){
                if(newValue.handleType == 2 ){
                  this.handleTrue1 = false;
                  this.handleTrue2 = true;
                  this.queryForm2.taskId = "";
                }else{
                  this.handleTrue2 = false;
                  this.handleTrue1 = true;
                  this.queryForm2.taskPeriod = "";
                }
            },
            // immediate:true 代表在wacth里声明后,立即去执行handler方法
            immediate: true
        }
    },

修改 v-if 的配置

// 数据绑定  v-if
<el-form-item label="TaskId:" prop="taskId" v-if="this.handleTrue1"> 
	<el-input v-model="queryForm2.taskId" placeholder="请输入TaskId" style="width: 40%;" clearable></el-input>
</el-form-item>
<el-form-item label="任务类型:" prop="taskPeriod" v-if="this.handleTrue2">
	<el-select v-model="queryForm2.taskPeriod"  placeholder="请选择任务类型" style="width: 40%;">
		<el-option v-for="item in allTaskPerod" :key="item.value" :label="item.label" :value="item.value"></el-option>
	</el-select>
</el-form-item>

切换 按任务ID,显示 TaskId 输入框,可以输入。
在这里插入图片描述

切换到 按任务类型 时,清空上次选择的值。
在这里插入图片描述

vue 中 v-if 和 v-show 的区别
1)实现方式
v-if是动态的向DOM树内添加或者删除DOM元素;
v-show是通过设置DOM元素的display样式属性控制显隐;
2)消耗
v-if有更高的切换消耗;
v-show有更高的初始渲染消耗;
3)编译
v-if是懒加载,在条件第一次变为真时才开始局部编译(编译被缓存后,然后再切换的时候进行局部卸载);
v-show是在任何条件下都被编译,然后被缓存,而且DOM元素保留;

JS三级联动表单 <!-- var arrText = new Array(5); var arrValue = new Array(arrText.length); function objSetOption(select1, select2, select3) { this.select1 = select1; this.select2 = select2; this.select3 = select3; } arrText[0]= new objSetOption("选择1:", "选择2_1:,选择2_2:", "选择3_1:,选择3_2:"); arrText[1] = new objSetOption("论文:1", "语文:1,数学:2,英语:3", "初中:2,高中:3"); arrText[2] = new objSetOption("例题:2", "显示b2_1:值b2_1,显示b2_2:值b2_2", "显示b3_1:值b3_1,显示b3_2:值b3_2"); arrText[3] = new objSetOption("显示c:值c", "显示c2_1:值c2_1,显示c2_2:值c2_2", "显示c3_1:值c3_1,显示c3_2:值c3_2"); arrText[4] = new objSetOption("显示d:值d", "显示d2_1:值d2_1,显示d2_2:值d2_2", "显示d3_1:值d3_1,显示d3_2:值d3_2"); arrText[5] = new objSetOption("显示e:值e", "显示e2_1:值e2_1,显示e2_2:值e2_2", "显示e3_1:值e3_1,显示e3_2:值e3_2"); function select() { var eltSelect1 = document.test.select1; var eltSelect2 = document.test.select2; var eltSelect3 = document.test.select3; var arrSelect1, arrSelect2, arrSelect3; var arrData1, arrData2, arrData3; with(eltSelect1) { var strSelect = options[selectedIndex].value; } for(i = 0;i < arrText.length;i ++) { arrSelect1 = arrText[i].select1; arrData1 = arrSelect1.split(":"); if (arrData1[1] == strSelect) { arrSelect2 = (arrText[i].select2).split(","); for(j = 0;j < arrSelect2.length;j++) { arrData2 = arrSelect2[j].split(":"); with(eltSelect2) { length = arrSelect2.length; options[j].text = arrData2[0]; options[j].value = arrData2[1]; } } arrSelect3 = (arrText[i].select3).split(","); for(j = 0;j < arrSelect3.length;j++) { arrData3 = arrSelect3[j].split(":"); with(eltSelect3) { length = arrSelect3.length; options[j].text = arrData3[0]; options[j].val
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值