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 判断checkbox是否选中的实现代码
Nov 23 Javascript
xss文件页面内容读取(解决)
Nov 28 Javascript
JS检测输入字符是否包含非法字符的示例代码
Feb 11 Javascript
关于Javascript 对象(object)的prototype
May 09 Javascript
JavaScript插件化开发教程(五)
Feb 01 Javascript
js获取图片宽高的方法
Nov 25 Javascript
AngularJS入门教程之AngularJS指令
Apr 18 Javascript
高效Web开发的10个jQuery代码片段
Jul 22 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
Aug 16 Javascript
详解ES6之async+await 同步/异步方案
Sep 19 Javascript
vue表单自定义校验规则介绍
Aug 28 Javascript
vue父组件触发事件改变子组件的值的方法实例详解
May 07 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
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
2014/06/03 Javascript
详解JavaScript中的表单验证
2015/06/16 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
js实现无缝滚动图
2017/02/22 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
JS原生轮播图的简单实现(推荐)
2017/07/22 Javascript
实现一个完整的Node.js RESTful API的示例
2017/09/29 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
详解Vuex管理登录状态
2017/11/13 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
Python生成随机数的方法
2014/01/14 Python
Python多层装饰器用法实例分析
2018/02/09 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
python定义具名元组实例操作
2021/02/28 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
五分钟学会HTML5的WebSocket协议
2019/11/22 HTML / CSS
高三高考决心书
2014/03/11 职场文书
出国留学经济担保书
2014/04/01 职场文书
三八妇女节寄语
2015/02/27 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
关于JavaScript回调函数的深入理解
2021/06/27 Javascript