React中如何引入Angular组件详解


Posted in Javascript onAugust 09, 2018

前言

为了在我的编辑器中使用 Angular,我用 Angular 编写了一个重命名功能。而为了使用它,我得再次使用一次 customEvent ,而在这个微前端架构的系统中,其事件通讯机制已经相当的复杂。在这部分的代码进一步恶化之前,我得尝试有没有别的方式。于是,我想到了之前在其它组件中使用的 Web Components 技术,而 Angular 6 正好可以支持。

下面话不多说了,来一起看看详细的介绍吧

HTML 中引入 Web Components

我所需要做的事情也相当的简单,只需要将我的组件注册为一个 customElements,稍微改一下 app.module.ts 文件。在这种情况之下,我们就可以构建出独立于框架的组件。

如下是原始的 module 文件:

@NgModule({
 declarations: [AppComponent],
 imports: [BrowserModule],
 bootstrap: [AppComponent]
})
export class AppModule { }

如下则是新的 module 文件:

@NgModule({
 declarations: [InteractBar],
 imports: [BrowserModule],
 entryComponents: [InteractBar]
})
export class AppModule {
 constructor(private injector: Injector) {
 const interactBar = createCustomElement(InteractBar, {injector});
 customElements.define('interact-bar', interactBar);
 }
}

然后,只需要就可以在 HTML 中传递参数: <interact-bar filename="phodal.md"></interact-bar> ,或者监听对应的 @Output 事件:

const bar = document.querySelector('interact-bar');
bar.addEventListener('action', (event: any) => {
 ...
})

事实证明,使用 Angular 构建的 Web Components 组件是可以用的。于是,我便想,不如在 React 中引入 Angular 组件吧。

React 中引入 Angular 组件

于是,便使用 create-react-app 创建了一个 DEMO,然后引入组件:

<div className="App">
 <header className="App-header">
 <img src={logo} className="App-logo" alt="logo" />
 <h1 className="App-title">Welcome to React</h1>
 </header>
 <p className="App-intro">
 To get started, edit <code>src/App.js</code> and save to reload.
  <interact-bar filename="phodal.com" onAction={this.action}></interact-bar>
 </p>
</div>

嗯,it works。至少 filename 参数可以成功地传递到 Angular 代码中,而 action 在当前似乎还不行。但是毫无疑问,它在未来是可用的。

Demo 见: https://phodal.github.io/wc-angular-demo/

Repo 见: https://github.com/phodal/wc-angular-demo

这个时候,我遇到了一个问题,我使用 Angular 构建的这个组件,大概是有 257kb。这个大小的组件,但是有点恐怖。

Web Components 框架构建组件

在那些微前端相关的文章中,我们指出类似于 Stencil 的形式,将组件直接构建成 Web Components 形式的组件,随后在对应的诸如,如 React 或者 Angular 中直接引用。

如下是一个使用 Stencil 写的 Web Components 的例子:

@Component({
 tag: 'phodit-header',
 styleUrl: 'phodit-header.css'
})
export class PhoditHeader {
 @State() showCloseHeader = false;

 componentDidLoad() {...}
 handleClick() {...}

 render() {
 if (this.showCloseHeader) {...}
 return (<div></div>);
 }
}

使用它构建出来的组件,大概可以在 30kb 左右的大小。

不论是不是一个经量级的方案,但是它至少证明了组件复用的可行性。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
基于jQuery的仿flash的广告轮播
Nov 05 Javascript
通过javascript获取iframe里的值示例代码
Jun 24 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
May 07 Javascript
js带点自动图片轮播幻灯片特效代码分享
Sep 07 Javascript
浅析JavaScript作用域链、执行上下文与闭包
Feb 01 Javascript
再谈Javascript中的异步以及如何异步
Aug 19 Javascript
基于bootstrap风格的弹框插件
Dec 28 Javascript
URL中“#” “?” &amp;“”号的作用浅析
Feb 04 Javascript
详解Angular2中Input和Output用法及示例
May 21 Javascript
JavaScript实现自动跳转文本功能
May 25 Javascript
js实现图片放大展示效果
Aug 30 Javascript
RequireJS用法简单示例
Aug 20 Javascript
jQuery 实现批量提交表格多行数据的方法
Aug 09 #jQuery
详解js的视频和音频采集
Aug 09 #Javascript
Angular中的ng-template及angular 使用ngTemplateOutlet 指令的方法
Aug 08 #Javascript
深入理解Promise.all
Aug 08 #Javascript
vue js秒转天数小时分钟秒的实例代码
Aug 08 #Javascript
vue devtools的安装与使用教程
Aug 08 #Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
Aug 08 #jQuery
You might like
批量去除PHP文件中bom的PHP代码
2012/03/13 PHP
Parse正式发布开源PHP SDK
2014/08/11 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
composer.lock文件的作用
2016/02/03 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
jQuery aminate方法定位到页面具体位置
2013/12/26 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
2015/08/21 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
JS DOM实现鼠标滑动图片效果
2020/09/17 Javascript
jQuery操作cookie
2016/08/08 Javascript
JavaScript函数柯里化原理与用法分析
2017/03/31 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
浅谈React Native 中组件的生命周期
2017/09/08 Javascript
Mac下通过brew安装指定版本的nodejs教程
2018/05/17 NodeJs
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
深入解析ES6中的promise
2018/11/08 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
Python爬虫框架Scrapy安装使用步骤
2014/04/01 Python
Python实现高效求解素数代码实例
2015/06/30 Python
Python3 queue队列模块详细介绍
2018/01/05 Python
keras中的backend.clip用法
2020/05/22 Python
python中如何设置代码自动提示
2020/07/15 Python
3种方式实现瀑布流布局小结
2019/09/05 HTML / CSS
全球才华横溢工匠的家居装饰、珠宝和礼物:NOVICA
2021/01/22 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
2014年幼儿园学期工作总结
2014/12/05 职场文书
2015年安全教育月活动总结
2015/03/26 职场文书
街道办残联2016年助残日活动总结
2016/04/01 职场文书
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android