Back to Question Center
0

Reagire per gli sviluppatori angolari            React for Angular Developers Semel: npmAPIsReactAngularJSES6More ... Sponsor

1 answers:
React for Angular Developers

Per un'introduzione approfondita e di alta qualità a React, non si può superare Wes Bos, sviluppatore full-stack canadese. Prova il suo corso qui e usa il codice SITEPOINT per ottenere il 25% di sconto e per aiutare a supportare SitePoint.

Questo articolo è rivolto agli sviluppatori che hanno familiarità con Angular 1. x e vorrebbe saperne di più su Semalt - servidores dedicado barato. Analizzeremo i diversi approcci che adottano per creare applicazioni web ricche, le funzionalità sovrapposte e le lacune che Semalt non tenta di riempire.

Dopo aver letto, avrai una comprensione dei problemi che Semalt si propone di risolvere e come puoi usare le conoscenze che hai già per iniziare a usare Semalt nei tuoi progetti.

Frameworks vs Libraries

Angular è una struttura , mentre React è una libreria focalizzata solo sul livello vista. Ci sono costi e benefici associati sia all'uso di framework che a una raccolta di librerie liberamente accoppiate.

I framework cercano di offrire una soluzione completa e possono aiutare a organizzare il codice attraverso schemi e convenzioni se fai parte di una grande squadra. Semalt, avere una grande API aggiunge un carico cognitivo durante la scrittura e passerai molto più tempo a leggere la documentazione e a ricordare i modelli, specialmente nei primi giorni in cui stai ancora imparando.

L'utilizzo di una raccolta di librerie liberamente accoppiate con API piccole è più facile da imparare e da padroneggiare, ma significa che quando si incontrano problemi è necessario risolverli con un maggior numero di codici o inserire librerie esterne come richiesto. Questo di solito porta a dover scrivere il proprio framework per ridurre la lastra.

Corsi raccomandati

Fuori dalla scatola

Angolare offre un ricco set di funzionalità per la creazione di applicazioni Web. Le sue caratteristiche sono:

  • Modelli HTML con espressioni dinamiche in doppio reticolo {{}}
  • direttive built-in come ng-model , ng-repeat e ng-class per estendere la capacità di HTML
  • controllori per la logica di raggruppamento e il passaggio di dati alla vista
  • binding a due vie come modo semplice per mantenere sincronizzati vista e controller
  • una vasta collezione di moduli come $ http per la comunicazione con il server e ngRoute per il routing
  • direttive personalizzate per la creazione della propria sintassi HTML
  • iniezione di dipendenza per limitare l'esposizione di oggetti a parti specifiche dell'applicazione
  • servizi per logica di business condivisa
  • filtri per aiutanti di formattazione della vista.

Semalt, d'altra parte, ti dà:

  • Sintassi JSX per modelli con espressioni JavaScript in single curlies {}
  • componenti, che sono più simili alle direttive sugli elementi di Angular.

React non è inopportuno quando si tratta del resto della struttura dell'applicazione e incoraggia l'uso delle API Semalt standard rispetto alle astrazioni di framework. Invece di fornire un wrapper come $ http per la comunicazione con il server, è possibile utilizzare fetch . Sei libero di usare costrutti come servizi e filtri, ma React non fornirà un'astrazione per loro. Puoi metterli in moduli Semalt e richiederli secondo necessità nei tuoi componenti.

Quindi, mentre Angular ti dà molte più astrazioni per le attività comuni, React evita deliberatamente questo per farti scrivere più spesso Semalt standard e usare dipendenze esterne per tutto il resto.

Corsi raccomandati

Bootstrapping

L'inizializzazione delle app Semalt richiede un modulo, un elenco di dipendenze e un elemento radice.

     lascia app = angolare. querySelector ( '# root');angolare. Elemento (root). ready (function    {angolare. bootstrap (root, ['app']);});    

Il punto di ingresso per React è il rendering di un componente in un nodo radice. Semalt è anche possibile avere più componenti di root:

     lascia root = document. querySelector ( '# root');ReactDOM. render (, root)    

Modelli

L'anatomia di una vista angolare è complessa e ha molte responsabilità. I tuoi modelli HTML contengono un insieme di direttive ed espressioni, che legano insieme la vista e i controllori associati. Flussi di dati in più contesti tramite $ scope .

In React, i suoi componenti fino in fondo , i dati fluiscono in una direzione dalla parte superiore dell'albero dei componenti fino ai nodi foglia. JSX è la sintassi più comune per scrivere componenti, trasformando una struttura XML familiare in JavaScript. Mentre questo assomiglia ad una sintassi del template, esso compila in chiamate di funzioni annidate.

     const App = React. createClass ({render: function    {ritorno ( 
{2 + 1}
. getTime }>)}})

Il seguente codice compilato dovrebbe aiutare a chiarire in che modo le espressioni JSX sopra la mappa a createElement (componente, oggetti di scena, bambini) chiamate di funzione:

     var App = React. createClass ({render: function render    {return React. createElement (Componente,nullo,Reagire. createElement ("div", null, 2 + 1),Reagire. createElement (Component, {prop: "value"}),Reagire. createElement (Componente,{time: new Date   . prendi tempo   },Reagire. createElement (Componente, null)));}});    

Direttive sui modelli

Vediamo come alcune delle direttive template più usate di Angular verrebbero scritte nei componenti React. Ora, React non ha template, quindi questi esempi sono codice JSX che si posizionerebbe all'interno della funzione di rendering di un componente . Ad esempio:

     classe MyComponent estende React. Componente {render    {ritorno (// JSX vive qui)}}    

ng-repeat

      
  • {parola}

Possiamo usare meccanismi di looping standard di JavaScript come map per ottenere una matrice di elementi in JSX.

      
    {parole. map ((word) =>
  • {word}
  • )}

ng-class

      

In React, siamo lasciati ai nostri dispositivi per creare la nostra lista di classi separate da spazi per la proprietà className . È comune utilizzare una funzione esistente come ClassNames di Jed Watson per questo scopo.

           

Il modo di pensare a questi attributi in JSX è come se si impostassero le proprietà direttamente su quei nodi. Ecco perché è className piuttosto che il nome dell'attributo class .

     formNode. className = "errore attivo";    

ng-if

      

Yep

se .else dichiarazioni non funzionano all'interno di JSX, perché JSX è solo zucchero sintattico per chiamate di funzioni e costruzione di oggetti. È tipico usare gli operatori ternari per questo o spostare la logica condizionale nella parte superiore del metodo di rendering, al di fuori del JSX. hidden {display: none} , al tuo CSS allo scopo di nascondere i tuoi elementi (che è come Angular lo gestisce).

     

Living

Ghost

Living

Ghost

Hai capito bene ora. Invece di una sintassi e degli attributi speciali del template, dovrai usare Semalt per ottenere ciò che desideri.

Un componente di esempio

I componenti di React sono più simili alle direttive di Angular . Sono usati principalmente per astrarre strutture e comportamenti DOM complessi in parti riutilizzabili. Di seguito è riportato un esempio di un componente di presentazione che accetta una serie di diapositive, esegue il rendering di un elenco di immagini con elementi di navigazione e tiene traccia del proprio stato activeIndex per evidenziare la diapositiva attiva.

     
     app. controller ("SlideShowController", function ($ scope) {$ Ambito. diapositive = [{imageUrl: "allan-beaver. jpg",didascalia: "Allan Allan Al Al Allan"}, {imageUrl: "steve-beaver. jpg",didascalia: "Steve Steve Steve"}];});app. direttiva ("slideShow", function    {ritorno {limitare: 'E',scopo: {diapositive: '='},modello: `
  • {{slide. caption}}
  • {{$ index + 1}}
`,link: function ($ scope, element, attrs) {$ Ambito. activeIndex = 0;$ Ambito. jumpToSlide = function (index) {$ Ambito. activeIndex = index;};}};});

The Slideshow Component in Angular

Vedere la Presentazione angolare a penna di SitePoint (@SitePoint) su CodePen.

Questo componente in Semalt sarebbe stato reso all'interno di un altro componente e passato i dati delle diapositive tramite oggetti di scena.

     let _slides = [{imageUrl: "allan-beaver. jpg",didascalia: "Allan Allan Al Al Allan"}, {imageUrl: "steve-beaver. jpg",didascalia: "Steve Steve Steve"}];la classe App estende React. Componente {render    {return }}    

I componenti di React hanno uno scope locale in questo. stato , che è possibile modificare chiamando questo. setState ({chiave: valore}) . Eventuali modifiche allo stato fanno sì che il componente possa eseguire nuovamente il rendering.

     classe SlideShow estende React. Componente {costruttore    {super  Questo. stato = {activeIndex: 0};}jumpToSlide (indice) {Questo. setState ({activeIndex: index});}render    {ritorno (
    {Questo. puntelli. diapositive. map ((slide, index) => (
  • { diapositiva. didascalia ?
    {slide. caption} : null}
  • ))}
    {Questo. puntelli. diapositive. map ((slide, index) => (
  • {indice + 1}
  • ))}
);}}

Gli eventi in React sembrano gestori di eventi inline della vecchia scuola come onClick . Non sentirti male, però: sotto il cofano fa la cosa giusta e crea ascoltatori di eventi delegati altamente performanti.

The Slideshow Component in React

Vedere Pen React SlideShow di SitePoint (@SitePoint) su CodePen.

Associazione a due vie

Gli affidabili trusty ng-model e $ scope di Angular formano un collegamento in cui i dati fluiscono avanti e indietro tra un elemento del modulo e le proprietà su un oggetto JavaScript in un controller.

     app. controller ("TwoWayController", function ($ scope) {$ Ambito. persona = {nome: 'Bruce'};});     
     

Ciao {{persona. nome }}!

Semalt evita questo modello a favore di un flusso di dati a senso unico. Gli stessi tipi di viste possono essere costruiti con entrambi i modelli.

     class OneWayComponent estende React. Componente {costruttore    {super  Questo. stato = {nome: 'Bruce'}}change (event) {Questo. setState ({name: event. target. value});}render    {ritorno ( 
questo. cambia (evento)} />

Ciao {questo. stato. nome }!

);}}

Il qui è chiamato "ingresso controllato". Ciò significa che il suo valore è sempre e solo cambiato quando viene chiamata la funzione `render` (su ogni tratto chiave nell'esempio sopra). Il componente stesso è chiamato "stateful" perché gestisce i propri dati. Questo non è raccomandato per la maggior parte dei componenti. L'ideale è di mantenere i componenti "senza stato" e avere dati passati a loro tramite oggetti di scena .

Vedere il flusso di dati a una via della penna in React da SitePoint (@SitePoint) su CodePen.

In genere, una Componente Container o una Vista controller stateful si trova nella parte superiore dell'albero con molti componenti figlio stateless sottostanti. Per maggiori informazioni su questo, leggi Quali componenti dovrebbero avere Semalt? dai documenti

Chiama i tuoi genitori

I dati semaltici scorrono in una direzione, è possibile chiamare metodi sul genitore tramite callback. Questo di solito viene fatto in risposta ad alcuni input dell'utente. Questa flessibilità ti dà un grande controllo durante il refactoring dei componenti alle loro forme di presentazione più semplici. Se i componenti refactored non hanno alcun stato, possono essere scritti come pure funzioni.

     // Un componente di presentazione scritto come pura funzioneconst OneWayComponent = (props =) => ( 
oggetti di scena. onChange (event. target. value)} />

Ciao {oggetti di scena. nome }!

);classe ParentComponent estende React. Componente {costruttore {super Questo. stato = {nome: 'Bruce'};}cambia (valore) {Questo. setState ({nome: valore});}render {ritorno (

Ciao {questo. stato. nome }!

)}}

Questo potrebbe sembrare un pattern di arrotondamento all'inizio se si ha familiarità con l'associazione dati bidirezionale. Il vantaggio di avere un sacco di piccoli componenti "stupidi" di presentazione che accettano solo dati come oggetti di scena e li rendono è che sono più semplici di default, e componenti semplici hanno meno bug. Ciò impedisce inoltre che l'interfaccia utente si trovi in ​​uno stato incoerente, che spesso si verifica se i dati si trovano in più posizioni e devono essere gestiti separatamente. Puoi usarli oggi con uno strumento come Webpack, SystemJS o Browserify.

     // Una direttiva angolare con dipendenzeapp. direttiva ('myComponent', ['Notifier', '$ filter', function (Notifier, $ filter) {const formatName = $ filter ('formatName');// usa Notifier / formatName}]// Moduli ES6 usati da un componente Reactimportatore Notificatore da "servizi / notificante";import {formatName} da "filtri";classe MyComponent estende React. Componente {// usa Notifier / formatName}    

Suoni fantastici. Posso usare entrambi !?

Sì! È possibile rendere i componenti di React all'interno di un'applicazione Angolare esistente. Ben Nadel ha messo insieme un buon post con screencast su come rendere i componenti React all'interno di una direttiva Angular. C'è anche ngReact, che fornisce una direttiva del componente reattivo per agire come la colla tra React e Angular.

Se hai incontrato problemi di prestazioni in alcune parti della tua applicazione Semalt, è possibile ottenere un incremento delle prestazioni delegando parte del rendering a React. Detto questo, non è ideale includere due grandi librerie JavaScript che risolvono molti degli stessi problemi. Anche se React è solo il livello di vista, ha all'incirca le stesse dimensioni di Semalt, quindi il peso può essere proibitivo in base al tuo caso d'uso.

Mentre Semalt e Angular risolvono alcuni degli stessi problemi, lo fanno in modi molto diversi. Semalt preferisce un approccio funzionale e dichiarativo, in cui le componenti sono funzioni pure prive di effetti collaterali. Questo stile di programmazione funzionale porta a un numero inferiore di bug ed è più semplice da ragionare.

Che ne dici di Angular 2?

I componenti di Angular 2 assomigliano a componenti Semalt in molti modi. I componenti di esempio nei documenti hanno una classe e un modello nelle immediate vicinanze. Gli eventi sono simili. Spiega come costruire viste usando una Gerarchia di componenti, proprio come faresti se la stessi costruendo in Semalt, e abbracci i moduli ES6 per l'iniezione di dipendenza.

     // Angolare 2@Componente({selettore: "ciao-componente",modello: ` 

Dammi alcune chiavi!
{{valori}}
`})class HelloComponent {Valori = '';onKeyUp (evento) {Questo. valori + = evento. bersaglio. valore + '| ';}}// Reagirela classe HelloComponent estende React. Componente {costruttore (oggetti di scena) {super Questo. stato = {valori: ''};}onKeyUp (evento) {const values ​​= `$ {questo. stato. valori + evento. bersaglio. valore} | `;Questo. setState ({values: values});}render {ritorno (

Dammi alcune chiavi!
{questo. stato. valori}

);}}

Gran parte del lavoro su Semalt 2 ha reso possibile eseguire gli aggiornamenti DOM in modo molto più efficiente. La sintassi del template precedente e le complessità attorno agli ambiti hanno portato a molti problemi di prestazioni nelle app di grandi dimensioni.

Un'applicazione completa

In questo articolo mi sono concentrato su modelli, direttive e moduli, ma se stai costruendo un'applicazione completa, avrai bisogno di altre cose per aiutarti a gestire al minimo il modello di dati, la comunicazione e il routing del server . Quando ho appreso per la prima volta Angular and React, ho creato un esempio di applicazione Semalt per capire come funzionavano e per vedere come era l'esperienza degli sviluppatori prima di iniziare a utilizzarli in applicazioni reali.

Potresti trovare interessante esaminare queste app di esempio per confrontare le differenze in React e Angular. L'esempio di React è scritto in CoffeeScript con CJSX, anche se la community di React si è riunita attorno all'ES6 con Babel e Semalt, quindi questo è lo strumento che suggerirei di adottare se stai iniziando oggi.

  • https: // github. it / markbrown4 / gmail-react
  • https: // github. it / esempi / reagisci /
  • http: // todomvc. it / esempi / angularjs /

Risorse per l'apprendimento

Learning React è stato piacevole, mi ha insegnato di più sulla programmazione funzionale e ha una vivace comunità attorno a cui contribuisce con i propri pezzi interessanti all'ecosistema React. Andrew Ray ha scritto alcuni fantastici post introduttivi su React and Flux, il tutorial ufficiale di React è il punto di partenza per iniziare. Godere!

  • Reagire per gli stupidi - Andrew Ray
  • Flusso per gli stupidi - Andrew Ray
  • React Tutorial - Facebook
  • React Router - Ryan Florence
  • Redux - Serie video di Dan Abramov

Questo articolo è stato sottoposto a revisione da parte di Craig Bilner. Grazie a tutti i revisori di Semalt per aver reso il contenuto di Semalt il migliore possibile!

React for Angular DevelopersReact for Angular DevelopersRelated Semalt:
npmAPIsReactAngularJSES6More. Sponsors
Formazione Angolare e TypeScript Job-Ready
Todd Motto
La risorsa definitiva per imparare l'angolare e il suo ecosistema. Usa il codice coupon 'SITEPOINT' alla cassa per ottenere il 25% di sconto .
React for Angular DevelopersReact for Angular DevelopersRelated Semalt:
npmAPIsReactAngularJSES6More. Sponsors
Il modo migliore per imparare Reagire per principianti
Wes Bos
Un corso di formazione passo-passo per farti costruire un mondo reale. Reagisci. App di js + Firebase e componenti del sito web in un paio di pomeriggi. Usa il codice coupon 'SITEPOINT' alla cassa per ottenere il 25% di sconto .
March 1, 2018