使用Typescript进行结构性开发(创建Table)

第一次写文章。。。哈哈哈

本来现在做的项目是多页面用Typescript+jquery来编写的

但随着开发量的增加发现多页面实在是愚蠢,之前也写过vue,可以说是非常之喜爱了。

但是基于页面的简单性还有项目强制要求用Ts,jQuery 于是乎就这么来了

进入正题:如何使用ts进行结构性的 开发,ts用过的童鞋都应该知道这是种面向对象语法所封装的js。是巨硬爸爸搞得事情

既然是面向对象那我们就得用OOP的方式来做

我是MVC的方式 mode,view,controller

先创建个mode class,咱这个table类用什么数据结构合适呢

首先table有哪些子类,thead->th | tbody->tr->td 这些是最基本的,一般就足够了。

这些子项中主要用到的,需要动态生成的,也就是 th tr td 了,所以将其组装成一个mode

export class TableMode{

    public ths:Map<string,string>;
    public tds:Map<string,string>[];    
    constructor(ths:Map<string,string>,tds:Map<string,string>[])
    {        
        this.ths = ths;       
        this.tds = tds;    
    }
}复制代码

没错就这么简单。。。足够了

为什么要用Map 呢,Map是es6新的语法中出现的数据结构,其由 <key,value>这两个参数所组成。一个map中可以存多个key,value对应的参数。

由于这个特质。我的td 就可以在排序上和th对应了[{<th,td><th,td><th,td><th,td>},{<th,td>...}

就是这样。。。当然我这是很愚蠢的做法,希望大家能给出更好的意见

之前th考虑只用数组就可以了,但是考虑到后期修改如果是纯数组的话,th参数动了td就要跟着修改所以就采用key,value的形式,这样改代码的时候只要修改th的value,key不需要动

这里写了个map的test,因为之前没怎么用过,这里贴一下

function test(){    let div:HTMLDivElement = <HTMLDivElement>document.getElementById("blocks-page");    let map:Map<string,string> = new Map();    let arr:Map<string,string>[] = new Array<Map<string,string>>();    let map1 = new Map();    map1.set('test','aaaaa1');    map1.set('test2','bbbbb1');    let map2 = new Map();    map2.set('test','aaaaa2');    map2.set('test2','bbbbb2');    arr.push(map2);    map.set('test','test1.0');    map.set('test2','test2.0');    arr.push(map1);    arr.push(map);    arr.forEach((tes)=>{        let i:number =1;        console.log(i++);        map.forEach((val,key)=>{            console.log(tes.get(key));        })    })}test();复制代码

1
aaaaa2
bbbbb2
1
aaaaa1
bbbbb1
1
test1.0
test2.0复制代码

以上是log

好了言归正传

Model层准备好了下一步view层,直接贴代码吧

export class TableView{    private table:HTMLTableElement;    private thead:HTMLTableSectionElement;    private tbody:HTMLTableSectionElement;    constructor(){        this.table = document.createElement('table');        this.thead  = document.createElement('thead');        this.tbody = document.createElement('tbody');        this.table.appendChild(this.thead);        this.table.appendChild(this.tbody);    }    start(div:HTMLDivElement,tableMode:TableMode){                tableMode.ths.forEach((th)=>{            let thv:HTMLTableHeaderCellElement = document.createElement('th');            thv.textContent = th;            this.thead.appendChild(thv);        });        tableMode.tds.forEach((tdMap)=>{            let tr:HTMLTableRowElement = document.createElement("tr");            tableMode.ths.forEach((val,key)=>{                let tdv:HTMLTableDataCellElement = document.createElement("td");                tdv.textContent = tdMap.get(key);                tr.appendChild(tdv);            })            this.tbody.appendChild(tr);        });        div.appendChild(this.table);    }    set className(className:string){        this.table.className = className;    }}复制代码

根据刚刚的例子,为了保证td和th对应,于是乎做了个这样的循环对比整好用map的get方法取对应的值。

set className是为了保证表格的样式,这里直接使用这个方法就可以改变表格样式了

最后使用方法

function test(){    let div:HTMLDivElement = <HTMLDivElement>document.getElementById("blocks-page");    let ths:Map<string,string> = new Map();    let tds:Array<Map<string,string>> = new Array<Map<string,string>>();    let map1 = new Map();    map1.set('test','aaaaa1');    map1.set('test2','bbbbb1');    let map2 = new Map();    map2.set('test','aaaaa2');    map2.set('test2','bbbbb2');    tds.push(map2);    ths.set('test2','test2.0');    ths.set('test','test1.0');    tds.push(map1);
    let tbmode:TableMode = new TableMode(ths,tds);    let tbview:TableView = new TableView();    tbview.className = "table cool table-hover";    tbview.start(div,tbmode);}test();复制代码

先创建mode的数据结构,将其传入view层,使用开始方法,生成表格




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值