html - 如何在 vue.js 中以多步形式制作此表单
问题描述
在这里,我为具有三个不同组件的表单编写了代码。那是在一个页面中显示,我想让这个模板像多步表单一样一步一步地出现。例如,当我们在第一个模板时,如果我们单击下一步按钮,那么它应该进入第二个模板,如多步表单。
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="styles.css" />
<script src="https://unpkg.com/vue@next" defer></script>
<script src="app.js" defer></script>
</head>
<body>
<section id="app">
<ul>
<friend-contact></friend-contact>
<friend-contact-again></friend-contact-again>
<friend-contact-once-again></friend-contact-once-again>
</ul>
</section>
</body>
</html>
Vue.js
const app = Vue.createApp({
data() {
return {
};
},
});
app.component('friend-contact', {
template: `
<div>
<label for="fname">First name:</label><br>
<input type="text" id="fname" name="fname" value="first_form"><br>
<label for="lname">Last name:</label><br>
<input type="text" id="lname" name="lname" value="first_form"><br><br>
<input type="submit" value="Submit">
</div>
`,
data() {
return {
fname:'',
lname:''
};
},
});
app.component('friend-contact-again', {
template: `
<div>
<label for="fname">First name:</label><br>
<input type="text" id="fname" name="fname" value="second_form"><br>
<label for="lname">Last name:</label><br>
<input type="text" id="lname" name="lname" value="second_form"><br><br>
<input type="submit" value="Submit">
</div>
`,
data() {
return {
fname:'',
fname:''
};
},
});
app.component('friend-contact-once-again', {
template: `
<div>
<label for="fname">First name:</label><br>
<input type="text" id="fname" name="fname" value="third_form"><br>
<label for="lname">Last name:</label><br>
<input type="text" id="lname" name="lname" value="third_form"><br><br>
<input type="submit" value="Submit">
</div>
`,
data() {
return {
fname:'',
lname:''
};
},
});
app.mount('#app');
解决方案
由于你们三个朋友的联系表单基本相同,我创建了一个 Vue 2 CLI 应用程序,它三次重用相同的表单组件。
我在模板中包含了 HTML 表,只是为了在创建三个联系人后查看联系人列表。
显然,创建联系人后如何处理联系人(发布到数据库等)取决于您。
主页.vue
<template>
<div class="home">
<h3>Home</h3>
<div class="row">
<div class="col-md-4">
<button class="btn btn-primary" v-if="!displayForm && !displayTable" @click="showForm">Add Friends</button>
</div>
</div>
<friend-contact-form v-if="displayForm" @save-contacts="saveContacts" />
<table v-if="displayTable" class="table table-bordered">
<thead>
<tr>
<td>FIRST NAME</td>
<td>LAST NAME</td>
</tr>
</thead>
<tbody>
<tr v-for="(contact, index) in contacts" :key="index">
<td>{{ contact.firstName }}</td>
<td>{{ contact.lastName }}</td>
</tr>
</tbody>
</table>
<button class="btn btn-primary" v-if="displayReset" @click="reset">Reset</button>
</div>
</template>
<script>
import FriendContactForm from './FriendContactForm'
export default {
components: {
FriendContactForm
},
data() {
return {
contacts: [],
displayForm: false,
displayTable: false,
displayReset: false
}
},
methods: {
showForm() {
this.displayForm = true;
},
saveContacts(contacts) {
//console.log(contacts);
this.contacts = contacts;
this.displayForm = false;
this.displayTable = true;
this.displayReset = true;
},
reset() {
this.contacts = [];
this.displayForm = false;
this.displayTable = false;
this.displayReset = false;
}
}
}
</script>
FriendContactForm.vue
<template>
<div class="friend-contact-form">
<div class="row">
<div class="col-md-4">
<hr>
<h4>Friend {{ currentContactNumber[numContacts] }}</h4>
<form @submit.prevent="saveContact">
<div class="form-group">
<label>First Name</label>
<input type="text" class="form-control" v-model="contact.firstName">
</div>
<div class="form-group">
<label>Last Name</label>
<input type="text" class="form-control" v-model="contact.lastName">
</div>
<button class="btn btn-primary">{{ formBtnLabel }}</button>
</form>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
contact: {},
contacts: [],
maxContacts: 3,
currentContactNumber: ['One', 'Two', 'Three']
}
},
computed: {
numContacts() {
return this.contacts.length;
},
formBtnLabel() {
return (this.numContacts < (this.maxContacts - 1)) ? 'Next' : 'Finish';
}
},
methods: {
saveContact() {
if (this.numContacts < this.maxContacts) {
let contactCopy = { ...this.contact };
this.resetContact();
this.contacts.push(contactCopy);
}
if (this.numContacts === this.maxContacts) {
this.$emit('save-contacts', this.contacts)
}
},
resetContact() {
this.contact = {}
}
}
}
</script>
推荐阅读
- javascript - 为什么我的不和谐角色返回未定义?
- python - 如何将另一个预训练的 BERT 模型与 ktrain 文本分类器一起使用?
- ember.js - Ember-CLI v0.0.44 项目未使用“在严格模式下使用 const”构建。错误信息
- odoo - 问题:在 Fedora 32 中安装 odoo 时请求冲突
- python - 无法使用 Python 在 PySimpleGui 表中显示来自 MongoDB 数据库的数据
- download - 金字塔力下载生成文件
- sql - 将年份分配给过去 6 个月的月份
- c++ - 如何通过调用另一个方法从一个对象的方法启动线程?
- sql-server - DROP TABLE IF EXISTS vs OBJECT_ID IS NOT NULL
- sql - 如何将外部字符串添加到查询的输出中