PrimeNG源码解析

首先很多人向我推荐这个库了。兼容到手机端的 Angular 库,稳定强大。
但当我看到这个官网的时候,还是被吓了一跳,这是个什么鬼东西?
primefaces.org

看了这个依赖以后,更加无力吐槽了。

 "devDependencies": {
    "@angular/animations": "^4.2.0",
    "@angular/cli": "1.1.0",
    "@angular/common": "^4.2.0",
    "@angular/compiler": "^4.2.0",
    "@angular/compiler-cli": "^4.2.0",
    "@angular/core": "^4.2.0",
    "@angular/forms": "^4.2.0",
    "@angular/http": "^4.2.0",
    "@angular/language-service": "^4.2.0",
    "@angular/platform-browser": "^4.2.0",
    "@angular/platform-browser-dynamic": "^4.2.0",
    "@angular/router": "^4.2.0",
    "@types/jasmine": "2.5.45",
    "@types/node": "~6.0.60",
    "chart.js": "2.1.3",
    "codelyzer": "~3.0.1",
    "core-js": "^2.4.1",
    "del": "^2.2.0",
    "font-awesome": "4.7.0",
    "fullcalendar": "^3.1.0",
    "gulp": "^3.9.1",
    "gulp-concat": "^2.6.0",
    "gulp-flatten": "^0.2.0",
    "gulp-rename": "^1.2.2",
    "gulp-uglify": "^1.5.3",
    "gulp-uglifycss": "^1.0.6",
    "install": "^0.10.1",
    "intl": "^1.2.5",
    "jasmine-core": "~2.6.2",
    "jasmine-spec-reporter": "~4.1.0",
    "jquery": "^3.1.1",
    "karma": "~1.7.0",
    "karma-chrome-launcher": "~2.1.1",
    "karma-cli": "~1.0.1",
    "karma-coverage-istanbul-reporter": "^1.2.1",
    "karma-jasmine": "~1.1.0",
    "karma-jasmine-html-reporter": "^0.2.2",
    "moment": "^2.17.1",
    "npm": "^5.0.1",
    "prismjs": "^1.6.0",
    "protractor": "~5.1.2",
    "quill": "^1.1.8",
    "rxjs": "^5.1.0",
    "ts-node": "~3.0.4",
    "tslint": "~5.3.2",
    "typescript": "~2.3.3",
    "web-animations-js": "^2.2.2",
    "zone.js": "^0.8.4"
  }

打眼一看,这不就是 MD+Bootstrap 么。。。尴尬,他们自己写的。不过开源项目就像实习生一样,犯了错误也可以让大家轻易原谅。

不过话说bootstrap 都 beta 了,是不是应该顺势做了个 ng-bootstrap4呢,哈哈想想也不错。国内有了antD 基本没其他 UI 库的活头了,这绝对是 Bootstrap 给让出来的机会。可耻。

分析

总不能打着大旗不干正事儿,分析还是要有的。直奔 prime-ng/src/app

两个文件夹 component / showcase 一个是组件源码,一个是组件 demo 以及官网本身。所以当你组里的老大逼你写 Angular 组件的时候,你可以过来 copy 一两个当做周报内容,虽然 CSS 和 template 需要用其他小伙伴写好的样式。ts 的处理方式总会能给你些启发。

假如你现在正在写一个进度条组件

primeng/src/app/components/progressbar/progressbar.ts

打开一看,这么简单

@Component({
    selector: 'p-progressBar',
    template: `
        <div class="ui-progressbar ui-widget ui-widget-content ui-corner-all" role="progressbar" aria-valuemin="0" [attr.aria-valuenow]="value" aria-valuemax="100">
            <div class="ui-progressbar-value ui-progressbar-value-animate ui-widget-header ui-corner-all" [style.width]="value + '%'" style="display:block"></div>
            <div class="ui-progressbar-label" [style.display]="value ? 'block' : 'none'" *ngIf="showValue">{{value}}{{unit}}</div>
        </div>
    `
})
export class ProgressBar {
    @Input() value: any;
    @Input() showValue: boolean = true;
    @Input() unit: string = '%';   
}

@NgModule({
    imports: [CommonModule],
    exports: [ProgressBar],
    declarations: [ProgressBar]
})
export class ProgressBarModule { }

当然,也不能全看这个了,当你知道写这段代码的是一个不到20岁的小毛头小子的时候,你一定会三思而行的。

比如比较核心的部分

            <div class="ui-progressbar-value ui-progressbar-value-animate ui-widget-header ui-corner-all" [style.width]="value + '%'" style="display:block"></div>

首先,这个 [style.width] 的值是 value + % 是什么鬼,学前端两天的新手都知道这么拼接字符串不光蠢,bug 百出。Angular 本身提供了 width.<unit>的写法
[style.width.%]=value 会更好一点点吧。

另外,display:block 是吓唬谁呢?

最最离谱的是,为啥这是个单项的组件呢?我如何让我的进度条跟其他组件互动呢?

所以吧。拿个有技术含量的出来看一看吧(。。。这浪费了我老长时间)

可以试着提问一下。

  1. 主题系统怎么实现的?
  2. 例子中源码和效果怎么分割的
  3. 如何处理的组件之间的事件流
  4. 如何自定义组件接口

我本来吧,想着他这个官网怎么看也算是有点技术含量的东西,于是看了一下某个组建的页面,吓死老子了。

[大家欣赏一下](https://github.com/primefaces/primeng/blob/master/src/app/showcase/components/accordion/accordiondemo.html

中间的源码部分,竟然用了手动转码,哈哈哈哈

最后

吐槽归吐槽,PrimeNG 给我们最大的帮助其实不是他的源码,而是组件 list。70多个啊,当然不会像 React 那样细碎到3000+,但这些足矣支撑各种开发场景了。

列一列,也算是没白看这个。

输入框 22个

Form

按钮 2 个

Button

数据处理 13个

Data

面板容器 6个

Panel

遮罩容器 5个

Model

文件上传 1个 不截图了,不知为啥大家都喜欢做这个

菜单栏11个

Menu

表格 7 个 基于 chartjs@2.0 做的

Table

信息容器 2个

Message

多媒体 1个

拖拽 1个

小杂货 10个

Misc
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • Bootstrap是什么? 一套易用、优雅、灵活、可扩展的前端工具集--BootStrap。GitHub上介绍 的...
    凛0_0阅读 10,861评论 3 184
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,737评论 1 92
  • 第5章 菜单、按钮及导航 一、下拉菜单 小伙伴们注意,在Bootstrap框架中的下拉菜单组件是一个独立的组件,根...
    凛0_0阅读 4,950评论 0 66
  • recite words 有很多小伙伴初期想学习语法,这里有相关资料,可以参考参考英语工具书 密码: 44iv t...
    仇诺伊阅读 1,060评论 4 2
  • 前几天,参加了单位的质量管理体系检查,单位的质量管理主要的目的提供给顾客需要的产品,进而在生产的各个环节进行质量标...
    春暖花开jl阅读 280评论 0 0