詳解Vue返回值動態生成表單及提交數據的辦法
主要解決的問題
1、vue在循環的時候需要動態綁定不同的v-model;vue動態的表單,數據怎麼綁定呢?
2、動態表單上所有name屬性對應的鍵值對的形式提交到後端
一、後端返回的數據,提交到後端的數據格式如下:
// 後端返回的數據,根據返回類型用對應的組件 [ { "componentType": "input", "componentName": "username", "required": "1", // 提交時是否要必須填寫 "name": "姓名", }, { "componentType": "radio", "componentName": "sex", "required": "1", "name": "性別", "options": [ { "name": "男", "value": "0000" }, { "name": "女", "value": "1111" } ] } ] // 提交到服務器的數據格式 { username: '我的姓名', sex: '0000' // 對應”男“ }
二、vue前端代碼如下:
<template> <div class="page-container"> <div class="dynamic-content"> <div v-for="(item,idx) in infoList" :key="idx"> <input class="common-input" v-model="modelItems[idx]" v-if="item.componentType=='input'"> <van-radio-group v-model="modelItems[idx]" direction="horizontal" v-if="item.componentType=='radio'"> <van-radio :name="itemRadio.value" v-for="itemRadio in item.options" :key="itemRadio.value"> {{itemRadio.name}} </van-radio> </van-radio-group> </div> <div class="common-btn" @click="clickSubmit">提交數據</div> </div> </div> </template> <script> import Vue from 'vue' import { getListData } from '@/api/home' import { RadioGroup, Radio } from 'vant' Vue.use(Radio).use(RadioGroup) export default { data() { return { modelItems: {}, // vue在循環的時候需要動態綁定不同的v-model infoList: [] } }, mounted() { this.formKeyArr = [] this.getList() }, methods: { getList() { getListData() .then((res) => { const infoListData = res.infoList this.infoList = infoListData infoListData.forEach((item, index) => { // 保存屬性name和是否必填,後續提交數據用到 // { name: 'username', type: 1 }, { name: 'sex', type: 1} this.formKeyArr.push({ name: item.componentName, type: item.required }) }) }) .catch(() => { }) }, clickSubmit() { const postParams = {} // 提交的數據 let isCanSubmit = true this.formKeyArr.forEach((item, index) => { console.log('item=', item) if (item.type === '1' && !this.modelItems[index]) { // 所有require必須的標記符 // 請先填寫完成, toast請填寫完整 isCanSubmit = false } postParams[item['name']] = this.modelItems[index] }) if (isCanSubmit) { // 可以提交數據 // 可以拿到提交表單數據 // { username: '我的姓名', sex: '0000' // 對應”男“ } console.log('postParams=', postParams) } } } } </script> <style lang="scss"> </style>
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- vue封裝form表單組件拒絕重復寫form表單
- avue實現自定義搜索欄及清空搜索事件的實踐
- Node.js前後端交互實現用戶登陸的實踐
- vue表單驗證rules及validator驗證器的使用方法實例
- vue使用rules實現表單字段驗證