【组件】自定义表单组件

引用页面 demo.html

<!DOCTYPE html>
<html lang="zh-cmn-Hans">

<head>
    <title></title>
    <meta charset="utf-8" />
    <script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/2.6.14/vue.js"></script>
    <script src="https://cdn.staticfile.net/jquery/1.10.2/jquery.min.js"></script>
    <script src="./comform.js"></script>
    <link rel="stylesheet" href="./comform.css">
</head>
<style>
    html,
    body,
    * {
        margin: 0;
        padding: 0;
    }

    .fg {
        width: 100%;
        height: 1px;
    }

    .m_b_30 {
        margin-bottom: 30px;
    }
</style>

<body>
    <div id="divPage" v-cloak>
        <com-form :id="id1" :columns="columnsNew" :data="dataList"></com-form>
        <div class="fg m_b_30"></div>
        <com-form :id="id2" :columns="columnsNew1" :data="dataList">
            
        </com-form>

    </div>
    <script type="text/javascript " src="demo.js "></script>
</body>

</html>

引用页面js demo.js

 
var vm = new Vue({
	el: "#divPage", 
	data: { 
		id1:'comTable',
		id2:'comTable1',
		dataList:{
			"name": "咯咯",
			"type": "1",
			"id": "44545232",
			"limitFirst": "",
			"limitSecond": "",
			"limitThird": "",
			"limitFour": "",
			"limitFive": "",
			"dateTime": "202405062100",
			"value": "于2024年05月06日21时00分起运行超过60分钟",
			"companyId": "40987627",
			"startTime": "20240506210000",
			"endTime": "20240506233000",
			"exTime": "2小时30分钟",
			"companyName": "科技有限公司",
			"orgId": "1324",
			"orgName": "x县",
			"industryId": "32",
			"industryName": "金属制品",
			"portName": "",
			"companyTypeName": "一般排污单位",
			"declareId": null,
			"manageObjId": "543295914424325212244",
			"verifyStatus": "wsb",
			"statusName": "未",
			"differTime": "934200"
		},
		columnsNew:[
			{rowspan:1,key: "name",title: "名称"},
			{rowspan:1,key: "type",title: "编号"},
			{rowspan:1,key: "dateTime",title: "发送时间"},
			{rowspan:1,key: "value",title: "描述"},
			{rowspan:1,key: "startTime",title: "发生时间"},
			{rowspan:1,key: "endTime",title: "结束时间"},
			{rowspan:1,key: "exTime",title: "持续时间"},
			{rowspan:1,key: "companyName",title: "a名称"},
			{rowspan:2,key: "orgName",title: "机构名称"},
			{rowspan:1,key: "industryName",title: "行业名称"},
			{rowspan:1,key: "portName",title: "排口名称"},
			{rowspan:1,key: "companyTypeName",title: "企业名称"},
			{rowspan:1,key: "verifyStatus",title: "状态编码"},
			{rowspan:1,key: "statusName",title: "状态名称"},
		],
		columnsNew1:[
			{rowspan:1,key: "name",title: "名称",slot:'myName'},
			{rowspan:1,key: "type",title: "编号"},
			{rowspan:1,key: "dateTime",title: "发送时间"},
			{rowspan:2,key: "value",title: "描述"},
			{rowspan:1,key: "startTime",title: "发生时间"},
			{rowspan:1,key: "endTime",title: "结束时间"},
			{rowspan:1,key: "exTime",title: "持续时间"},
			{rowspan:2,key: "companyName",title: "a名称"},
			{rowspan:1,key: "orgName",title: "机构名称"},
			{rowspan:1,key: "industryName",title: "行业名称"},
			{rowspan:1,key: "portName",title: "排口名称"},
			{rowspan:1,key: "companyTypeName",title: "企业名称"},
			{rowspan:1,key: "verifyStatus",title: "状态编码"},
			{rowspan:1,key: "statusName",title: "状态名称"},
		]
	},
	mounted: function () { 
	},
	methods: {
	 
	 
	}
});

组件js comform.js

Vue.component("com-form", {
    data: function () {
        return {
            colDiv: [],
        };
    },
    //父组件传值
    props: {
        columns: {
            type: Array,
            default: [{
                rowspan: 1, //占比 1/2
                key: '',
                title: '',
            }],
            required: true
        },
        data: {
            type: Object,
            default: {}
        },
        id: {
            type: String,
            default: 'comTable'+ (new Date()).valueOf() + Math.round(Math.random() * 1000),
            required: true
        },
        colNum: {
            type: Number,
            default: 2
        },

    },
    mounted: function () {
        var v_ = this; 
        v_.initTable();
    }, 
    methods: {
        initTable() {
            var v_ = this;
            var n = 0;
            var html = '';
            for (let i = 0; i < v_.columns.length; i++) {
                const item = v_.columns[i]; 
                if (n == 0) {
                    html += `<tr>`
                }
                if (item.rowspan && item.rowspan != 1) { 
                    if (n + item.rowspan > v_.colNum) {
                        var neH = `<tr>
                        <td class="tableTitle">${item.title}</td>`
                        if(item['slot']){
                            neH += `<td colspan="${item.rowspan+1}"><slot name="${item.slot}" :data="${v_.data[item.key]}"></slot></td>
                            </tr>`
                        }else{
                            neH += `<td colspan="${item.rowspan+1}">${v_.data[item.key]}</td>
                            </tr>
                            `
                        }
                        $(`#${v_.id}`).append(neH);
                    } else {
                        html += `<td class="tableTitle">${item.title}</td>`
                        if(item['slot']){
                            html += `<td colspan="${item.rowspan+1}"><slot name="${item.slot}" :data="${v_.data[item.key]}"></slot></td>` 
                        }else{ 
                            html += `<td colspan="${item.rowspan+1}">${v_.data[item.key]}</td>`
                        }
                        n += item.rowspan
                    }
                } else {
                    html += `<td class="tableTitle">${item.title}</td>`
                    if(item['slot']){
                         html += `<td><slot name=${item.slot} mode="open" data=${v_.data[item.key]}></slot></td>` 
                     }else{
                        html += `<td>${v_.data[item.key]}</td>`
                    }
                    n++
                }
                if (n >= v_.colNum) {
                    html += `</tr>`
                    $(`#${v_.id}`).append(html); 
                    // $(`#${v_.id}`).append(<slot></slot>); 
                    n = 0;
                    html = ''
                } 
            }
 
           
        }
    },
    destroyed() {},
    template: `<table :id="id" class="comTable"></table>`
}); 

组件样式 comform.css


html,body{
    width: 100%;
    height: 100%;
} 


.comTable{
    width: 100%;			
    border: 1px solid #E1E7EE;
    margin: 0 auto;
    border-spacing:0 ;
    border-collapse: collapse;
}
.comTable td{				
    border: 1px solid #E1E7EE;
    padding: 10px;
    position: relative;
}
.comTable .tableTitle{
    width: 150px;text-align: right;background-color: #F8FBFC;font-size: 16px;
} 

效果

在这里插入图片描述
注:这是个半成品 ,有时间会继续修改补充。

问题1:slot部分没有解析具体如下:
在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*阿漓*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值