Vue-动态循环select实现不重复数据

Vue-动态循环select实现不重复数据

在实际使用过程中存在如下需求:

1、存在select下拉框组,由“国家“、”省份”两个下拉框组成,组值为“国家-省份”
2、下拉框“国家”与“省份”存在级联关系
3、下拉框组可能存在一个或多个,必须实现动态增减
4、不允许重复的下拉框组,如出现了“中国-广东”,则后续下拉框,不应出现选项值“广东”,避免重复组值出现

效果如下图


效果图

实现思路如下:

1、前端下拉框组框架实现,即创建两个select
2、下拉框组数据绑定,即给select绑定数据,并实现级联
3、实现下拉框组的动态增减,即增加事件的实现下拉框组的增减
4、实现下拉框组数据的,即对下拉框组数据做筛选

具体实现

1、 前端下拉框组框架实现,即创建两个select

`
    <el-form :model="formInline">
        <div v-for="(area,index) in formInline.areas">
                <el-select v-model="area.region">
                    <el-option v-for="item in area.regions" :value="item.code" :label="item.sortName"/>
                </el-select>
            </el-form-item>
            <el-form-item label="省" >
                <el-select v-model="area.province" >
                    <el-option v-for="item in area.provinces" :label="item.sortName"/>
                </el-select>
            </el-form-item>
        </div>
        <div class="add">
            <i class="el-icon-circle-plus-outline" @click="addAreaQuota()"></i>
        </div>
    </el-form>

`

说明:formInline数据格式如下

    formInline:{
        areas:[
            {
                region:"xxxxxx",//国家代码
                regions:[
                    {code:"xxxxxx",sortName:"中国"},
                    {code:"xxxxxx",sortName:"日本"}
                ],
                province:"xxxxx",//省份代码
                provinces:[
                    {code:"xxxxxx",sortName:"广东"},
                    {code:"xxxxxx",sortName:"广西"}
                ]
            }   
        ]
    }
    -------------------------------------------
    备注:formInline已定义在data中
    data(){
        return{
            formInline:{}
        }
    }

2、下拉框组数据绑定,即给select绑定数据,并实现级联

对代码进行改进,具体如下
a、国家下拉框增加change事件 getCode(area.region,index)

<el-form :model="formInline">
        <div v-for="(area,index) in formInline.areas">
                <!--添加change事件-->
                <el-select v-model="area.region" @change="getCode(area.region,index)">
                    <el-option v-for="item in area.regions" :value="item.code" :label="item.sortName"/>
                </el-select>
            </el-form-item>
            <el-form-item label="省" >
                <el-select v-model="area.province" >
                    <el-option v-for="item in area.provinces" :label="item.sortName"/>
                </el-select>
            </el-form-item>
        </div>
        <div class="add">
            <i class="el-icon-circle-plus-outline" @click="addAreaQuota()"></i>
        </div>
    </el-form>

---------------------------------------------------------------------------------
getCode(area.region,index)实现如下

//省级联动方法
getCode(code,index) {
    this.$fetchNo(GetProvinveUrl, { parentCode: code }).then((response) => {
        if (response.status == 1000) {

            //response.data返回指定国家的省份数据格式如下
            //[{code:"xxxxxx",sortName:"广东"},{code:"xxxxxx",sortName:"北京"}]

            this.formInline.areas[index].provinces = response.data;
        }
    }, err => {
        this.$message.error(err);
    });
}

3、实现下拉框组的动态增减,即增加事件的实现下拉框组的增减

<el-form :model="formInline">
        <div v-for="(area,index) in formInline.areas">
                <el-select v-model="area.region" @change="getCode(area.region,index)">
                    <el-option v-for="item in area.regions" :value="item.code" :label="item.sortName"/>
                </el-select>
            </el-form-item>
            <el-form-item label="省" >
                <el-select v-model="area.province" >
                    <el-option v-for="item in area.provinces" :label="item.sortName"/>
                </el-select>
            </el-form-item>
            <!--增加删除按钮-->
            <el-form-item>
                <i class="el-icon-delete" @click="deleteAreaQuota(area, index)"></i>
            </el-form-item>
        </div>
        
        <!--增加删除按钮-->
        <div class="add">
            <i class="el-icon-circle-plus-outline" @click="addAreaQuota()"></i>
        </div>
    </el-form>

    --------------------------------------------

    deleteAreaQuota实现如下

    deleteAreaQuota(item, index) {
            this.formInline.areas.splice(index, 1);
        }

    ++++++++++++++++++++++++++++++++++++++++++++++

    addAreaQuota实现如下

    addAreaQuota(){
        that.$fetchNo(GETREGIONUrl, formData).then((response) => {
            if (response.status == 1000) {
                var data = {
                    region: "156000000000",//默认中国
                    regions: response.data.countries,//国家列表
                    province: "", //省份
                    provinces: response.data.provinces //省份列表,默认是中国的省份
                };

                that.formInline.areas.push(data);

            } else {
                this.$message.error(response.message);
            }
        }, err => {
            this.$message.error(err);
        });
        
    }

4、实现下拉框组数据的,即对下拉框组数据做筛选

<el-form :model="formInline">
        <div v-for="(area,index) in formInline.areas">
                <el-select v-model="area.region" @change="getCode(area.region,index)">
                    <el-option v-for="item in area.regions" :value="item.code" :label="item.sortName"/>
                </el-select>
            </el-form-item>
            <el-form-item label="省" >
                <el-select v-model="area.province" >
                    <!--添加显示隐藏逻辑,使用v-show-->
                    <!--area.province==item.code 表示有初始值时,则显示该值,无初始值时使用下面规则-->
                    <!--!formInline.areas.find(t=>t.province==item.code) 表示需要展示的数据不存在于已选列表-->
                    <el-option v-for="item in area.provinces"  v-show="area.province==item.code || !formInline.areas.find(t=>t.province==item.code)" :label="item.sortName"/>
                </el-select>
            </el-form-item>
            <!--增加删除按钮-->
            <el-form-item>
                <i class="el-icon-delete" @click="deleteAreaQuota(area, index)"></i>
            </el-form-item>
        </div>
        
        <!--增加删除按钮-->
        <div class="add">
            <i class="el-icon-circle-plus-outline" @click="addAreaQuota()"></i>
        </div>
    </el-form>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容