詳解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的更多內容!

推薦閱讀: