Vue 学习随笔系列七 -- 表单动态生成

这篇具有很好参考价值的文章主要介绍了Vue 学习随笔系列七 -- 表单动态生成。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

表单动态生成


1、动态表单组件封装

<!-- 动态生成下拉框,可同理生成input框等 -->
<template>
  <el-dialog
    custom-class="custom-dialog"
    :title="dialogTitle"
    :visible.sync="visible"
    :close-on-click-modal="false"
    :close-on-press-escape="false"
    :before-close="handleClose"
    width="40%" 
  >
    <el-form 
      :model="form"
      ref="Form"
      label-width="80px"
    >
      <el-form-item
        v-for="(item, index) in formConfig"
        :key="index"
        :label="item.label"
      >
        <el-select
          clearable
          size="small"
          multiple
          v-model="formConfig[index].result.value"
          placeholder="请选择"
          style="width: 90%;"
          @change="val=>handelChange(val, index)"
          @clear="val =>handelClear(val, index)"
        >
        <el-option
          v-for="data in item.option"
          :key="data.code"
          :label="data.label"
          :value="data.code"
        >
        </el-option>
      </el-select>
      </el-form-item>

    </el-form>

    <div slot="footer" class="dialog-footer">
      <el-button size="small" @click="handleClose">取消</el-button>
      <el-button size="small" type="primary" @click="handleSubmit">确定</el-button>
    </div>

  </el-dialog>
  
</template>

<script>

  export default {
    data() {
      return {
        dialogTitle: "动态表单",
        visible: false,
        arr: [], // 回显参数
        form: {},
        formConfig: [
          {
            option: [
              {
                code: 1,
                label: '选项1'
              },
              {
                code: 2,
                label: '选项2'
              },
              {
                code: 3,
                label: '选项3'
              }
            ],
            result:{
              label:'',
              value:''
            }
          },
        ],
      }
    },
    // computed(){},
    methods: {
      // 打开弹窗
      handleOpen() {
        this.visible = true
      },
      // 关闭弹窗
      handleClose(){
        this.visible = false
      },
      handelChange(val,index){
        console.log("val==", val)
        if(val.length){//多选
          this.format2(val,index)
        } else {//单选
          this.format1(val,index)
        }                
      },
      // 清空多选框
      handelClear(val, index){
        if(!val){
          const newInitValue = this.formConfig.slice(0, index+1)
          this.formConfig = [...newInitValue]
          return
        }
      },
      //单选
      format1(val,index){
        if(!val){
          const newInitValue = this.formConfig.slice(0, index+1)
          this.formConfig = [...newInitValue]
          return
        }
        const label = this.formConfig[index].option.find(item=>item.code===val).label
        this.$set(this.formConfig[index],'result',{
          label,
          value: val
        })
        this.queryItems(index)
      },
      //多选
      format2(val, index){
        let label = []
        console.log("val.length", val)
        for(let i = 0; i< val.length; i++) {
          this.formConfig[index].option.find( item => {
            if(item.code === val[i]){
              label[i] = item.label
            }
          })
        }

        this.$set(this.formConfig[index], 'result', {
          label,
          value: val
        })
        const params = {index: index, code: val}
        this.getSonList(params)
      },
      //
      // queryItems(index){
      //   const temp = {
      //       option: [
      //         {
      //           code: 1,
      //           label: '选项1'
      //         },
      //         {
      //           code: 2,
      //           label: '选项2'
      //         },
      //         {
      //           code: 3,
      //           label: '选项3'
      //         }
      //       ],
      //       result:{
      //         label:'',
      //         value:''
      //       }
      //     }
      //   this.$set(this.formConfig, index+1, temp)
      // },
      handleSubmit() {
        const temp = this.formConfig.map(item=>item.result)
        let formParams = temp.slice(-2, -1) // 取数组倒数第二位值

        console.log(formParams)

        const params = formParams
        this.$emit('handleSubmit', params)
        this.handleClose()
      },
      // 获取一级科目
      // 获取一级科目
      getList(){
        console.log("getFirstList===")
        // getFirstList().then(res => {
        //   console.log('res===', res)
        //	 const temp = {
        // 		option: res.option,
        //		result: {
        //		label: "",
        //		value: "",
        //   }
        // 	 this.$set(this.formConfig, 0, temp) // 配置第一个下拉框选项
        // })
      },
      getSonList(value){
        console.log("getsonList====", value)
        // const params = {kmcode: value}
        // getsonLists(params).then(res => {
        //   console.log("res==", res)
        //	 const temp = {
        // 		option: res.option,
        //		result: {
        //		label: "",
        //		value: "",
        //   }
        // 	 this.$set(this.formConfig, index + 1, temp) // 配置后续下拉框选项
        // })
        let index = value.index
        // let code = value.code
        const temp = {
          option: [
            {
              code: 1,
              label: '选项1'
            },
            {
              code: 2,
              label: '选项2'
            },
            {
              code: 3,
              label: '选项3'
            }
          ],
          result:{
            label:'',
            value:''
          }
        }
        this.$set(this.formConfig, index+1, temp)
      }
    },
  }
</script>

2、组件引用

<template>
  <div class="main">
    <div class="form-box">
      <el-input
        v-model="value"
        clearable
        style="width: 20%;"
      ></el-input>
      <el-button type="primary" @click="handleOpen()">表单</el-button>
      <MultiForm ref="form" @handleSubmit="handleSubmit"></MultiForm>
    </div>     
  </div>
  
</template>

<script>
import MultiForm from "./multiSelect.vue"

export default {
  name: 'HelloWorld',
  components: {
    MultiForm
  },
  props: {

  },
  data(){
   return {
    value: '', // input输入框的值
   }     
  },
  mounted(){
  },
  methods: {
    handleOpen(){
      this.$refs.form.handleOpen()
    },
    handleSubmit(val){
      console.log("val==", val)
      let arr = val[0].label
      this.value = arr.toString()
    }
  }
}
</script>

<style>

</style>

3、实现效果

点击上一个选项,选中后出现下一个下拉框,并将最后一个数据回显到输入框中
Vue 学习随笔系列七 -- 表单动态生成,vue.js,学习,javascript
Vue 学习随笔系列七 -- 表单动态生成,vue.js,学习,javascript文章来源地址https://www.toymoban.com/news/detail-758974.html

到了这里,关于Vue 学习随笔系列七 -- 表单动态生成的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue.js学习详细课程系列--共32节(6 / 6)

    29. 组件:参数验证 知识点 props:组件参数验证语法 组件的数据 为组件中接受到的变量进行逻辑验证。 综合例 30. 组件:事件传递 知识点 v-on $emit v-on 侦听组件事件,当组件触发事件后进行事件处理。 $emit 触发事件,并将数据提交给事件侦听者。 综合例 31. 组件:slot插槽 知

    2023年04月08日
    浏览(27)
  • Vue.js学习详细课程系列--共32节(2 / 6)

    07. 过滤器 知识点 filters filters 格式化变量内容的输出。(日期格式化,字母大小写,数字再计算等等) 08. 计算属性 知识点 computed computed 处理元数据,便于进行二次利用。(比如:消费税自动计算功能) 09. 观察属性 知识点 $watch $watch 与computed属性类似,用于观察变量的变化

    2023年04月09日
    浏览(22)
  • vue拖拉拽生成表单

    很久没有写总结了 今天总结一下近期用到的拖拉拽 何为拖拉拽 就是随便拖拉 然后生成代码和页面  也简称低代码平台 有一些比较大的公司 都会用到这些 话不多少  一步一步的走下去吧  先看下基础页面吧  首先是基于element from  依赖下载 1. 2. 3. 4. 5. 然后看下目录吧 

    2024年02月16日
    浏览(28)
  • Vue.js表单输入绑定

    对于Vue来说,使用v-bind并不能解决表单域对象双向绑定的需求。所谓双向绑定,就是无论是通过input还是通过Vue对象,都能修改绑定的数据对象的值。Vue提供了v-model进行双向绑定。本章将重点讲解表单域对象的双向绑定方法和技巧。 10.1  实现双向数据绑定 对于数据的绑定,

    2024年02月06日
    浏览(52)
  • Vue2显示动态添加表单

    提交方法:  

    2024年02月09日
    浏览(29)
  • vue+element UI动态增减表单

        写在前面: 因为最近有个需求,需要新增联系人,而联系人数量并不确定,需要根据需要添加表单,一个联系人对应一个表单。    效果是这样的:     思路: ①写个div,把表单放在里面,旁边放2个按钮,添加和删除,且只有1个元素的时候不能显示删除按钮        

    2024年02月11日
    浏览(38)
  • vue3 +element动态表单实现

    可以直接复制,接口看后端 父页面 子页面

    2024年02月15日
    浏览(31)
  • Vue + Element ui 实现动态表单,包括新增行/删除行/动态表单验证/提交功能

    原创/朱季谦 最近通过Vue + Element ui实现了动态表单功能,该功能还包括了动态表单新增行、删除行、动态表单验证、动态表单提交功能,趁热打铁,将开发心得记录下来,方便以后再遇到类似功能时,直接拿来应用。 简化的页面效果图如下: 最开始,我是用了纯粹的表格形

    2024年02月04日
    浏览(43)
  • vue+element,form循环嵌套表单 、动态添加表单、嵌套表单自定义校验规则

    原文发布链接:https://juejin.cn/post/7181752966611730492 需求: 可点击新增,自动添加表单。(这个不难v-for即可) 可自定义方法校验添加的表单内容。(需要掌握element组件的规则,本人没有熟读官网,碰壁好多次才整理出来这篇文章。重要的事说3遍: 看官网看官网看官网 ) 效果

    2024年02月04日
    浏览(61)
  • Ant vue中表单验证(动态校验、部分校验)

    前提 :写了超级复杂的表单,其中涉及了很多表单验证的地方,现一一记录一下; ant-vue 版本1.7.8 vue 版本2.6.11 校验的原理大体相似,灵活应用!! 需求: 1根据 读写方式 去动态自动校验规则; 2.只是监听挂载路径,但因嵌套太多,表单监听的表单域不满足自动监听的条件

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包