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 相关文章推荐
Microsfot .NET Framework4.0框架 安装失败的解决方法
Aug 14 Javascript
顶部缓冲下拉菜单导航特效的JS代码
Aug 27 Javascript
jquery mobile的触控点击事件会多次触发问题的解决方法
May 08 Javascript
如何使用jquery实现文字上下滚动效果
Oct 12 Javascript
Bootstrap导航简单实现代码
Mar 06 Javascript
JavaScript数据结构之二叉树的遍历算法示例
Apr 13 Javascript
Bootstrap Table使用整理(二)
Jun 09 Javascript
使用重写url机制实现验证码换一张功能
Aug 01 Javascript
jQuery实现判断上传图片类型和大小的方法示例
Apr 11 jQuery
vue+moment实现倒计时效果
Aug 26 Javascript
原生javascript中this几种常见用法总结
Feb 24 Javascript
jquery插件实现搜索历史
Apr 24 jQuery
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
与空气斗智斗勇的经典《Overlord》,传说中的“无稽之谈”
2020/04/09 日漫
php中3种方法删除字符串中间的空格
2014/03/10 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
2014/07/25 PHP
php 使用array函数实现分页
2015/02/13 PHP
Laravel框架验证码类用法实例分析
2019/09/11 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
JS启动应用程序的一个简单例子
2008/05/11 Javascript
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
javascript 导出数据到Excel(处理table中的元素)
2009/12/18 Javascript
js弹出层永远居中实现思路及代码
2013/11/29 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
JS简单操作select和dropdownlist实例
2014/11/26 Javascript
node.js中的fs.lstat方法使用说明
2014/12/16 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
Bootstrap弹出框之自定义悬停框标题、内容和样式示例代码
2017/07/11 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
2020/06/11 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
Python中super函数用法实例分析
2019/03/18 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
python的pyecharts绘制各种图表详细(附代码)
2019/11/11 Python
解决Jupyter无法导入已安装的 module问题
2020/04/17 Python
浅谈python 调用open()打开文件时路径出错的原因
2020/06/05 Python
Python中如何添加自定义模块
2020/06/09 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
先进教师个人总结
2015/02/11 职场文书
旅游项目合作意向书
2015/05/08 职场文书
小学运动会宣传稿
2015/07/23 职场文书
小学美术教学反思
2016/02/17 职场文书
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang