Appearance
Form 表单
表单包含 输入框
, 单选框
, 下拉选择
, 多选框
等用户输入的组件
form value:
{ "email": "", "password": "", "confirmPwd": "", "agreement": false, "zone": "" }
这是 Form
基础例子
vue
<script setup lang="ts">
import { reactive, ref } from 'vue'
const formRef = ref()
const model = reactive({
email: '',
password: '',
confirmPwd: '',
agreement: false,
zone: '',
})
const options = [
{ label: 'zone 1', value: 'one' },
{ label: 'zone 2', value: 'two' },
{ label: 'zone 3', value: 'three' },
]
async function submit() {
// eslint-disable-next-line no-alert
alert('submitted!')
}
function reset() {
formRef.value.resetFields()
}
</script>
<template>
<NpForm ref="formRef" :model="model">
<NpFormItem prop="email" label="邮箱">
<NpInput v-model="model.email" />
</NpFormItem>
<NpFormItem prop="password" label="密码">
<NpInput v-model="model.password" type="password" />
</NpFormItem>
<NpFormItem prop="agreement" label="同意">
<NpSwitch v-model="model.agreement" />
</NpFormItem>
<NpFormItem prop="zone" label="区域">
<NpSelect :key="model.zone" v-model="model.zone" :options="options" />
</NpFormItem>
<NpFormItem>
<NpButton type="primary" @click.prevent="submit">
Submit
</NpButton>
<NpButton @click.prevent="reset">
Reset
</NpButton>
</NpFormItem>
</NpForm>
<p>
form value:
<pre>{{ model }}</pre>
</p>
</template>
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
49
50
51
52
53
54
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
49
50
51
52
53
54
form value:
{ "name": "", "email": "", "password": "", "confirmPwd": "", "agreement": false, "zone": "" }
这是 Form
基础例子
vue
<script setup lang="ts">
import { reactive, ref } from 'vue'
const formRef = ref()
const model = reactive({
name: '',
email: '',
password: '',
confirmPwd: '',
agreement: false,
zone: '',
})
const options = [
{ label: 'zone 1', value: 'one', green: true },
{ label: 'zone 2', value: 'two', green: true },
{ label: 'zone 3', value: 'three', disabled: true },
]
const rules = {
name: [
{ type: 'string', required: true, trigger: 'blur' },
{ min: 3, max: 5, message: '长度3-5', trigger: 'blur' },
],
email: [{ type: 'email', required: true, trigger: 'blur' }],
password: [
{ type: 'string', required: true, trigger: 'blur' },
{ min: 3, max: 5, message: '长度3-5', trigger: 'blur' },
],
confirmPwd: [
{ type: 'string', required: true, trigger: 'blur' },
{ validator: (_: any, value: string) => value === model.password, trigger: 'blur', message: '两个密码必须一致' },
],
agreement: [{ type: 'enum', required: true, enum: [true], message: '请同意协议' }],
zone: [{ type: 'string', required: true, trigger: 'change' }],
}
async function submit() {
try {
await formRef.value.validate()
console.log('passed!')
} catch (e) {
console.log('the promise', e)
}
}
function reset() {
formRef.value.resetFields()
}
</script>
<template>
<NpForm ref="formRef" class="form-demo" :model="model" :rules="rules">
<NpFormItem v-slot="{ validate }" prop="name" label="原生输入框">
<input v-model="model.name" class="inp" @blur="validate('blur')" @input="validate('input')">
</NpFormItem>
<NpFormItem prop="email" label="邮箱">
<NpInput v-model="model.email" green />
</NpFormItem>
<NpFormItem prop="password" label="密码">
<NpInput v-model="model.password" green type="password" />
</NpFormItem>
<NpFormItem prop="confirmPwd" label="密码">
<NpInput v-model="model.confirmPwd" green type="password" />
</NpFormItem>
<NpFormItem prop="agreement" label="同意">
<NpSwitch v-model="model.agreement" green />
</NpFormItem>
<NpFormItem prop="zone" label="区域">
<NpSelect v-model="model.zone" green :options="options" />
</NpFormItem>
<NpFormItem>
<NpButton type="green" @click.prevent="submit">
Submit
</NpButton>
<NpButton type="green" plain @click.prevent="reset">
Reset
</NpButton>
</NpFormItem>
</NpForm>
<p>
form value:
<pre>{{ model }}</pre>
</p>
</template>
<style scoped>
.form-demo .inp {
border: 1px solid #41d1ff;
}
</style>
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92