vue中form表单禁用专用组件

介绍了一个Vue组件JFormContainer,用于实现表单整体禁用功能,但不支持表单内iframe元素的禁用。该组件通过设置disabled属性来控制表单元素的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JFormContainer.vue

<template>
  <div :class="disabled?'jeecg-form-container-disabled':''">
    <fieldset :disabled="disabled">
      <slot name="detail"></slot>
    </fieldset>
    <slot name="edit"></slot>
    <fieldset disabled>
      <slot></slot>
    </fieldset>
  </div>
</template>

<script>
/**
   * 使用方法
   * 在form下直接写这个组件就行了,
   *<a-form layout="inline" :form="form" >
   *     <j-form-container :disabled="true">
   *         <!-- 表单内容省略..... -->
   *     </j-form-container>
   *</a-form>
   */
export default {
  name: 'JFormContainer',
  props: {
    disabled: {
      type: Boolean,
      default: false,
      required: false
    }
  },
  mounted () {
    console.log('我是表单禁用专用组件,但是我并不支持表单中iframe的内容禁用')
  }
}
</script>
<style>
  .jeecg-form-container-disabled{
    cursor: not-allowed;
  }
  .jeecg-form-container-disabled fieldset[disabled] {
    -ms-pointer-events: none;
    pointer-events: none;
  }
  .jeecg-form-container-disabled .ant-select{
    -ms-pointer-events: none;
    pointer-events: none;
  }

  .jeecg-form-container-disabled .ant-upload-select{display:none}
  .jeecg-form-container-disabled .ant-upload-list{cursor:grabbing}
  .jeecg-form-container-disabled fieldset[disabled] .ant-upload-list{
    -ms-pointer-events: auto !important;
    pointer-events: auto !important;
  }

  .jeecg-form-container-disabled .ant-upload-list-item-actions .anticon-delete,
  .jeecg-form-container-disabled .ant-upload-list-item .anticon-close{
    display: none;
  }
</style>


<template>
  <a-form layout="inline" :form="form" >
      <j-form-container :disabled="true">
        <!-- 表单内容省略..... -->
        <a-row class="form-row" :gutter="16">
          <a-col :lg="10" :md="10" :sm="20">
            <a-form-item label="文件">
              <a-button> <a-icon type="upload" /> 上传 </a-button>
            </a-form-item>
          </a-col>
        </a-row>
        <a-row class="form-row" :gutter="16">
          <a-col :lg="10" :md="10" :sm="20">
            <a-form-item label="文件">
              <a-button> <a-icon type="upload" /> 上传 </a-button>
            </a-form-item>
          </a-col>
        </a-row>
      </j-form-container>
    </a-form>
</template>

<script>
import JFormContainer from '@/components/jeecg/JFormContainer'
export default {
  components: {
    JFormContainer  
  },
  data () {
    return {
      form: this.$form.createForm(this)
    }
  },
  methods: {}
}
</script>

<style scoped>

</style>

回答: 在Vue中拼接form表单可以通过遍历表单项来实现。首先,你需要在data中定义一个form对象,用来存储表单数据。然后,在template中使用v-for指令来遍历formModel.parameters数组,这个数组包含了具体的表单项配置信息。根据每个表单项的type属性的不同,可以渲染不同类型的表单项,比如input和textarea。在el-form-item中使用v-if和v-else-if指令进行条件判断,根据item.type来选择不同的表单组件进行渲染。在表单组件中,使用v-model绑定form对象的对应属性,这样就能实现双向数据绑定。另外,可以根据item.isDisabled属性来设置表单项是否可禁用,根据item.rules属性来设置表单项的校验规则。最后,记得使用:key绑定唯一的key值,以便Vue能够正确地追踪每个渲染的表单项。整体来说,可以参考以下代码示例: ``` <template> <el-form ref="form" :model="form" label-position="top" size="mini"> <template v-for="(item, index) in formModel.parameters"> <el-form-item v-if="item.type == 'input'" :key="item.name" :label="item.CName" :prop="item.name" :rules="item.rules"> <el-input v-model="form[item.name]" :disabled="item.isDisabled"></el-input> </el-form-item> <el-form-item v-else-if="item.type == 'textarea'" :key="item.name" :label="item.CName" :prop="item.name" :rules="item.rules"> <el-input v-model="form[item.name]" type="textarea" :autosize="{ minRows:10 }" :disabled="item.isDisabled"></el-input> </el-form-item> ... </template> </el-form> </template> <script> export default { data() { return { form: {}, // 表单数据对象 formModel: StepMetadata.form1 // 表单配置模型 }; } }; </script> ``` 上述代码中,form对象用来存储表单数据,formModel是表单配置模型,通过StepMetadata.form1来获取具体的表单配置信息。根据formModel.parameters数组的长度,会动态地生成对应数量的表单项。在表单项的渲染过程中,根据item.type的值来判断表单项的类型,使用v-if和v-else-if指令进行条件判断。根据item.isDisabled属性来设置表单项是否可禁用,根据item.rules属性来设置表单项的校验规则。最后,使用v-model绑定form对象的对应属性,以实现双向数据绑定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值