mirror of https://gitee.com/xiaonuobase/snowy
163 lines
4.2 KiB
Vue
163 lines
4.2 KiB
Vue
<template>
|
||
<a-form
|
||
:model="formData"
|
||
ref="formRef"
|
||
name="basic"
|
||
autocomplete="off"
|
||
>
|
||
<a-table :columns="columns" :dataSource="formData" size="middle">
|
||
<template #bodyCell="{text, record, index, column}">
|
||
<template v-if="column.dataIndex === 'whetherToClick'">
|
||
<a-form-item :validate-status="validateStatus(record, 'whetherToClick')">
|
||
<a-radio-group v-model:value="record.whetherToClick" placeholder="请选择跳转方式" :options="whetherToClickOptions" />
|
||
</a-form-item>
|
||
</template>
|
||
<template v-if="column.dataIndex === 'skipMode'">
|
||
<a-form-item :validate-status="validateStatus(record, 'skipMode')">
|
||
<a-select v-model:value="record.skipMode" placeholder="请选择跳转方式" :disabled="record.whetherToClick === 'DISABLE'" :options="skipModeOptions" />
|
||
</a-form-item>
|
||
</template>
|
||
<template v-if="column.dataIndex === 'url'">
|
||
<a-form-item :validate-status="validateStatus(record, 'url')">
|
||
<a-input v-model:value="formData[index].url" :disabled="record.whetherToClick === 'DISABLE'" placeholder="请输入URL或路由地址"/>
|
||
</a-form-item>
|
||
</template>
|
||
</template>
|
||
</a-table>
|
||
</a-form>
|
||
</template>
|
||
|
||
<script name="subForm" setup>
|
||
import tool from "@/utils/tool"
|
||
import { remove, isEmpty, cloneDeep } from 'lodash-es'
|
||
const formRef = ref()
|
||
const formData = ref([])
|
||
const skipModeOptions = ref(tool.dictList('SKIP_MODE'))
|
||
const whetherToClickOptions = ref(tool.dictList('WHETHER_TO_CLICK'))
|
||
const props = defineProps({
|
||
dataArray: {
|
||
type: Object,
|
||
default: []
|
||
},
|
||
place: {
|
||
type: Object,
|
||
default: []
|
||
}
|
||
})
|
||
const columns = ref([
|
||
{
|
||
title: '位置',
|
||
dataIndex: 'label',
|
||
width: '20%',
|
||
},
|
||
{
|
||
title: '点击事件',
|
||
dataIndex: 'whetherToClick',
|
||
width: '25%',
|
||
},
|
||
{
|
||
title: '跳转方式',
|
||
dataIndex: 'skipMode',
|
||
width: '20%',
|
||
},
|
||
{
|
||
title: 'URL',
|
||
dataIndex: 'url'
|
||
}
|
||
])
|
||
// 每行的校验
|
||
const validateStatus = (record, name) => {
|
||
if (record[name]) {
|
||
return 'success'
|
||
} else {
|
||
return 'error'
|
||
}
|
||
}
|
||
// 返回多的数据,用于增减行
|
||
const dataFiltrate = (newVal, oldVal) => {
|
||
let result = ''
|
||
oldVal.forEach((data) => {
|
||
if (!newVal.some(item => item === data)) {
|
||
result = data
|
||
}
|
||
})
|
||
return result
|
||
}
|
||
watch(
|
||
() => props.place,
|
||
(newVal, oldVal) => {
|
||
if (!isEmpty(props.dataArray) && isEmpty(formData.value)) {
|
||
formData.value = cloneDeep(props.dataArray)
|
||
} else {
|
||
if (typeof newVal === "object") {
|
||
if (!isEmpty(formData.value)) {
|
||
formData.value.forEach(() => {
|
||
// 如果包含
|
||
if (!newVal.some(item => item === item.key)) {
|
||
// 需要减少的
|
||
if (formData.value.length > newVal.length) {
|
||
const deleteData = dataFiltrate(newVal, oldVal)
|
||
remove(formData.value, (item) => item.key === deleteData)
|
||
}
|
||
// 需要增加的
|
||
if (formData.value.length < newVal.length) {
|
||
const deleteData = dataFiltrate(oldVal, newVal)
|
||
// 如果没有,就不增加
|
||
if (!formData.value.some(item => item === deleteData)) {
|
||
const obj = {
|
||
key: deleteData,
|
||
label: tool.dictTypeData('DEV_SLIDESHOW_PLACE' , deleteData),
|
||
whetherToClick: 'DISABLE',
|
||
skipMode: 'URL',
|
||
url: ''
|
||
}
|
||
formData.value.push(obj)
|
||
}
|
||
}
|
||
}
|
||
})
|
||
} else {
|
||
newVal.forEach((item) => {
|
||
const obj = {
|
||
key: item,
|
||
label: tool.dictTypeData('DEV_SLIDESHOW_PLACE' , item),
|
||
whetherToClick: 'DISABLE',
|
||
skipMode: 'URL',
|
||
url: ''
|
||
}
|
||
formData.value.push(obj)
|
||
})
|
||
}
|
||
}
|
||
}
|
||
},
|
||
{ immediate: true, deep: true }
|
||
)
|
||
// 获取值,校验不通过返回false
|
||
const getData = () => {
|
||
if (isEmpty(formData.value)) {
|
||
return false
|
||
} else {
|
||
let result = true
|
||
formData.value.forEach((item) => {
|
||
if (item.whetherToClick === 'ENABLE' && isEmpty(item.url)) {
|
||
result = false
|
||
}
|
||
})
|
||
if (result === false) {
|
||
return false
|
||
} else {
|
||
return formData.value
|
||
}
|
||
}
|
||
}
|
||
defineExpose({
|
||
getData
|
||
})
|
||
</script>
|
||
<style lang="less" scoped>
|
||
.ant-form-item {
|
||
margin-bottom: 0 !important;
|
||
}
|
||
</style>
|