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 相关文章推荐
xmlHTTP实例
Oct 24 Javascript
XML+XSL 与 HTML 两种方案的结合
Apr 22 Javascript
iis6+javascript Add an Extension File
Jun 13 Javascript
js 深拷贝函数
Dec 04 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
Dec 15 Javascript
JS打开新窗口的2种方式
Apr 18 Javascript
jQuery实现用户注册的表单验证示例
Aug 28 Javascript
Javascript中的Prototype到底是什么
Feb 16 Javascript
jQuery实现右键菜单、遮罩等效果代码
Sep 27 Javascript
bootstrap suggest下拉框使用详解
Apr 10 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
Nov 07 Javascript
validform表单验证的实现方法
Mar 08 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/11/05 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
2019/10/03 PHP
Mootools 1.2教程 Tooltips
2009/09/15 Javascript
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
JS delegate与live浅析
2013/12/21 Javascript
写出高效jquery代码的19条指南
2014/03/19 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
JS组件Bootstrap Table使用实例分享
2016/05/30 Javascript
手机端实现Bootstrap简单图片轮播效果
2016/10/13 Javascript
基于javascript实现按圆形排列DIV元素(二)
2016/12/02 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
[50:50]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.20
2020/12/23 DOTA
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
python学生信息管理系统(完整版)
2020/04/05 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
Python+PyQt5+MySQL实现天气管理系统
2020/06/16 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
python tqdm库的使用
2020/11/30 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
七一党建活动方案
2014/01/28 职场文书
乡镇个人对照检查材料
2014/08/22 职场文书
文明单位创建材料
2014/12/24 职场文书
陪护人员误工证明
2015/06/24 职场文书
SQL实现LeetCode(178.分数排行)
2021/08/04 MySQL
Vue h函数的使用详解
2022/02/18 Vue.js