form-content.vue
1.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<script setup lang="ts">
import { Form, FormItem, Input, Textarea } from '@arco-design/web-vue';
import AvatarUpload from '@/components/avatar-upload/index.vue';
import { computed, ref } from 'vue';
import { FieldRule, FormInstance } from '@arco-design/web-vue/es/form';
import { Project } from '@/types/project';
type AttributeType = Omit<Project, 'id'>;
const props = defineProps<{ modelValue: AttributeType; submit?: (value: AttributeType) => Promise<Project> }>();
const emits = defineEmits<{ (e: 'update:modelValue', value: AttributeType): void }>();
const formRef = ref<FormInstance>();
const formRule = {
cover: [{ required: true, message: '请上传厂牌图片' }],
name: [{ required: true, message: '请输入厂牌名称' }],
intro: [{ type: 'string', max: 100, message: '厂牌简介不能超过100字' }],
} as Record<string, FieldRule[]>;
const formValue = computed({
get: () => props.modelValue,
set: (val) => emits('update:modelValue', val),
});
const onSubmit = async () => {
const error = await formRef.value?.validate();
return error ? Promise.reject(error) : props.submit?.(formValue.value);
};
defineExpose({ onSubmit });
</script>
<template>
<Form ref="formRef" layout="vertical" :model="formValue" :rules="formRule">
<FormItem hide-label content-class="justify-center" :wrapper-col-props="{ alignItems: 'center' }">
<AvatarUpload v-model="formValue.cover" :size="100" />
</FormItem>
<FormItem label="厂牌名称" field="name" show-colon>
<Input v-model="formValue.name" placeholder="请输入" :max-length="30" show-word-limit />
</FormItem>
<FormItem label="厂牌简介" field="intro" row-class="mb-0" show-colon>
<Textarea v-model="formValue.intro" :auto-size="{ maxRows: 4, minRows: 4 }" :max-length="50" show-word-limit />
</FormItem>
</Form>
</template>
<style scoped lang="less"></style>