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 相关文章推荐
一个对于js this关键字的问题
Jan 09 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
Oct 29 Javascript
使用变量动态设置js的属性名
Oct 19 Javascript
node.js中的fs.lchmodSync方法使用说明
Dec 16 Javascript
JavaScript 学习笔记之操作符
Jan 14 Javascript
jquery $(document).ready()和window.onload的区别浅析
Feb 04 Javascript
jquery自定义插件开发之window的实现过程
May 06 Javascript
JS多文件上传的实例代码
Jan 11 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
Nov 16 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
Dec 07 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
Jun 10 Javascript
小程序自定义圆形进度条
Nov 17 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中数组合并的两种方法及区别介绍
2012/09/14 PHP
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
利用浏览器的Javascript控制台调试PHP程序
2014/01/08 PHP
PHP开发框架kohana中处理ajax请求的例子
2014/07/14 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
封装好的省市地区联动控件附下载
2007/08/13 Javascript
纯css+js写的一个简单的tab标签页带样式
2014/01/28 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
使用npm安装最新版本nodejs
2018/01/18 NodeJs
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
更强大的vue ssr实现预取数据的方式
2019/07/19 Javascript
Vue3.0 响应式系统源码逐行分析讲解
2019/10/14 Javascript
JS实现简易贪吃蛇游戏
2020/08/24 Javascript
Apache如何部署django项目
2017/05/21 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
高中毕业生自我鉴定范文
2013/09/26 职场文书
安全承诺书格式
2014/05/21 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
民生工作实施方案
2014/05/31 职场文书
医学生求职自荐书
2014/06/12 职场文书
工地标语大全
2014/06/18 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
画展邀请函
2015/01/31 职场文书
建国70周年的心得体会(2篇)
2019/09/20 职场文书
html+css实现文字折叠特效实例
2021/06/02 HTML / CSS
python基础之模块的导入
2021/10/24 Python