332 lines
11 KiB
JavaScript
Raw Normal View History

2026-05-28 09:48:42 +08:00
"use strict";
const common_vendor = require("../../../../common/vendor.js");
const _sfc_main = {
name: "up-cascader",
props: {
// 通过双向绑定控制组件的弹出与收起
show: {
type: Boolean,
default: false
},
// 级联数据
data: {
type: Array,
default() {
return [];
}
},
// 默认选中的值
modelValue: {
type: Array,
default() {
return [];
}
},
// 指定选项的值为选项对象中的哪个属性值
valueKey: {
type: String,
default: "value"
},
// 指定选项标签为选项对象中的哪个属性值
labelKey: {
type: String,
default: "label"
},
// 指定选项的子选项为选项对象中的哪个属性值
childrenKey: {
type: String,
default: "children"
},
// 是否允许通过点击遮罩关闭Picker
maskCloseAble: {
type: Boolean,
default: true
},
// 弹出的z-index值
zIndex: {
type: [String, Number],
default: 0
},
// 是否在选择最后一级时自动关闭并触发confirm
autoClose: {
type: Boolean,
default: false
},
// 选中项目的展示方向direction垂直方向适合文字长度过长
headerDirection: {
type: String,
default: "row"
},
// 选项区域列数支持1列和2列默认为2列
optionsCols: {
type: [Number],
default: 2
},
// 是否显示关闭图标
closeable: {
type: Boolean,
default: true
}
},
data() {
return {
// 存储每一级的数据
levelList: [],
// 存储每一级选中的索引
selectedValueIndexs: [],
tabsIndex: 0,
popupShow: false,
// 新增confirmValues用于存储确认的值
confirmValues: []
};
},
watch: {
data: {
handler() {
this.initLevelList();
this.setDefaultValue();
},
immediate: true
},
show() {
this.popupShow = this.show;
},
modelValue: {
handler() {
this.setDefaultValue();
},
immediate: true
}
},
computed: {
isChange() {
return this.tabsIndex > 1;
},
genTabsList() {
let tabsList = [{
name: "请选择"
}];
for (let i = 0; i < this.selectedValueIndexs.length; i++) {
if (this.selectedValueIndexs[i] !== void 0 && this.levelList[i]) {
const selectedItem = this.levelList[i][this.selectedValueIndexs[i]];
if (selectedItem) {
tabsList[i] = {
name: selectedItem[this.labelKey]
};
if (i === this.selectedValueIndexs.length - 1 && selectedItem[this.childrenKey] && selectedItem[this.childrenKey].length > 0) {
tabsList.push({
name: "请选择"
});
}
}
}
}
return tabsList;
},
uZIndex() {
return this.zIndex ? this.zIndex : this.$u.zIndex.popup;
}
},
// 新增confirm事件
emits: ["update:modelValue", "update:show", "change", "confirm", "cancel"],
methods: {
t: common_vendor.t$1,
initLevelList() {
if (this.data && this.data.length > 0) {
this.levelList = [this.data];
this.selectedValueIndexs = [];
}
},
setDefaultValue() {
if (!this.data || this.data.length == 0)
return;
if (!this.modelValue || this.modelValue.length == 0)
return;
this.selectedValueIndexs = [];
this.levelList = [];
let currentLevelData = this.data;
for (let i = 0; i < this.modelValue.length; i++) {
const value = this.modelValue[i];
const index = currentLevelData.findIndex((item) => item[this.valueKey] === value);
this.levelList[i] = currentLevelData;
if (index !== -1) {
this.selectedValueIndexs.push(index);
if (currentLevelData[index][this.childrenKey]) {
currentLevelData = currentLevelData[index][this.childrenKey];
} else {
break;
}
} else {
break;
}
}
},
close() {
this.$emit("cancel");
this.$emit("update:show", false);
},
tabsChange(item) {
},
levelChange(levelIndex, index) {
this.$set(this.selectedValueIndexs, levelIndex, index);
this.selectedValueIndexs.splice(levelIndex + 1);
this.tabsIndex = Math.min(this.tabsIndex, levelIndex);
this.levelList.splice(levelIndex + 1);
const currentItem = this.levelList[levelIndex][index];
if (currentItem && currentItem[this.childrenKey] && currentItem[this.childrenKey].length > 0) {
if (this.levelList.length <= levelIndex + 1) {
this.levelList.push(currentItem[this.childrenKey]);
} else {
this.$set(this.levelList, levelIndex + 1, currentItem[this.childrenKey]);
}
this.tabsIndex = levelIndex + 1;
} else {
if (this.autoClose) {
this.emitChange();
this.handleConfirm();
} else {
this.emitChange(false);
}
}
},
// 修改emitChange方法增加closePopup参数
emitChange(closePopup = true) {
const result = [];
for (let i = 0; i < this.selectedValueIndexs.length; i++) {
if (this.selectedValueIndexs[i] !== void 0 && this.levelList[i]) {
result.push(this.levelList[i][this.selectedValueIndexs[i]][this.valueKey]);
}
}
this.confirmValues = [...result];
this.$emit("change", this.confirmValues);
if (closePopup) {
this.close();
}
},
handleCancel() {
this.close();
},
handleConfirm() {
this.$emit("update:modelValue", this.confirmValues);
this.$emit("confirm", this.confirmValues);
this.close();
}
}
};
if (!Array) {
const _easycom_up_steps_item2 = common_vendor.resolveComponent("up-steps-item");
const _easycom_up_steps2 = common_vendor.resolveComponent("up-steps");
const _easycom_up_tabs2 = common_vendor.resolveComponent("up-tabs");
const _easycom_up_icon2 = common_vendor.resolveComponent("up-icon");
const _easycom_up_cell2 = common_vendor.resolveComponent("up-cell");
const _easycom_up_cell_group2 = common_vendor.resolveComponent("up-cell-group");
const _easycom_up_button2 = common_vendor.resolveComponent("up-button");
const _easycom_up_popup2 = common_vendor.resolveComponent("up-popup");
(_easycom_up_steps_item2 + _easycom_up_steps2 + _easycom_up_tabs2 + _easycom_up_icon2 + _easycom_up_cell2 + _easycom_up_cell_group2 + _easycom_up_button2 + _easycom_up_popup2)();
}
const _easycom_up_steps_item = () => "../u-steps-item/u-steps-item.js";
const _easycom_up_steps = () => "../u-steps/u-steps.js";
const _easycom_up_tabs = () => "../u-tabs/u-tabs.js";
const _easycom_up_icon = () => "../u-icon/u-icon.js";
const _easycom_up_cell = () => "../u-cell/u-cell.js";
const _easycom_up_cell_group = () => "../u-cell-group/u-cell-group.js";
const _easycom_up_button = () => "../u-button/u-button.js";
const _easycom_up_popup = () => "../u-popup/u-popup.js";
if (!Math) {
(_easycom_up_steps_item + _easycom_up_steps + _easycom_up_tabs + _easycom_up_icon + _easycom_up_cell + _easycom_up_cell_group + _easycom_up_button + _easycom_up_popup)();
}
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
return common_vendor.e({
a: $props.headerDirection == "column"
}, $props.headerDirection == "column" ? common_vendor.e({
b: $data.popupShow
}, $data.popupShow ? {
c: common_vendor.f($options.genTabsList, (item, index, i0) => {
return {
a: common_vendor.o(($event) => $data.tabsIndex = index),
b: "2b4d73a7-2-" + i0 + ",2b4d73a7-1",
c: common_vendor.p({
title: item.name
})
};
}),
d: common_vendor.o(($event) => $data.tabsIndex = $event),
e: common_vendor.p({
dot: true,
direction: "column",
current: $data.tabsIndex
})
} : {}) : common_vendor.e({
f: $data.popupShow
}, $data.popupShow ? {
g: common_vendor.sr("tabs", "2b4d73a7-3,2b4d73a7-0"),
h: common_vendor.o($options.tabsChange),
i: common_vendor.o(($event) => $data.tabsIndex = $event),
j: common_vendor.p({
list: $options.genTabsList,
scrollable: true,
current: $data.tabsIndex
})
} : {}), {
k: common_vendor.f($data.levelList, (levelData, levelIndex, i0) => {
return common_vendor.e({
a: $props.optionsCols == 2 || levelIndex == $data.tabsIndex
}, $props.optionsCols == 2 || levelIndex == $data.tabsIndex ? common_vendor.e({
b: levelIndex === 0 || $data.selectedValueIndexs[levelIndex - 1] !== void 0
}, levelIndex === 0 || $data.selectedValueIndexs[levelIndex - 1] !== void 0 ? {
c: common_vendor.f(levelData, (item, index, i1) => {
return common_vendor.e({
a: $data.selectedValueIndexs[levelIndex] === index
}, $data.selectedValueIndexs[levelIndex] === index ? {
b: "2b4d73a7-6-" + i0 + "-" + i1 + "," + ("2b4d73a7-5-" + i0 + "-" + i1),
c: common_vendor.p({
size: "17",
name: "checkbox-mark"
})
} : {}, {
d: index,
e: common_vendor.o(($event) => $options.levelChange(levelIndex, index), index),
f: "2b4d73a7-5-" + i0 + "-" + i1 + "," + ("2b4d73a7-4-" + i0),
g: common_vendor.p({
title: item[$props.labelKey],
arrow: false,
index
})
});
}),
d: "2b4d73a7-4-" + i0 + ",2b4d73a7-0"
} : {}, {
e: $props.optionsCols == 2 ? "33.33333%" : "750rpx"
}) : {}, {
f: levelIndex
});
}),
l: $options.isChange ? 1 : "",
m: $props.optionsCols == 2 && $options.isChange ? "translateX(-33.3333333%)" : "",
n: common_vendor.t($options.t("up.common.cancel")),
o: common_vendor.o($options.handleCancel),
p: common_vendor.p({
type: "default"
}),
q: common_vendor.t($options.t("up.common.confirm")),
r: common_vendor.o($options.handleConfirm),
s: common_vendor.p({
type: "primary"
}),
t: common_vendor.o($options.close),
v: common_vendor.p({
show: $data.popupShow,
mode: "bottom",
popup: false,
mask: true,
closeable: $props.closeable,
["safe-area-inset-bottom"]: true,
["close-icon-color"]: "#ffffff",
["z-index"]: $options.uZIndex,
maskCloseAble: $props.maskCloseAble
})
});
}
const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "/Users/zsq/Sources/github/2025property-pay/pay-employee/node_modules/uview-plus/components/u-cascader/u-cascader.vue"]]);
wx.createComponent(Component);