一个传入省市区ID的级联框

省市区ID

  • 功能
  • edit页面(主要)
  • script逻辑
  • 如何拿到当前级联下所有ID数组
  • 长ID数组是如何回显的 (1)
  • 长ID数组是如何回显的 (2)

功能

选择第一层传第一层下的所有 id 数组,选择第二层传递第二层以及第二层下的所有 id 数组

edit页面(主要)

编辑页的一个 Table,包含 change 事件,较为重要

<a-col :xs="24" :sm="24" :md="24" :lg="24" v-if="formState.areaType === 2"><a @click="handleAddArea()">添加地区</a><a-table :dataSource="localList" :columns="columns" :pagination="false"><template #area="{ record }"><a-cascader:options="regionDataPlus"v-model:value="record.area"@change="(idl, options) => regionChange(record, idl, options)":fieldNames="{ label: 'name', value: 'id', children: 'children' }"style="width: 100%"placeholder="请选择地区"change-on-selectref="regionRef"/></template><template #firstunitAreaPrice="{ record }"><a-input-number v-model:value="record.firstunitAreaPrice"></a-input-number></template><template #continueunitAreaPrice="{ record }"><a-input-number v-model:value="record.continueunitAreaPrice"></a-input-number></template><template #handle="{ record, index }"><div style="display: flex"><!-- <a @click="handleAddArea()">添加地区</a> --><a style="margin-left: 10px" @click="handleDeleteArea(index)">删除</a></div></template></a-table></a-col>

script逻辑

算是重写了一遍 = =

<script setup>
import lodash from 'lodash'
import { reactive, defineProps, ref, onMounted } from 'vue'
import { v4 as uuidv4 } from 'uuid'
import { GetEdit, DoEdit } from '@/api/module/WDShip'
import { GetAllList } from '@/api/module/WDArea'
import { message, Modal } from 'ant-design-vue'
// 这是之前引入的省市区级联,用的antd级联js,后来要获取接口的,已弃用
// import { regionDataPlus } from 'element-china-area-data'
const props = defineProps(['editVisible', 'lineId'])
// 弹窗状态
let editVisible = ref(false)
editVisible.value = props.editVisible
// 地区,快递费等表格数据
let localList = ref([])
// 选择区域下拉框级联数据
let regionDataPlus = ref([])
// 只选中父级节点的所有id列表
let allIdList = ref([])
// area的拷贝
let areaCopy = ref([])
let formState = reactive({})
let infoData = reactive({})
// 确认
const handleConfirm = () => {// 这边确认防止areaCopy为[],因为area copy的 localList,所以当不change时areaCopy为空if (areaCopy.value.length < 1) {areaCopy.value = localList.value}formState.areaFee = JSON.stringify(areaCopy.value)DoEdit(formState).then(res => {if (res.code == 0) {emit('editFun', false, true)message.success(res.msg)} else {message.error(res.msg)}})
}// 删除地址
const handleDeleteArea = index => {if (localList.value.length > 1) {localList.value.splice(index, 1)areaCopy.value = lodash.cloneDeep(localList.value)areaCopy.value.forEach(item => {if (record.id === item.id) {item.area = allIdList.value}})}
}
// 添加地址
const handleAddArea = () => {// localList.value.push(JSON.parse(JSON.stringify(item)))localList.value.push({id: uuidv4(),area: '',defaultArea: '',areaParentName: '',firstunitAreaPrice: 0,continueunitAreaPrice: 0})
}
const columns = [{ title: '选择地区', dataIndex: 'area', key: 'area', slots: { customRender: 'area' } },{title: '首重费用',dataIndex: 'firstunitAreaPrice',key: 'firstunitAreaPrice',slots: { customRender: 'firstunitAreaPrice' }},{title: '续重费用',dataIndex: 'continueunitAreaPrice',key: 'continueunitAreaPrice',slots: { customRender: 'continueunitAreaPrice' }},{ title: '操作', dataIndex: 'handle', key: 'handle', slots: { customRender: 'handle' } }
]
// 获取详情
const getEdit = () => {GetEdit({ id: props.lineId }).then(res => {Object.assign(infoData, res.data)Object.assign(formState, res.data.model)// areaFeeList = res.data.modelif (res.data.model.areaFeeObj.length > 0) {res.data.model.areaFeeObj.forEach(item => {if (item.defaultArea.length > 0) {item.area = item.defaultArea}})}localList.value = res.data.model.areaFeeObj})
}// 获取省市区
const getLocalData = () => {GetAllList({}).then(res => {let map = {}let result = []if (!Array.isArray(res.data)) {return []}res.data.forEach(item => {map[item.id] = item})res.data.forEach(item => {let parent = map[item.parentId]if (parent) {;(parent.children || (parent.children = [])).push(item)} else {result.push(item)}})regionDataPlus.value = result})
}// 城市Change
// 选择第一层传第一层下的所有id,选择第二层传递第二层以及第二层下的所有id
const regionChange = (record, idl, options) => {let filterIdList = []let firstIdList = []filterIdList = []if (idl.length === 1) {if (options[0].children) {filterIdList.push(...options[0].children.filter(item => item.id).map(item => item.id))options[0].children.forEach(district => {if (district.children) {district.children.forEach(item => {filterIdList.push(item.id)})}})}firstIdList = filterIdList[0]allIdList.value = filterIdList} else if (idl.length === 2) {filterIdList.push(...firstIdList, ...options[1].children.filter(item => item.id).map(item => item.id))allIdList.value = filterIdList} else {allIdList.value = idl}// 当选择的时候,因为areaCopy.value是深拷贝对象,这里的意思是,areaCopy.value 改变不会影响到 localListareaCopy.value = lodash.cloneDeep(localList.value)areaCopy.value.forEach(item => {if (record.id === item.id) {item.area = allIdList.value}})// localList.value 只保留 3个ID// areaCopy.value 为全部ID,当层级选到第三个恢复为正常的3IDareaCopy.value.forEach(aid => {if (aid.id === record.id) {aid.defaultArea = record.area}})
}const emit = defineEmits(['editFun'])
// 取消
const handleCancle = () => {emit('editFun', false)
}
onMounted(() => {getEdit()getLocalData()
})
</script>

如何拿到当前级联下所有ID数组

// 城市Change
// 选择第一层传第一层下的所有id,选择第二层传递第二层以及第二层下的所有id
const regionChange = (record, idl, options) => {let filterIdList = []let firstIdList = []filterIdList = []if (idl.length === 1) {if (options[0].children) {filterIdList.push(...options[0].children.filter(item => item.id).map(item => item.id))options[0].children.forEach(district => {if (district.children) {district.children.forEach(item => {filterIdList.push(item.id)})}})}firstIdList = filterIdList[0]allIdList.value = filterIdList} else if (idl.length === 2) {filterIdList.push(...firstIdList, ...options[1].children.filter(item => item.id).map(item => item.id))allIdList.value = filterIdList} else {allIdList.value = idl}// 当选择的时候,因为areaCopy.value是深拷贝对象,这里的意思是,areaCopy.value 改变不会影响到 localListareaCopy.value = lodash.cloneDeep(localList.value)areaCopy.value.forEach(item => {if (record.id === item.id) {item.area = allIdList.value}})// localList.value 只保留 3个ID// areaCopy.value 为全部ID,当层级选到第三个恢复为正常的3IDareaCopy.value.forEach(aid => {if (aid.id === record.id) {aid.defaultArea = record.area}})
}

长ID数组是如何回显的 (1)

这里配合级联的change,若级联没有change,那么提交后areaCopy.value就会为[],如何解决的areaCopy.value为[]?

// 确认
const handleConfirm = () => {// 这边确认防止areaCopy为[],因为area copy的 localList,所以当不change时areaCopy为空if (areaCopy.value.length < 1) {areaCopy.value = localList.value}formState.areaFee = JSON.stringify(areaCopy.value)DoEdit(formState).then(res => {if (res.code == 0) {emit('editFun', false, true)message.success(res.msg)} else {message.error(res.msg)}})
}

长ID数组是如何回显的 (2)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/576522.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯刷题计划-洛谷-持续更新

P8598 [蓝桥杯 2013 省 AB] 错误票据 题目 #include <bits/stdc.h> #define endl \n #define int long long #define INF 0x3f3f3f3f3f const int N 1000010; using namespace std; int arr[N]; signed main() {int N;cin>>N;int idx;while(cin>>arr[idx…

NetCore3.1 Controller中直接返回JObject对象抛出异常解决方案

问题描述 在NetCore 3.1的Web项目中&#xff0c;Controller有一个方法直接返回JObject对象时&#xff0c;抛出了异常 S y s t e m . N o t S u p p o r t e d E x c e p t i o n : T h e c o l l e c t i o n t y p e ′ N e w t o n s o f t . J s o n . L i n q . J O b j …

MybatisPlus速成

MybatisPlus快速入门 快速入门入门案例常见注解常见配置 核心功能条件构造器自定义SQLService接口 扩展功能代码生成静态工具逻辑删除枚举处理器JSON处理器 插件功能分页插件通用分页实体 参考文档 mybatis-plus参考文档 全部资料链接 讲义 快速入门 入门案例 <dependency…

【QT入门】 QListWidget各种常见用法详解之列表模式

往期回顾 【QT入门】 Qt代码创建布局之setLayout使用-CSDN博客 【QT入门】 Qt代码创建布局之多重布局变换与布局删除技巧-CSDN博客 【QT入门】 QTabWidget各种常见用法详解-CSDN博客 【QT入门】 QListWidget各种常见用法详解之列表模式 QListWidget有列表和图标两种显示模式&a…

如何通过vscode连接到wsl

下载wsl扩展 远程连接模式

EDA 全加器设计及例化语句应用

文章目录 前言一、全加器是什么&#xff1f;二、使用步骤1.半加器2.全加器1.新建一个全加器工程2.添加半加器的.v文件到全加器工程中3.新建全加器.v文件&#xff0c;写程序&#xff0c;调用半加器.v文件 完成例化 三、仿真效果总结 前言 提示&#xff1a;这里可以添加本文要记…

【机器学习】数据探索(Data Exploration)---数据质量和数据特征分析

一、引言 在机器学习项目中&#xff0c;数据探索是至关重要的一步。它不仅是模型构建的基础&#xff0c;还是确保模型性能稳定、预测准确的关键。数据探索的过程中&#xff0c;数据质量和数据特征分析占据了核心地位。数据质量直接关系到模型能否从数据中提取有效信息&#xff…

Vue挂载全局方法

简介&#xff1a;有时候&#xff0c;频繁调用的函数&#xff0c;我们需要把它挂载在全局的vue原型上&#xff0c;方便调用&#xff0c;具体怎么操作&#xff0c;这里来记录一下。 一、这里以本地存储的方法为例 var localStorage window.localStorage; const db {/** * 更新…

map与set容器常见操作详解(含示例代码及注意事项)

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

hcip实验3——gre配置实验

实验拓扑&#xff1a; 实验内容&#xff1a; PC1; PC2: R1配置&#xff1a; [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 192.168.1.1 24 [Huawei]int g0/0/1 [Huawei-GigabitEthernet0/0/1]ip add 100.1.1.1 24 [Huawei-GigabitEthernet0/0/1]q [Huawei]sys […

Linux根据时间删除文件或目录

《liunx根据时间删除文件》和 《Linux 根据时间删除文件或者目录》已经讲述了根据时间删除文件或目录的方法。 下面我做一些补充&#xff0c;讲述一个具体例子。以删除/home目录下的文件为例。 首先通过命令&#xff1a; ls -l --time-style"%Y-%m-%d %H:%M:%S"…

【Linux】nmcli命令详解(文末送书)

目录 一、概述 二、常用参数使用 2.1 nmcli networking 1.显示NM是否接管网络 2.查看网络连接状态 3.开/关网络连接 2.2 general ​编辑 1.显示系统网络状态 2.显示主机名 3.更改主机名 2.3 nmcli connection ​编辑1.显示所有网络连接 2.显示某个网卡的详细信息…