使用element-ui二次封装一个可复用编辑表单组件

摘要:
源码:编辑表单组件组件源码(待优化)editForm.vue:˂!

源码:编辑表单组件

组件源码(待优化)editForm.vue:

<!-- 搜索表单 -->
<template>
    <el-form ref='editForm' :size="size" inline :label-  :model="editData" :rules="editRules">
        <el-form-item v-for='item in editCfg' :label="item.label" :prop='item.prop' :key="item.label"  >
            <!-- 输入框 -->
            <el-input v-if="item.type==='input'" v-model="editData[item.prop]"@change="item.change && item.change(editData[item.prop])":disabled="item.disabled && item.disabled(editData)":style="{item.width}"></el-input>
            <!-- 文本域 -->
            <el-input v-if="item.type==='textarea'" type="textarea":disabled="item.disabled && item.disabled(editData)"@change="item.change && item.change(editData[item.prop])"v-model="editData[item.prop]"  :style="{item.width}"></el-input>
            <!-- 下拉框 -->
            <el-select v-if="item.type==='select'" v-model="editData[item.prop]"@change="item.change && item.change(editData[item.prop])":disabled="item.disabled && item.disabled(editData)">
                <el-option v-for="op in item.options" :label="op.label" :value="op.value" :key="op.value"></el-option>
            </el-select>
            <!-- 单选 -->
            <el-radio-group v-if="item.type==='radio'" v-model="editData[item.prop]"@change="item.change && item.change(editData[item.prop])":disabled="item.disabled && item.disabled(editData)">
                <el-radio v-for="ra in item.radios" :label="ra.value" :key="ra.value">{{ra.label}}</el-radio>
            </el-radio-group>
            <!-- 单选按钮 -->
            <el-radio-group v-if="item.type==='radioButton'" v-model="editData[item.prop]"@change="item.change && item.change(editData[item.prop])":disabled="item.disabled && item.disabled(editData)">
                <el-radio-button v-for="ra in item.radios" :label="ra.value" :key="ra.value">{{ra.label}}</el-radio-button>
            </el-radio-group>
            <!-- 复选框 -->
            <el-checkbox-group v-if="item.type==='checkbox'" v-model="editData[item.prop]"@change="item.change && item.change(editData[item.prop])":disabled="item.disabled && item.disabled(editData)">
                <el-checkbox v-for="ch in item.checkboxs" :label="ch.value" :key='ch.value'>{{ch.label}}</el-checkbox>
            </el-checkbox-group>
            <!-- 日期 -->
            <el-date-picker v-if="item.type==='date'" v-model="editData[item.prop]"@change="item.change && item.change(editData[item.prop])":disabled="item.disabled && item.disabled(editData)"></el-date-picker>
            <!-- 时间 -->
            <el-time-select v-if="item.type==='time'" v-model="editData[item.prop]" type=''@change="item.change && item.change(editData[item.prop])":disabled="item.disabled && item.disabled(editData)"></el-time-select>
            <!-- 日期时间 -->
            <el-date-picker v-if="item.type==='dateTime'" type='datetime' v-model="editData[item.prop]"@change="item.change && item.change(editData[item.prop])":disabled="item.disable && item.disable(editData[item.prop])"></el-date-picker>
            <!-- 滑块 -->
            <!-- <el-slider v-if="item.type==='Slider'" v-model="editData[item.prop]"></el-slider> -->
            <!-- 开关 -->
            <el-switch v-if="item.type==='switch'" v-model="editData[item.prop]"@change="item.change && item.change(editData[item.prop])":disabled="item.disabled && item.disabled(editData)"></el-switch>
        </el-form-item>
    </el-form>
</template>

<script>export default{
    props:{
        
        labelWidth:{
            type:String,
            default:'100px'},
        size:{
            type:String,
            default:'mini'},
        editCfg:{
            type:Array,
            default:()=>[]
        },
        editData:{
            type:Object,
            default:()=>{}
        },
        editRules:{
            type:Object,
            default:null}
    },
    data () {
        return{
            that:this};
    },
    methods:{
        //getThat(){
        //this.$emit('that',this)
        //}
}

}

</script>
<style>

</style>
View Code

页面调用:该组件嵌在弹窗组件之中,所以和之前的弹窗组件一样

<template>
  <div class="ces-main">
    <!-- 搜索 -->
    <ces-search 
      :that='that'size='mini'labelWidth = '50px':searchData = "searchData":searchForm = "searchForm":searchHandle="searchHandle"></ces-search>

    <!-- 操作表格 -->
    <ces-table 
      :that='that'size='mini':isSelection='true':isIndex='true':isPagination='true':isHandle='true':tableData='tableData':tableCols='tableCols':tableHandles='tableHandles':tablePage='tablePage'></ces-table>

    <!-- 弹窗 -->
    <ces-modal width='450px':that='that' :modalCfg='modalCfg'>
        <ces-edit ref='cesEdit' :that='that':editCfg='editForm':editData='editData':editRules='editRules' ></ces-edit>
      </ces-modal>
  </div>
</template>

<script>import cesSearch from '@/components/common/Form/searchForm'import cesTable from '@/components/common/Table/Table'import cesModal from '@/components/common/Modal/Modal'import cesEdit from '@/components/common/Form/editForm'import { createNamespacedHelpers } from 'vuex'const { mapGetters, mapActions } = createNamespacedHelpers('Base')

export default{
  data () {
    return{
      that:this}
  },
  components:{
    cesTable,
    cesSearch,
    cesModal,
    cesEdit
  },
  computed:{
    ...mapGetters([
      'searchData','searchForm','searchHandle',
      'loading','tableData','tableCols','tableHandles','tablePage',
      'modalCfg',
      'editForm','editData','editRules'])
  },
  methods:{
    ...mapActions(['init','showEditModal','hideEditModal','getData','resetData','validateAdd','confirmDel','validateEdit'])
  }
}
</script>

<style>

</style>

最终运行效果:

使用element-ui二次封装一个可复用编辑表单组件第1张

补充说明:

本篇文章是我基于element-ui制作脚手架项目的其中一部分,使用了vuex做数据管理,直接复制是跑不起来的。

我写了一个小例子,可直接复制:

使用element-ui二次封装一个可复用编辑表单组件第2张

运行结果:

使用element-ui二次封装一个可复用编辑表单组件第3张

免责声明:文章转载自《使用element-ui二次封装一个可复用编辑表单组件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇01 HDFS 简介Linux内核数据结构hlist_head下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

百度地图常用 获取中心点 缩放级别等

功能一:获取map地图窗口的可视区域: var map = new BMap.Map("allmap");            // 创建Map实例 map.centerAndZoom(new BMap.Point(116.4035,39.915), 14);  //初始化时,即可设置中心点和地图缩放级别。 var bs = map.getBound...

jsp导出excel 解决文件名中文乱码

WritableWorkbook wwb=null; WritableSheet ws=null; OutputStream os = response.getOutputStream(); wwb = Workbook.createWorkbook(os); ws=wwb.createSheet("员工编号",0); ws.getSettings().s...

WEB UI篇——还HTML标签以本来意义

好文不仅要推荐,还要收藏,原文来自:http://www.cnblogs.com/CoreCaiNiao/archive/2011/06/19/2084651.html 说句实话,“DIV+CSS”这个词汇不知道害了多少人,也许其提出者本意并没有错,但是跟风者从表现曲解了其意思,认为整个页面就应当是DIV+CSS文件的组合。这样做,对于视觉上并没有什么影响...

ES terms 聚合功能理解

本文介绍 ES(ES7.8.0) 里面两种不同的聚合统计,cardinality aggregations 和 terms aggregations。为了方便理解,以 MySQL 表的示例数据来讲解 ES 的这两个聚合功能。MySQL 表结构如下: CREATE TABLE `es_agg_test` ( `id` int(11) NOT NULL A...

uniapp @change事件传多个参数

<checkbox-group @change="checkboxChange($event,item.id)"> <checkbox :value="item.id" :checked="item.isChecked" /> </checkbox-group> checkboxChange: function(...

avue+elementui中form中表单label调整

首先我用的bladex,前端采用elementui+avue来做的 需求:label内容过长,我要调整label宽度不至于让他换行 首先看了elementui的文档 发现没有效果,然后看了avue文档, 设置之后生效,但是始终不在一行,我在option属性中设置了:labelWidth:"120px;", 无论怎么调整。后面改成labelWidth:...