Form 表单
动态显示 vif & 权限控制
在子组件的描述配置中,可以增加 vif: boolean | (data) => boolean 属性来控制该子组件的显示和隐藏。同时还支持子组件级别的权限控制: auth: 'xxx' (注:若要使用 auth 功能,必须在注册 CRUD 时,在 config 中配置 auth 的校验方法)
代码
首先注册 CRUD 时,需要在 config 中配置 auth 方法
ts
// @/main.ts
// 注册全局crud
app.use(ElPlusCrud, {
// 注册权限控制
auth: (auth: string = '') => {
// 这里进行权限查找...
return ['add', 'edit', 'del', 'test4'].indexOf(auth) >= 0
}
})
// @/main.ts
// 注册全局crud
app.use(ElPlusCrud, {
// 注册权限控制
auth: (auth: string = '') => {
// 这里进行权限查找...
return ['add', 'edit', 'del', 'test4'].indexOf(auth) >= 0
}
})
业务使用代码(有 test4 权限,没有 test5 权限):
vue
<ElPlusForm v-model="formData1" v-bind="formConfig1" />
<script setup lang="ts">
import { ref, reactive } from 'vue'
let formData1 = reactive({} as any)
const formConfig1 = ref({
column: 2,
formDesc: {
test1: { type: 'input', label: '字段1', required: true },
// 直接隐藏了
test2: { type: 'input', label: '字段2', vif: false },
test3: { type: 'input', label: '字段3', placeholder: '字段1的值为 666 时隐藏', vif: (formData) => formData?.test1 !== '666' },
test4: { type: 'input', label: '字段4', placeholder: '有 test4 权限', auth: 'test4' },
test5: { type: 'input', label: '字段5', auth: 'test5' }
} as IFormDesc
} as IFormConfig)
</script>
<ElPlusForm v-model="formData1" v-bind="formConfig1" />
<script setup lang="ts">
import { ref, reactive } from 'vue'
let formData1 = reactive({} as any)
const formConfig1 = ref({
column: 2,
formDesc: {
test1: { type: 'input', label: '字段1', required: true },
// 直接隐藏了
test2: { type: 'input', label: '字段2', vif: false },
test3: { type: 'input', label: '字段3', placeholder: '字段1的值为 666 时隐藏', vif: (formData) => formData?.test1 !== '666' },
test4: { type: 'input', label: '字段4', placeholder: '有 test4 权限', auth: 'test4' },
test5: { type: 'input', label: '字段5', auth: 'test5' }
} as IFormDesc
} as IFormConfig)
</script>
动态属性
在 formDesc 配置中,几乎所有属性都支持 响应式
以两个日期控件为例,需求:抽奖时间范围必须在活动时间范围之内,且活动开始时间不能小于今天
代码
vue
<ElPlusForm v-model="formData1" v-bind="formConfig1" />
<script setup lang="ts">
import { ref, reactive } from 'vue'
// 获取当天0点的时间
const today = new Date().setHours(0, 0, 0, 0)
let formData2 = reactive({} as any)
const formConfig2 = ref({
formDesc: {
activeTime: {
type: 'daterange',
label: '活动时间',
required: true,
disabledDate: (date: Date) => date < today,
on: { change: (formData) => (formData.luckTime = null) }
},
luckTime: {
type: 'daterange',
label: '抽奖时间',
required: true,
disabledDate: (date: Date) => {
// formData2 为响应式数据
if (formData2.activeTime) {
return date < formData2.activeTime[0] || date > formData2.activeTime[1]
} else {
return date < today
}
}
}
} as IFormDesc
} as IFormConfig)
</script>
<ElPlusForm v-model="formData1" v-bind="formConfig1" />
<script setup lang="ts">
import { ref, reactive } from 'vue'
// 获取当天0点的时间
const today = new Date().setHours(0, 0, 0, 0)
let formData2 = reactive({} as any)
const formConfig2 = ref({
formDesc: {
activeTime: {
type: 'daterange',
label: '活动时间',
required: true,
disabledDate: (date: Date) => date < today,
on: { change: (formData) => (formData.luckTime = null) }
},
luckTime: {
type: 'daterange',
label: '抽奖时间',
required: true,
disabledDate: (date: Date) => {
// formData2 为响应式数据
if (formData2.activeTime) {
return date < formData2.activeTime[0] || date > formData2.activeTime[1]
} else {
return date < today
}
}
}
} as IFormDesc
} as IFormConfig)
</script>