Vue+element-ui的el-cascader实现动态添加删除级联地点输入框

这篇具有很好参考价值的文章主要介绍了Vue+element-ui的el-cascader实现动态添加删除级联地点输入框。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Vue+element-ui的el-cascader实现动态添加/删除级联地点输入框

1. 需求

  • 实现省市区三级地点级联选择,可联想;
  • 包括始发地点、途径地点、终止地点,始发地点、终止地点均为一个,途径地点可以没有也可以是多个;
  • 用户可以动态添加/删除途径地点。

2. 场景说明

  • 使用级联选择器Cascader需要的树形数据,前端请求到后端获取省市区数据并处理为elementui官网示例的树形数据格式,如下所示,为节省篇幅树形数据示例只展示部分;文章来源地址https://www.toymoban.com/news/detail-443170.html

    [
        {
            children: [
                {
                    children: [
                        {
                            label: "东城区"
                            value: "110101"
                        },
                        {
                            label: "西城区"
                            value: "110102"
                        },
                        ...
                    ]
                    label: "北京市"
                    value: "110100"
                },
                ...
            ]
            label: "北京市"
            value: "110000"
        },
        ...
    ]
    

3. 实现代码

3.1 表单结构

  <el-form :model="form" ref="form" label-width="110px">
    <el-form-item label="起始地点:" prop="startPoint">
      <el-cascader
        placeholder="请选择地点"
        :options="districtList"
        filterable
        clearable
        v-model="form.startPoint"
        @change="(ele) => {handleChange(ele,'startPoint')}"
        ref="distCascader">
      </el-cascader>
      <el-button
        style="margin-left:10px;"
        type="primary"
        size="small"
        @click="addWayPoint()"
      >添加途经地点</el-button>
    </el-form-item>


    <template v-if="form.wayPointsArr.length > 0">
      <el-row
        v-for="(item, index) in form.wayPointsArr"
        :key="item.key"
      >
        <el-form-item :label="'途径地点' + (index+1) +':'" :prop="'' +index">
          <el-cascader
            placeholder="请选择地点"
            :options="districtList"
            filterable
            clearable
            v-model="item.WAYPOINT"
            @change="(ele) => {handleChange(ele,item.key)}"
            ref="distCascader">
          </el-cascader>
          <el-button
            style="margin-left:10px;"
            type="danger"
            size="small"
            @click="removeWayPoint(index)"
          >删除</el-button>
        </el-form-item>
      </el-row>
    </template>

    <el-form-item label="终止地点:" prop="endPoint">
      <el-cascader
        placeholder="请选择地点"
        :options="districtList"
        filterable
        clearable
        v-model="form.endPoint"
        @change="(ele) => {handleChange(ele,'endPoint')}"
        ref="distCascader">
      </el-cascader>
    </el-form-item>
  </el-form>

  <el-row type="flex" justify="center" style="margin-top: 20px">
    <el-button type="primary" @click="submit()">提交</el-button>

    <el-button @click="clear()">清空</el-button>
  </el-row>

3.2 script结构

<script>
    data() {
        return {
          form: {
            startPoint:"", //起始地点
            wayPointsArr:[], //途径地点,有多个,因此用数组
            endPoint:"", //终止地点
          },
          districtList:[],//省市区数据,请求后端获取并组装成elementui Cascader需要的树形数据
          districtFullNameList:{}, //用来存储选择地点的名称
          districtLnglatList:{} //用来存储选择地点的经纬度
        };
      },
    methods: {
        //处理地点级联选择事件
        async handleChange(value,key) {
        //这里根据vlaue调用后端接口获取label
          if(value.length > 0) {
            let params = {
              tableName:"PROVINCE",
              page:1,
              where:"PROVINCE_ID,eq,'" + value[0] +"'",
            };
            await getTableData(params).then((res) => {
              this.districtFullNameList[key] = res.data.data[0].PROVINCE_NAME;
            });
            params.tableName = "CITY";
            params.where = "CITY_ID,eq,'" + value[1] +"'";
            await getTableData(params).then((res) => {
              this.districtFullNameList[key] += res.data.data[0].CITY_NAME;
            });
            params.tableName = "DISTRICT";
            params.where = "DISTRICT_ID,eq,'" + value[2] +"'";
            await getTableData(params).then((res) => {
              this.districtFullNameList[key] += res.data.data[0].DISTRICT_NAME;
              this.districtLnglatList[key] = res.data.data[0].LNG + "," + res.data.data[0].LAT;
            });
          }
        },
        // 动态添加一个机动任务途径地点
        addWayPoint() {
          this.form.wayPointsArr.push({WAYPOINT:"", key:Date.now()})
        },
        // 删除一个机动任务途径地点
        removeWayPoint(index) {
          this.form.wayPointsArr.splice(index, 1);
        },
        //提交
        submit(){
          let routesArray = [];
          routesArray.push(this.districtFullNameList['startPoint']);
          Object.keys(this.districtFullNameList).forEach(key => { //遍历键值对对象
            if(key !== 'startPoint' && key !== 'endPoint') {
              routesArray.push(this.districtFullNameList[key]);
            }
          });
          routesArray.push(this.districtFullNameList['endPoint']);
          console.log(routesArray.join('-'));
        },
        //清空
        clear() {
          this.$refs['form'].resetFields();
          this.form.wayPointsArr = []
        }      
    }
</script>

3.3 需要注意的点

  • 使用elementui的级联选择器Cascader来实现地点级联输入框,通过属性filterable设置是否可搜索;
  • 因为我需要提交表单时给后端传入用"-"分割的路线字符串,为了方便,在动态添加途径地点输入框时push了时间戳作为key,这样输入地点和修改地点时不会乱,并且Object中默认以key顺序排序的,所以提交时只需要遍历存储地点数据的Object即可;
  • Cascader选择触发后,获得的是地点树状数据districtList中的value数组,但我们需要的是label,这里可以尝试使用方法getCheckedNodes()[0].pathLabels获取,但我这里还是调用后端接口根据value值查询的。
  • 如果需要回显,根据value数组回显地点。

到了这里,关于Vue+element-ui的el-cascader实现动态添加删除级联地点输入框的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • element ui 层级选择器el-cascader只能选最后一级多选

    在element ui 中el-cascader多选: 每个层级都可以选择,但并不是我需要的,我需要多选只能选最后一级,在网上找了很久都复杂的,最终自己选择用css样式对checkbox进行隐藏。 实现方法: 在css 中加入 关键点在于利用属性选择器,遇到属性是 aria-haspopup (表示点击的时候是否会

    2024年02月11日
    浏览(61)
  • Element UI 中使用el-cascader组件,可以选择任意一级的内容并取消单选框

    当加入checkStrictly后就会出现单选框的问题,修改样式即可;这里使用的less语法,需要有less依赖,加入样式后如果没有生效,可以放在App.vue中的样式下

    2024年02月04日
    浏览(42)
  • Vue+Element-UI el-form表单动态检验

    业务需求: 表单el-form 有一表单项:发布时间 ,有5个选项:今天、24小时、近3天、近7天和自定义时间,其中当选择自定义时间时,后面跟着的日期时间选择器是必填的,选中其他选项时则不需要。这就需要做到表单的动态检验。 最开始实现方式是在当前表单项中设置规则

    2024年02月11日
    浏览(41)
  • element 的 el-cascader 组件获取级联选中label和value值

    1.  多选时  获取 cascader 级联选择器的 label 值         需要给 el-cascader 加 ref 用以获取值  获取后的样式 2. 单选时获取 cascader 级联选择器的值     

    2024年02月12日
    浏览(42)
  • Vue中使用element-ui el-dialog弹窗最大化还原,拖拽,动态改变大小

    创建对应的js文件   先在指定稳定文件创建js文件,如src下创建diaLog.js文件,部分会提示红色爆红,可以不予理会,可以根据需求修改,如:弹框可拉伸最小宽高。   2. 在main.js的引用   同时为了防止冲突,需要关闭closeOnClickModal(弹窗默认点击遮罩改为不关闭),并添加标签

    2024年02月11日
    浏览(35)
  • Vue+Element-UI 中 el-table 动态合并单元格 :span-method 方法

    记录一下工作时遇到的 el-table 合并单元格的需求,超详细😊 el-table官方提供了合并单元格的方法与返回格式 如下: 根据叙述有了如下思路: 因为后端返回的数据非统一, 可能不是按照类别排好的😨, 所以官网的例子满足不了所有的需求所以我们通过遍历table的数据比较前后两

    2024年02月12日
    浏览(51)
  • 【vue】element-ui、el-table使用V-for循环动态添加表头和数据

    参考链接 https://blog.csdn.net/xz1589155358/article/details/126597271

    2024年02月11日
    浏览(60)
  • Element-ui(Cascader 级联选择器)实现三级联动

    市区表: 县区表: 省级表: Controller层: service层 serviceimpl实现 mapper层实现 映射省下面所有的市 映射市下面所有的县 查询所有的区县 对应的省JavaBean 对应市JavaBean 对应的县区JavaBean 级联选择器 方法: 注意:级联选择器需要保持和后端映射保持一致回显数据 element-ui官网级

    2024年02月11日
    浏览(53)
  • 【vue2】element-ui el-transfer扩展 实现多列效果一对多

    vue2 el-transfer 穿梭框实现多类别 template 复制Transfer源码中的template,并拓展我们需要的列表2和button script 这里重写了Transfer的addToLeft方法,按着element-ui的逻辑写出第二个列表的逻辑即可。源码就不做解释了,这个组件比较简单,感兴趣的朋友可以去看看 style GitHub地址

    2024年02月08日
    浏览(42)
  • el-cascader 动态加载选项、编辑时数据回显问题 、单选不加载下一级节点、点击标签选中

    目录 需求描述 1.实现动态加载选项 2.数据回显 3.组件BUG:再次编辑不再加载 4.点击单选框选中节点时,同时加载下一级选项(额外需求) 5.点击label标签时,能够直接选中该节点(额外需求) 需求情景描述 前端使用el-cascader组件来实现一个层级选择器,可以支持单选或多选节

    2024年02月07日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包