javascript - Cum să migrezi o aplicație Angular 2 existentă în TypeScript către ReactJS?
Avem un cod existent care este scris în Angular 2 folosind TypeScript. Dar acum plănuim să migrăm codul către ReactJS. Nu sunt foarte sigur cum putem face acest lucru, fără a rescrie întregul cod separat de codul existent.
Ceea ce caut este o soluție care să ne permită să folosim atât componente Angular, cât și componente React și dependențele lor, funcționând în corelație una cu cealaltă.
Răspuns #1
Acesta este un proces dureros, dar este de fapt realizabil. Aplicația rezultată va deveni în cele din urmă imposibil de întreținut, așa că îți sugerez să faci acest lucru doar pentru tranziția către aplicația React refactorizată.
Câteva exemple:
Exemplu: Integrarea angular-bootstrap-datetimepicker
angular
.module('ngApp', ['ui.bootstrap.datetimepicker'])
class AngularWidget extends React.Component {
componentDidMount () {
angular.bootstrap(this.container, ['ngApp']);
}
html = `<datetimepicker data-ng-model="data.date"></datetimepicker>`;
render = () => (
<div
ref={c => this.container = c}
dangerouslySetInnerHTML={{__html: this.html}}
/>
);
}Exemplu: Hacking UI Router
componentDidMount() {
angular.module('ngApp')
.run(($state) => {
$state.go = (state, params, options) => {
console.log('hijacked ui router');
}
})
angular.bootstrap(this.container, ['ngApp']);
}Exemplu: Neutralizează manipularea locației în Angular
angular.module('ngApp', [])
.config( ['$provide', function ($provide){
$provide.decorator('$browser', ['$delegate', function ($delegate) {
$delegate.onUrlChange = function () {};
$delegate.url = function () { return ""};
return $delegate;
}]);
}]);Exemplu: Curăță aplicația Angular când componenta se demontează
class AngularWidget extends React.Component {
componentDidMount() {
this.$rootScope = angular.injector(['ng', 'ngApp']).get('$rootScope');
angular.bootstrap(this.container, ['ngApp']);
}
componentWillUnmount() {
this.$rootScope.$destroy();
}
render = () => (
<div
ref={c => { this.container = c; }}
dangerouslySetInnerHTML={{ __html: '<widget></widget>' }}
/>
)
}Ref: https://medium.com/appifycanada/angular-components-in-react-2c929130f995
