Angular 和 React 都是伟大的框架/库。Angular 提供了 MVC(模型、视图、控制器)的定义结构。React 提供基于状态变化的轻量级呈现机制。通常情况下,开发者在 AngularJS 上有一个旧的应用程序后,他们会想用 ReactJS 建立新的特性。
虽然将 AngularJS 应用移除,从头开始建立一个 ReactJS 应用是不错的选择。但对于大规模应用来说,它不是一个可行的解决方案。在这种情况下,单独建立一个 React 组件并将其导入 Augular 会更容易。
在这篇文章中,我将帮你在 Angular 应用中使用 react2angular 创建一个 React 组件。
为实现本文的目的,请保持 Angular 应用的简单性。我计划在 2018 年进行欧洲之旅,因此我的 Angular 应用实质上是一个我想访问的目的地清单。
以下是数据集 bucketlist 看起来的样子:
const bucketlist = [{ city: 'Venice', position: 3, sites: ['Grand Canal', 'Bridge of Sighs', 'Piazza San Marco'], img: 'https://unsplash.com/photos/ryC3SVUeRgY', }, { city: 'Paris', position: 2, sites: ['Eiffel Tower', 'The Louvre', 'Notre-Dame de Paris'], img: 'https://unsplash.com/photos/R5scocnOOdM', }, { city: 'Santorini', position: 1, sites: ['Imerovigli', 'Akrotiri', 'Santorini Arts Factory'], img: 'https://unsplash.com/photos/hmXtDtmM5r0', }];
这是 angularComponent.js 的样子:
function AngularComponentCtrl() { var ctrl = this; ctrl.bucketlist = bucketlist; }; angular.module(’demoApp’).component(’angularComponent’, { templateUrl: 'angularComponent.html’, controller: AngularComponentCtrl });
这是 angularComponent.html:
<div ng-repeat="item in $ctrl.bucketlist" ng-sort="item.position"> <h2>{{item.city}}</h2> <p> I want to see <span ng-repeat="sight in item.sights">{{sight}} </p></span> </div>
超简单! 现在可以去圣托里尼了...
如果你的编辑器没有配置,那么从 Angular 迁移到 React 可能会很痛苦。我们将首先安装 linting 。
npm install --save eslint babel-eslint
接下来,安装 react2angular 。如果你从未安装过 React ,你还将需要安装 react,react-dom 和 prop-types 。
npm install --save react2angular react react-dom prop-types
现在,我们已经有了一个 Angular 组件用来呈现城市的名称。接下来,我们需要渲染特色图像。假设这个图片是通过 props 提供给我们的。我们的 React 组件如下所示:
import {Component} from 'react'; class RenderImage extends Component { render() { const imageUrl = this.props.imageUrl; return ( <div> <img src={imageUrl} alt=""/> </div> ); } }
请记住,在第2步中,假设有一个通过 props 获取的可用图像。我们现在要填充 props 值。你可以使用 props 将依赖关系传递给 React 组件。请务必注意,React 组件没有任何 Angular 依赖关系可用。 你可以这样想 - React 组件就像一个连接到 Angular 应用的容器。 如果你需要容器继承父母的信息,你将需要通过 props 明确地接入。
所以,为了传递依赖关系,我们将在 Angular 中添加一个 renderImage 组件 ,并将其作为参数传递给 imageUrl :
angular.module(’demoApp’, []) .component(’renderImage’, react2angular(RenderImage,[’imageUrl’]));
现在,你可以像任何其他组件一样简单地将这个组件导入到 Angular 应用中:
<div ng-repeat="item in $ctrl.bucketlist"> <h2>{{item.city}}</h2> <p> I want to see <span ng-repeat="site in item.sites">{{site}}</span> <render-image image-url={{item.img}}></render-image> </div>
Ta Da! 不敢相信,这简直就是魔法。当然,这(更多的)是艰苦的工作和汗水,还有陪伴我们的咖啡,等等。
评论删除后,数据将无法恢复
评论(0)