vue+element中动态组件component的使用

动态生成表单

用法(来源于官网)

<!-- 动态组件由 vm 实例的 `componentId` property 控制 -->
<component :is="componentId"></component>

<!-- 也能够渲染注册过的组件或 prop 传入的组件 -->
<component :is="$options.components.child"></component>

prop(来源于官网)

  • is - string | ComponentDefinition | ComponentConstructor

  • inline-template - boolean

具体应用

  • 这里每个div.form-item是根据fields动态生成的表单块,这里的表单主要有input类型的、textarea类型的、select类型的、date类型的等等。
  • 我目前的需求是input类型、select类型、和时间选择类型的居多,因为select下面肯定是有option组件,所以我这里采用两级来动态生成组件
  • @timeChoose="handleChange这里用来处理二次封装的时间选择组件改变值时候的处理函数,其他的使用了element的组件的不需要这个方法
  • 自定义子组件RangeDatePicker 代码内容在这里不做展示了

<template>
	 <div v-for="field in fields"
	           :key="field.id"
	           class="form-item">
	        <el-form-item :label="field.label">
	          <component :is="field.type"
	                     :ref="field.propName+'Ref'"
	                     v-model="field.model"
	                     size="mini"
	                     :placeholder="field.placeholder"
             			 :proper-name="field.propName"
	                     @timeChoose="handleChange">
		            <component :is="field.typeOfChild"
		                       v-for="(item,index) in field.options"
		                       :key="index"
		                       :value="item.value"
             					 :proper-name="field.propName"
		                       :label="item.name"
		                       @timeChoose="handleChange" />
		          </component>
	        </el-form-item
	</div>
	<button @click="submitFilter">筛选</button>
</template>

<script>
//自定义组件引入
import RangeDatePicker from '@/components/RangeDatePicker/index.vue'
export default {
  name: 'OrganizationFilter',
  components: { RangeDatePicker },
  data() {
    return {
      fields: [{
        id: 10,//唯一标识
        type: 'el-input',   //组件名
        model: '',  //绑定的值
        defaultValue: '',    //默认值
        label: '组织名称',      //label
        propName: 'orgName',    //参数名称
        placeholder: '请输入',   //placeholder
        typeOfChild: null,    //子组件的类型
        options: null     //select组件下的option组件的取值
      }, {
        timeType: '',
        isShow: true,
        label: '创建日期',
        defaultValue: '',
        model: '',
        propName: 'createTime',
        componentType: 'range',
        typeOfChild: null,
        placeholder: '选择日期',
        options: null
      }, {
        id: 22,
        type: 'el-select',
        label: '状态',
        defaultValue: '',
        model: '',
        propName: 'zt',
        typeOfChild: 'el-option',
        options: [{ name: '全部', value: '' }, { name: '启用', value: 1 }, { name: '封存', value: 0 }]
      }]
    }
  },
  methods: {
    handleParams() {
      this.fields.forEach(elem => {
        if (elem.propName !== '') this.filterFrom[elem.propName] = elem['model']
      })
      if (this.fields.some(v => v.propName === 'cjrq')) {
        this.filterFrom.timeType = this.timeType
      }
      return this.filterFrom
    },
    // 查询
    submitFilter() {
      this.handleParams()
    },
    // 处理创建日期改变
    handleChange({ date, type }) {
      this.fields.map((item) => {
        if (item.propName === prop) {
          item.model = date
          item.timeType = type
        }
      })
    }
  }

}
</script>

<style lang="scss" scoped>
</style>


结果
在这里插入图片描述

可以通过在父组件引用子组件并调用子组件的方法来实现校验子组件的form表单。 首先,在子组件暴露一个校验方法,例如: ```javascript <template> <el-form ref="form" :model="formData" :rules="rules"> <!-- 表单内容 --> </el-form> </template> <script> export default { props: { value: { type: Object, default: () => {} } }, data() { return { formData: this.value, rules: { // 表单校验规则 } } }, methods: { validate() { return new Promise((resolve, reject) => { this.$refs.form.validate(valid => { if (valid) { resolve(this.formData); } else { reject(new Error('表单校验失败')); } }) }) } } } </script> ``` 然后,在父组件引用子组件,并调用子组件的校验方法,例如: ```html <template> <div> <child-component v-model="formData" ref="child"></child-component> <el-button type="primary" @click="validate">校验表单</el-button> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { formData: {}, } }, methods: { async validate() { try { const childFormData = await this.$refs.child.validate(); // 表单校验成功,可以对子组件的表单数据进行操作 } catch (error) { // 表单校验失败,可以进行相关处理 } } } } </script> ``` 在父组件,引用子组件并调用子组件的validate方法可以校验子组件的表单,如果校验成功,则返回子组件的表单数据,可以对其进行操作;如果校验失败,则可以进行相关处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值