Skip to content

Commit 3d2c7b2

Browse files
committed
Refactor Contact component by modularizing form and preview.
Split Contact functionality into ContactForm and ContactList components for improved modularity and readability. Replaced inline implementations with reusable components while maintaining reactive data binding through `v-model`. Added support for uppercase name preview via model modifiers.
1 parent 385801a commit 3d2c7b2

File tree

3 files changed

+105
-46
lines changed

3 files changed

+105
-46
lines changed

src/components/Contact.vue

Lines changed: 9 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<script setup>
22
import {reactive} from "vue";
3+
import ContactForm from "./ContactForm.vue";
4+
import ContactList from "./ContactList.vue";
35
46
const contact = reactive({
57
name: "",
@@ -12,52 +14,13 @@ const contact = reactive({
1214
</script>
1315

1416
<template>
15-
<h1>Contact Us</h1>
16-
<form>
17-
<div>
18-
<label for="name">Name
19-
<input type="text" id="name" v-model="contact.name">
20-
</label>
21-
</div>
22-
<div>
23-
<label for="email">Email
24-
<input type="email" id="email" v-model="contact.email">
25-
</label>
26-
</div>
27-
<div>
28-
<label for="age">Age
29-
<input type="number" id="age" v-model.number="contact.age">
30-
</label>
31-
</div>
32-
<div>
33-
<label for="type">Type
34-
<select id="type" name="type" v-model="contact.type">
35-
<option value="Regular">Regular</option>
36-
<option value="VIP">VIP</option>
37-
</select>
38-
</label>
39-
</div>
40-
<div>
41-
<label for="complain">Complain
42-
<input type="checkbox" id="complain" v-model="contact.complain">
43-
</label>
44-
</div>
45-
<div>
46-
<label for="message">Message
47-
<textarea id="message" name="message" v-model="contact.message"></textarea>
48-
</label>
49-
</div>
50-
</form>
51-
52-
<h1>Preview</h1>
53-
<div>
54-
<p>Name : {{contact.name}}</p>
55-
<p>Email : {{contact.email}}</p>
56-
<p>Age : {{contact.age}}</p>
57-
<p>Type : {{contact.type}}</p>
58-
<p>Complain : {{contact.complain}}</p>
59-
<p>Message : {{contact.message}}</p>
60-
</div>
17+
<ContactForm v-model="contact"/>
18+
<ContactList v-model:name.uppercase="contact.name"
19+
v-model:email="contact.email"
20+
v-model:age="contact.age"
21+
v-model:type="contact.type"
22+
v-model:complain="contact.complain"
23+
v-model:message="contact.message"/>
6124
</template>
6225

6326
<style scoped>

src/components/ContactForm.vue

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<script setup>
2+
const model = defineModel({
3+
type: Object,
4+
required: true,
5+
get: (value) => {
6+
value.email = value.email.toUpperCase();
7+
return value;
8+
}
9+
});
10+
</script>
11+
12+
<template>
13+
<h1>Contact Us</h1>
14+
<form>
15+
<div>
16+
<label for="name">Name
17+
<input type="text" id="name" v-model="model.name">
18+
</label>
19+
</div>
20+
<div>
21+
<label for="email">Email
22+
<input type="email" id="email" v-model="model.email">
23+
</label>
24+
</div>
25+
<div>
26+
<label for="age">Age
27+
<input type="number" id="age" v-model.number="model.age">
28+
</label>
29+
</div>
30+
<div>
31+
<label for="type">Type
32+
<select id="type" name="type" v-model="model.type">
33+
<option value="Regular">Regular</option>
34+
<option value="VIP">VIP</option>
35+
</select>
36+
</label>
37+
</div>
38+
<div>
39+
<label for="complain">Complain
40+
<input type="checkbox" id="complain" v-model="model.complain">
41+
</label>
42+
</div>
43+
<div>
44+
<label for="message">Message
45+
<textarea id="message" name="message" v-model="model.message"></textarea>
46+
</label>
47+
</div>
48+
</form>
49+
</template>
50+
51+
<style scoped>
52+
53+
</style>

src/components/ContactList.vue

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<script setup>
2+
const [name, nameModifiers] = defineModel("name", {
3+
type: String,
4+
get: (value) => {
5+
if(nameModifiers.uppercase){
6+
return value.toUpperCase();
7+
}else {
8+
return value;
9+
}
10+
}
11+
})
12+
const email = defineModel("email", {
13+
type: String
14+
})
15+
const age = defineModel("age", {
16+
type: Number
17+
})
18+
const type = defineModel("type", {
19+
type: String
20+
})
21+
const complain = defineModel("complain", {
22+
type: Boolean
23+
})
24+
const message = defineModel("message", {
25+
type: String
26+
})
27+
</script>
28+
29+
<template>
30+
<h1>Preview</h1>
31+
<div>
32+
<p>Name : {{name}}</p>
33+
<p>Email : {{email}}</p>
34+
<p>Age : {{age}}</p>
35+
<p>Type : {{type}}</p>
36+
<p>Complain : {{complain}}</p>
37+
<p>Message : {{message}}</p>
38+
</div>
39+
</template>
40+
41+
<style scoped>
42+
43+
</style>

0 commit comments

Comments
 (0)