watch深度监听(对象内部属性监听),级联筛选

2020-06-06  本文已影响0人  幸宇

需求:表单下拉选择框中做级联监听;


image.png

1、给需要级联的学期绑定disabled属性,需要一进来之后是不可选择的,只有年级做出选择后,学期可选

<form-item label="选择学期" prop="termId" ref="term">
            <i-select v-model="formValidate.termId" v-bind:disabled="isAble"  placeholder="请选择学期" ref="store">
                <i-option v-for="item in data_term" :value="item.value" :key="item.value">{{item.label}}</i-option>
            </i-select>
        </form-item>

2、监听表单字段,深度监听内部属性,即年级字段

watch: {
          formValidate:{  
                handler:function(val,oldval){  
                      
                },  
                deep:true//对象内部的属性监听,也叫深度监听  
            }, 
            
            'formValidate.gradeId':function(val,oldVal){ //监听年级id筛选级联学期选择
                // console.log('val',val,'oldval',oldVal,this.data_grade);
                let curLabel = ''
                this.data_grade.map((item,index)=>{
                    if(val == item.value){
                        curLabel = item.label
                    }
                })
                // console.log('curLabel',curLabel,'catchTerm',this.catchTerm);
                let cur_data_term = [];
                this.catchTerm.map((item,index)=>{
                    if(item.label.indexOf(curLabel)!==-1){
                        cur_data_term.push(item)
                    }
                });
                // console.log('nnnn',cur_data_term);
                this.data_term = cur_data_term;
                this.isAble = false;
            }
        },

附上全部代码:

<template>
    <i-form ref="formValidate" :model="formValidate" :rules="ruleValidate" :label-width="80">
       
        <form-item label="选择年级" prop="gradeId" ref="grade">
            <i-select v-model="formValidate.gradeId" placeholder="请选择年级" :label-in-value="true" @on-change="selectGrade($event)">
                <i-option v-for="item in data_grade" :value="item.value" :key="item.value">{{item.label}}</i-option>
            </i-select>
        </form-item>

        <form-item label="选择学期" prop="termId" ref="term">
            <i-select v-model="formValidate.termId" v-bind:disabled="isAble"  placeholder="请选择学期" ref="store">
                <i-option v-for="item in data_term" :value="item.value" :key="item.value">{{item.label}}</i-option>
            </i-select>
        </form-item>
    
        <form-item class="grade-btn">
            <Button type="primary" @click="handleSubmit('formValidate')">提交</Button>
            <!-- <Button @click="handleReset('formValidate')" style="margin-left: 8px">Reset</Button> -->
        </form-item>
    </i-form>
    
</template>
<script>
import stateGradeSemester from '@/store/datajs/stateGradeSemester';
import {SetUserGradeTemId,getUserLevel} from '@/api/user';
    export default {
        data () {
            const validatePass = (rule, value, callback) => {
                if(value.length<1){
                    callback(new Error('请选择年级'));
                }else{
                    callback();
                }
            };
            const validateTem = (rule,value,callback)=>{
              
                if(value.length<1){
                    callback(new Error('请选择学期'));
                }else{
                    callback();
                }
            }
            return {
                formValidate: {
                    gradeId:'',
                    termId:''
                },
                ruleValidate: {
                    gradeId: [
                        {required: true,validator: validatePass, trigger: 'change' }
                    ],
                    termId:[
                        { required: true, validator: validateTem, trigger: 'change' }
                    ]
                },
                isAble:true,
                catchTerm:[]

            }
        },
        watch: {
          formValidate:{  
                handler:function(val,oldval){  
                      
                },  
                deep:true//对象内部的属性监听,也叫深度监听  
            }, 
            
            'formValidate.gradeId':function(val,oldVal){ //监听年级id筛选级联学期选择
                // console.log('val',val,'oldval',oldVal,this.data_grade);
                let curLabel = ''
                this.data_grade.map((item,index)=>{
                    if(val == item.value){
                        curLabel = item.label
                    }
                })
                // console.log('curLabel',curLabel,'catchTerm',this.catchTerm);
                let cur_data_term = [];
                this.catchTerm.map((item,index)=>{
                    if(item.label.indexOf(curLabel)!==-1){
                        cur_data_term.push(item)
                    }
                });
                // console.log('nnnn',cur_data_term);
                this.data_term = cur_data_term;
                this.isAble = false;
            }
        },
        created () {
            // console.log(stateGradeSemester,'ddddd');
            let data_grade = [];
            let data_term = [];
            let data_catch = [];
            stateGradeSemester.stateGradeSemester.map((item,index)=>{
                item.grade.map((g_item,g_index)=>{
                    data_grade.push({
                        value:g_item.id,
                        label:g_item.name
                    })
                })

                item.term.map((t_item,t_index)=>{
                    data_term.push({
                        value:t_item.id,
                        label:t_item.name
                    });
                    data_catch.push({
                        value:t_item.id,
                        label:t_item.name
                    })
                })
            });

            this.data_grade = data_grade;
            this.data_term = data_term;
            this.catchTerm = data_catch;
        },
        methods: {
            handleSubmit (name) {
                // console.log('点击提交。。。。',);
                if(this.formValidate.termId == undefined){
                    this.$Message.error('请选择学期')
                }
                this.$refs[name].validate((valid) => {
                    // console.log(valid)
                    if (valid) {
                        console.log('this.fromValidate.....',this.formValidate)
                        this.$Message.success('提交成功!');
                        //提交成功后提交用户信息
                        let obj = {
                            currId:this.$store.state.currId,
                            currNickName:this.$store.state.currNickName,
                            gradeId:this.formValidate.gradeId,
                            termId:this.formValidate.termId
                        }

                        let objId = {
                            userId:this.$store.state.currId,
                            termId:this.formValidate.termId,
                            gradeId:this.formValidate.gradeId
                        }
                        
                        //更改用户信息
                        SetUserGradeTemId(objId)
                        .then(response=>{
                            console.log(response.data)
                            getUserLevel(this.$store.state.currId).then(res => {
                                console.log(res,'dddddd');
                                let studentInfo = {
                                    studentId: this.$store.state.currId,
                                    level: res.data.student.level,
                                    goldCount: res.data.student.gold_count
                                };
                                this.$store.commit("SET_GOLD",studentInfo);
                                this.$store.dispatch('setusergrade',obj);
                            });
                        });

                        //提交后返回主页面
                        this.$emit('input',false)

                    } else {
                        this.$Message.error('信息不能为空!');
                    }
                })
            },
            handleReset (name) {
                this.$refs[name].resetFields();
            },
            selectGrade(value){
               
                // console.log(this.$refs['grade'].$el.classList);
                // console.log(this.formValidate)
                // this.$nextTick(()=>{
                //     this.formValidate.model1=value.value;
                // })
                // if(value.label){
                //     let arrClass = this.$refs['grade'].$el.classList;
                //     arrClass.remove('ivu-form-item-error')
                //     console.log(this.$refs['grade'].$el.classList,this.$refs['grade'].$el.children[1].children[1].remove());
                // }

                //    if(value.label){
                //        console.log(this.data_term);
                //        let arr = [];
                //        this.data_term.map(item=>{
                //           if(item.label.indexOf(value.label)!==-1){
                //               arr.push(item)
                //           }
                //        });
                //        this.data_term = arr;
                //    }
            }
        }
    }
</script>

上一篇下一篇

猜你喜欢

热点阅读