mirror of
https://gitee.com/czh-dev/upload-hub
synced 2026-09-06 16:07:07 +08:00
feat:完善SelectDir组件支持文件复选
This commit is contained in:
@@ -2,8 +2,8 @@
|
|||||||
<div class="select-dir-container">
|
<div class="select-dir-container">
|
||||||
<div class="input-wrapper">
|
<div class="input-wrapper">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="selectedPath"
|
v-model="displayValue"
|
||||||
placeholder="请输入或选择目录路径"
|
:placeholder="placeholder"
|
||||||
class="dir-input"
|
class="dir-input"
|
||||||
@input="handleInputChange"
|
@input="handleInputChange"
|
||||||
>
|
>
|
||||||
@@ -28,11 +28,22 @@
|
|||||||
ref="tree"
|
ref="tree"
|
||||||
>
|
>
|
||||||
<span slot-scope="{ node, data }" class="custom-tree-node">
|
<span slot-scope="{ node, data }" class="custom-tree-node">
|
||||||
<el-radio
|
<template v-if="multiple">
|
||||||
v-model="selectedPath"
|
<el-checkbox
|
||||||
@change="handleRadioChange(data)"
|
v-model="selectedPaths"
|
||||||
:disabled="!allowSelectFolder && data.folder"
|
:label="data.path"
|
||||||
></el-radio>
|
@change="handleCheckboxChange(data)"
|
||||||
|
:disabled="!allowSelectFolder && data.folder"
|
||||||
|
>
|
||||||
|
</el-checkbox>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<el-radio
|
||||||
|
v-model="selectedPath"
|
||||||
|
@change="handleRadioChange(data)"
|
||||||
|
:disabled="!allowSelectFolder && data.folder"
|
||||||
|
></el-radio>
|
||||||
|
</template>
|
||||||
<i :class="data.folder ? 'el-icon-folder' : 'el-icon-document'"></i>
|
<i :class="data.folder ? 'el-icon-folder' : 'el-icon-document'"></i>
|
||||||
<span>{{ node.label }}</span>
|
<span>{{ node.label }}</span>
|
||||||
</span>
|
</span>
|
||||||
@@ -49,8 +60,8 @@ export default {
|
|||||||
name: 'SelectDir',
|
name: 'SelectDir',
|
||||||
props: {
|
props: {
|
||||||
value: {
|
value: {
|
||||||
type: String,
|
type: [String, Array],
|
||||||
default: ''
|
default: () => ''
|
||||||
},
|
},
|
||||||
showFiles: {
|
showFiles: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
@@ -59,11 +70,16 @@ export default {
|
|||||||
allowSelectFolder: {
|
allowSelectFolder: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true
|
default: true
|
||||||
|
},
|
||||||
|
multiple: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
selectedPath: this.value,
|
selectedPath: this.multiple ? '' : this.value,
|
||||||
|
selectedPaths: this.multiple ? (Array.isArray(this.value) ? this.value : []) : [],
|
||||||
isDropdownVisible: false,
|
isDropdownVisible: false,
|
||||||
treeData: [],
|
treeData: [],
|
||||||
defaultProps: {
|
defaultProps: {
|
||||||
@@ -73,12 +89,42 @@ export default {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
displayValue() {
|
||||||
|
if (this.multiple) {
|
||||||
|
return this.selectedPaths.join(',');
|
||||||
|
}
|
||||||
|
return this.selectedPath;
|
||||||
|
},
|
||||||
|
placeholder() {
|
||||||
|
return this.multiple ? '请选择多个文件或目录' : '请输入或选择目录路径';
|
||||||
|
}
|
||||||
|
},
|
||||||
watch: {
|
watch: {
|
||||||
value(newVal) {
|
value: {
|
||||||
this.selectedPath = newVal;
|
handler(newVal) {
|
||||||
|
if (this.multiple) {
|
||||||
|
this.selectedPaths = Array.isArray(newVal) ? newVal : [];
|
||||||
|
} else {
|
||||||
|
this.selectedPath = newVal;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
immediate: true
|
||||||
},
|
},
|
||||||
selectedPath(newVal) {
|
selectedPath(newVal) {
|
||||||
this.$emit('input', newVal);
|
if (!this.multiple) {
|
||||||
|
this.$emit('input', newVal);
|
||||||
|
this.$emit('change', newVal);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selectedPaths: {
|
||||||
|
handler(newVal) {
|
||||||
|
if (this.multiple) {
|
||||||
|
this.$emit('input', newVal);
|
||||||
|
this.$emit('change', newVal);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
deep: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
@@ -150,6 +196,12 @@ export default {
|
|||||||
this.isDropdownVisible = false;
|
this.isDropdownVisible = false;
|
||||||
this.$emit('change', data.path);
|
this.$emit('change', data.path);
|
||||||
},
|
},
|
||||||
|
handleCheckboxChange(data) {
|
||||||
|
if (!this.allowSelectFolder && data.folder) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.$emit('change', this.selectedPaths);
|
||||||
|
},
|
||||||
handleInputChange(value) {
|
handleInputChange(value) {
|
||||||
// 当用户手动输入时,触发change事件
|
// 当用户手动输入时,触发change事件
|
||||||
this.$emit('change', value);
|
this.$emit('change', value);
|
||||||
@@ -223,8 +275,17 @@ export default {
|
|||||||
color: #909399;
|
color: #909399;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.checkbox-label {
|
||||||
|
margin-left: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
:deep(.el-radio__label) {
|
:deep(.el-radio__label) {
|
||||||
width: 0;
|
width: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:deep(.el-checkbox__label) {
|
||||||
|
display: none;
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
Reference in New Issue
Block a user