詳解Vue里循環(huán)form表單項實例
有的時候我們可能會遇到這種需求,用戶點擊某個按鈕就可以增加一個同樣的表單出來,點擊一次增加一次。然后要用到深拷貝,Vue.js+ElementUI等等。效果大概如下,就是一個表單有下拉框和兩個輸入框,現(xiàn)在點擊"添加表單"按鈕之后就會多一個表單出來,點擊"提交表單"后就同時提交兩個表單的value值。

代碼如下:
<template>
<div>
<div style="margin: 10px 0">
<el-button type="primary" @click="addForm">添加表單</el-button>
<el-button type="primary" @click="submit">提交表單</el-button>
</div>
<div v-for="(item, index) in List" :key="index">
<el-form ref="form" label-width="80px">
<el-form-item label="直播平臺">
<el-select
v-model="item.platform"
:key="index"
placeholder="請選擇直播平臺"
>
<el-option
:label="item2.platformName"
v-for="(item2, index2) in platformNameList"
:key="index2"
:value="item2.platformValue"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="粉絲量">
<el-input v-model="item.fanMount" :key="index"></el-input>
</el-form-item>
<el-form-item label="平臺ID">
<el-input v-model="item.platformId" :key="index"></el-input>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
export default {
data() {
return {
title: "巡查內(nèi)容頁",
personObj: {
platform: "",
fanMount: "",
platformId: "",
},
platformNameList: [
{
platformName: "快手",
platformValue: "1",
},
{
platformName: "抖音",
platformValue: "2",
},
{
platformName: "淘寶",
platformValue: "3",
},
],
List: [
{
platform: "",
fanMount: "",
platformId: "",
},
],
};
},
methods: {
//深拷貝
cloneObj(obj) {
let ret;
if (Array.isArray(obj)) {
//創(chuàng)建一個空數(shù)組
ret = [];
for (let i = 0; i < obj.length; i++) {
ret[i] = this.cloneObj(obj[i]);
}
return ret;
} else if (Object.prototype.toString.call(obj) === "[object Object]") {
ret = {};
for (let i in obj) {
ret[i] = this.cloneObj(obj[i]);
}
return ret;
} else {
return obj;
}
},
//添加表單
addForm() {
let arr = this.cloneObj(this.personObj);
console.log("arr", arr);
this.List.push(arr);
},
//提交表單
submit() {
console.log("this.List", this.List);
},
},
};
</script>
代碼分析:
這里封裝了一個深拷貝函數(shù),每次點擊添加表單時就會拷貝一份我們定義好的對象,注意這個對象是由我們初始表單的value值組合起來的,我們在最外層用v-for遍歷數(shù)組List然后每次點擊"添加表單"就往數(shù)組里push一個對象,最后點擊"提交表單"按鈕,打印this.List就能看到整個的數(shù)組對象了,我們來試一下,選擇輸入以下值:

控制臺打印看下效果:

現(xiàn)在假如說有個需求是,指定添加幾項表單,而不是點一次加一次表單,效果如下,有三個按鈕,最開始顯示一個表單

當我點擊"3個"按鈕的時候,界面總共有三個表單,如下圖:

代碼如下:
<template>
<div>
<div style="margin: 10px 0">
<el-button type="primary" @click="add(3)">3個</el-button>
<el-button type="primary" @click="addForm">添加表單</el-button>
<el-button type="primary" @click="submit">提交表單</el-button>
</div>
<div v-for="(item, index) in List" :key="index">
<el-form ref="form" label-width="80px">
<el-form-item label="直播平臺">
<el-select
v-model="item.platform"
:key="index"
placeholder="請選擇直播平臺"
>
<el-option
:label="item2.platformName"
v-for="(item2, index2) in platformNameList"
:key="index2"
:value="item2.platformValue"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="粉絲量">
<el-input v-model="item.fanMount" :key="index"></el-input>
</el-form-item>
<el-form-item label="平臺ID">
<el-input v-model="item.platformId" :key="index"></el-input>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
export default {
data() {
return {
title: "巡查內(nèi)容頁",
personObj: {
platform: "",
fanMount: "",
platformId: "",
},
platformNameList: [
{
platformName: "快手",
platformValue: "1",
},
{
platformName: "抖音",
platformValue: "2",
},
{
platformName: "淘寶",
platformValue: "3",
},
],
List: [
{
platform: "",
fanMount: "",
platformId: "",
},
],
};
},
methods: {
cloneObj(obj) {
let ret;
if (Array.isArray(obj)) {
//創(chuàng)建一個空數(shù)組
ret = [];
for (let i = 0; i < obj.length; i++) {
ret[i] = this.cloneObj(obj[i]);
}
return ret;
} else if (Object.prototype.toString.call(obj) === "[object Object]") {
ret = {};
for (let i in obj) {
ret[i] = this.cloneObj(obj[i]);
}
return ret;
} else {
return obj;
}
},
add(a) {
this.addForm(a);
},
addForm(a) {
let arr = this.cloneObj(this.personObj);
console.log("arr", arr);
this.List.push(arr);
a--;
if (a > 0) {
this.addForm(a - 1);
}
},
submit() {
console.log("this.list", this.List);
},
},
};
</script>
<style>
</style>
代碼分析如下:
點擊按鈕的add方法的時候傳入總共的表單個數(shù),然后在添加表單的方法addForm里用了自減和判斷、遞歸來實現(xiàn)連續(xù)點擊時的拷貝等。然后我們試一下效果

控制臺打印看一下

到此這篇關(guān)于詳解Vue里循環(huán)form表單項實例的文章就介紹到這了,更多相關(guān)Vue循環(huán)form表單項內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue中computed和watch的區(qū)別小結(jié)
watch和computed都是以Vue的依賴追蹤機制為基礎的,當某一個依賴型數(shù)據(jù)發(fā)生變化的時候,所有依賴這個數(shù)據(jù)的相關(guān)數(shù)據(jù)會自動發(fā)生變化,即自動調(diào)用相關(guān)的函數(shù),來實現(xiàn)數(shù)據(jù)的變動,這篇文章簡單介紹下Vue中computed和watch的區(qū)別異同,感興趣的朋友一起看看吧2022-12-12
Vue路由監(jiān)聽實現(xiàn)同頁面動態(tài)加載的示例
本文主要介紹了Vue基于路由監(jiān)聽實現(xiàn)同頁面動態(tài)加載的示例,重點在于切換路由的時候,重新拉取列表數(shù)據(jù),接下來看看實現(xiàn)方法吧2021-05-05

