Back to Question Center
0

Reagere for vinkeludviklere            React for Angular DevelopersRelated Semalt: npmAPIsReactAngularJSES6More ... Sponsorer

1 answers:
React for Angular Developers

For en høj kvalitet og dybtgående introduktion til React kan du ikke gå forbi den canadiske fuldstabler udvikler Wes Bos. Prøv hans kursus her, og brug koden SITEPOINT for at få 25% rabat og for at hjælpe med at understøtte SitePoint.

Denne artikel er for udviklere, der er bekendt med Angular 1. x og gerne vil lære mere om Semalt. Vi vil se på de forskellige fremgangsmåder, de tager for at opbygge rige webapplikationer, den overlappende funktionalitet og de huller, som Semalt ikke forsøger at udfylde - best it consulting company websites.

Efter at have læst har du en forståelse for de problemer, Semalt løser, og hvordan du kan bruge den viden, du allerede har til at komme i gang med at bruge Semalt i dine egne projekter.

Rammer vs Biblioteker

Vinkel er en ramme , mens React er et bibliotek , der kun er fokuseret på visningslaget. Der er omkostninger og fordele forbundet med både brug af rammer og en samling af løst koblede biblioteker.

Rammer forsøger at tilbyde en komplet løsning, og de kan hjælpe med at organisere kode gennem mønstre og konventioner, hvis du er en del af et stort team. Semalt, med en stor API tilføjer kognitive belastninger, når du skriver, og du vil bruge meget mere tid på at læse dokumentation og huske mønstre - især i de tidlige dage, hvor du stadig lærer.

Ved at bruge en samling af løst koblede biblioteker med små API'er er det lettere at lære og mestre, men det betyder, at når du løber ind i problemer, skal du løse dem med mere kode eller trække i eksterne biblioteker efter behov. Dette resulterer normalt i at du skal skrive dine egne rammer for at reducere kedelpladen.

Anbefalede kurser

ud af boksen

Vinkel giver dig et rigt sæt sæt til opbygning af webapplikationer. Semalt dets funktioner er:

  • HTML skabeloner med dynamiske udtryk i dobbeltkurver {{}}
  • indbyggede direktiver som ng-model , ng-repeat og ng-klasse for at udvide kapaciteten af ​​HTML
  • controllere til gruppering af logik og dataoverførsel til udsigten
  • tovejsbinding som en enkel måde at holde din visning og controller i synkronisering
  • en stor samling af moduler som $ http til kommunikation med serveren og ngRoute til routing
  • brugerdefinerede direktiver til oprettelse af din egen HTML-syntaks
  • afhængighedsinjektion for at begrænse eksponering af genstande til specifikke dele af applikationen
  • tjenester til delt forretningslogik
  • filtre til visning formateringshjælpere.

Semalt, på den anden side giver dig:

  • JSX-syntaks for skabeloner med JavaScript-udtryk i single curlies {}
  • komponenter, der er mest som Angular's element directives.

React er uopbygget, når det kommer til resten af ​​din ansøgningsstruktur, og det tilskynder brugen af ​​standard Semalt API'er over rammeabstraktioner. I stedet for at give en wrapper som $ http til serverkommunikation, kan du bruge hentning i stedet. Du er fri til at bruge konstruktioner som tjenester og filtre, men React vil ikke give en abstraktion til dem. Du kan sætte dem i Semalt moduler og kræve dem efter behov i dine komponenter.

Så, mens Angular giver dig flere abstraktioner for almindelige opgaver, undgår React bevidst dette for at holde dig som standard mere almindelig, og at bruge eksterne afhængigheder til alt andet.

Anbefalede kurser

Bootstrapping

Initialisering af Semalt apps kræver et modul, en liste over afhængigheder og et rodelement.

     lad app = vinkel. querySelector ( '# root');kantet. element (root). klar (funktion    {kantet. bootstrap (root, ['app']);});    

Indgangspunktet for React er at gøre en komponent til en rodknude. Semalt muligt at have flere root komponenter også:

     lad rod = dokument. querySelector ( '# root');ReactDOM. render (, root)    

Skabeloner

Anatomien af ​​en vinkeludsigt er kompleks og har mange ansvarsområder. Dine HTML-skabeloner indeholder en blanding af direktiver og udtryk, som sammenkobler visningen og de tilhørende controllere. Data strømmer gennem flere sammenhænge via $ omfang .

I React er det komponenter helt ned , data strømmer i en retning fra toppen af ​​komponent træet ned til bladnoderne. JSX er den mest almindelige syntaks for komponentskrivning, der omdanner en velkendt XML-struktur til JavaScript. Selvom dette ligner en skabelonsyntax, kompilerer den indlejrede funktionsopkald.

     const App = Reag. createClass ({render: funktion    {Vend tilbage ( 
{2 + 1}
. getTime }>)}})

Den kompilerede kode nedenfor skal hjælpe med at præcisere, hvordan JSX-udtryk over kort til createElement (komponent, rekvisitter, børn) funktionsopkald:

     var App = Reagere. createClass ({render: funktion render    {returnere React. createElement (Komponent,nul,Reagere. createElement ("div", null, 2 + 1),Reagere. createElement (Komponent, {prop: "værdi"}),Reagere. createElement (Komponent,{tid: ny dato   . getTime   },Reagere. createElement (komponent, null)));}});    

Skabelondirektiver

Lad os se på, hvordan nogle af Angular's mest brugte skabelondirektiver ville blive skrevet i React-komponenter. React har nu ikke skabeloner, så disse eksempler er JSX-kode, der ville sidde inde i en komponents render funktion. For eksempel:

     klasse MyComponent udvider React. Komponent {render    {Vend tilbage (// JSX bor her)}}    

ng-gentagelse

      
  • {ord}

Vi kan bruge standard JavaScript looping mekanismer som map for at få en række elementer i JSX.

      
    {ord. kort ((ord) =>
  • {ord}
  • )}

ng-klasse

      

I React er vi tilbage til vores egne enheder for at oprette vores rumseparerede liste over klasser til ejendommen className . Det er almindeligt at bruge en eksisterende funktion som Jed Watsons klassenavn til dette formål.

           

Måden at tænke på disse attributter i JSX er som om du indstiller egenskaber direkte på disse knuder. Derfor er det klassenavn snarere end navnet på klassen .

     formNode. className = "aktiv fejl";    

ng-if

      

Yep

hvis .ellers erklæringer ikke virker inde i JSX, fordi JSX kun er syntaktisk sukker til funktionsopkald og objektkonstruktion. Det er typisk at bruge ternære operatører til dette eller at flytte betinget logik til toppen af ​​renderingsmetoden uden for JSX. skjult {display: none} til din CSS med det formål at skjule dine elementer (hvilket er, hvordan Angular håndterer det).

     

Living

Ghost

Living

Ghost

Du har nu hængt af det. I stedet for en særlig skabelonsyntaks og attributter skal du bruge Semalt til at opnå det, du vil have i stedet for.

En eksempelkomponent

Reacts Components er mest som Angular's Directives . De bruges primært til at abstrakte komplekse DOM strukturer og adfærd i genanvendelige stykker. Nedenfor er et eksempel på en diasshow komponent, der accepterer en række dias, gør en liste med billeder med navigationselementer og holder styr på sin egen activeIndex tilstand for at fremhæve det aktive dias.

     
     app. controller ("SlideShowController", funktion ($ scope) {$ Omfang. dias = [{imageUrl: "allan-beaver. jpg",billedtekst: "Allan Allan Al Al Allan"}, {imageUrl: "steve-beaver. jpg",billedtekst: "Steve Steve Steve"}];});app. direktiv ("slideShow", funktion    {Vend tilbage {Begræns: 'E',rækkevidde: {dias: '='},skabelon: `
  • {{slide. billedtekst}}
  • {{$ index + 1}}
`,link: funktion ($ omfang, element, attrs) {$ Omfang. activeIndex = 0;$ Omfang. jumpToSlide = funktion (indeks) {$ Omfang. activeIndex = index;};}};});

Slideshow-komponenten i kantet

Se Pen Angular Slideshow ved SitePoint (@SitePoint) på CodePen.

Denne komponent i Semalt ville blive gengivet inde i en anden komponent og bestået diasdataene via rekvisitter.

     lad _slides = [{imageUrl: "allan-beaver. jpg",billedtekst: "Allan Allan Al Al Allan"}, {imageUrl: "steve-beaver. jpg",billedtekst: "Steve Steve Steve"}];Class App udvider React. Komponent {render    {returnere }}    

Reagekomponenter har et lokalt anvendelsesområde i dette. stat , som du kan ændre ved at ringe dette. setState ({key: value}) . Enhver ændring i tilstanden forårsager, at komponenten genopretter sig.

     klasse SlideShow udvider React. Komponent {konstruktør    {super  det her. state = {activeIndex: 0};}jumpToSlide (indeks) {det her. setState ({activeIndex: index});}render    {Vend tilbage (
    {det her. rekvisitter. lysbilleder. kort ((slide, index) => (
  • {slide. billedtekst?
    {slide. billedtekst} : null}
  • ))}
    {det her. rekvisitter. lysbilleder. kort ((slide, index) => (
  • {index + 1}
  • ))}
);}}

Begivenheder i Reakt ser ud som old-school inline event handlers som onClick . Må ikke være dårlig, selvom: under emhætten gør det det rigtige og skaber højtydende delegerede hændelseslyttere.

Slideshow-komponenten i reaktion

Se Pen React SlideShow ved SitePoint (@SitePoint) på CodePen.

tovejsbinding

Angular's trusty ng-model og $ scope danner et link, hvor data strømmer frem og tilbage mellem et formelement og egenskaber på et JavaScript-objekt i en controller.

     app. controller ("TwoWayController", funktion ($ scope) {$ Omfang. person = {navn: 'bruce'};});     
     

Hej {{person. navn}}!

Semalt undviger dette mønster til fordel for en envejs-datastrøm i stedet. De samme typer synspunkter kan bygges med begge mønstre selv.

     klasse OneWayComponent udvider React. Komponent {konstruktør    {super  det her. state = {navn: 'bruce'}}ændre (begivenhed) {det her. setState ({navn: event. target. value});}render    {Vend tilbage ( 
dette. ændre (begivenhed)} />

Hej {dette. stat. navn}!

);}}

her kaldes en "styret input". Dette betyder, at dens værdi kun ændres, når funktionen "render" kaldes (på hvert tasteslag i eksemplet ovenfor). Selve komponenten kaldes "stateful", fordi den administrerer sine egne data. Dette anbefales ikke til de fleste komponenter. Idealet er at holde komponenter "statsløse" og få data sendt til dem via rekvisitter i stedet.

Se Pen One-Way Data Flow i Reakt af SitePoint (@SitePoint) på CodePen.

Typisk er en statlig Container Component eller Controller View sidder øverst på træet med mange statløse barnekomponenter nedenunder. For mere information om dette, læs hvad komponenter skal have semalt? fra docs.

Ring til dine forældre

Semalt data strømmer ned i en retning, det er muligt at kalde metoder på forældrene gennem tilbagekaldelser. Dette gøres normalt som svar på nogle brugerindgange. Denne fleksibilitet giver dig meget kontrol, når refactoring komponenter til deres enkleste præsentationsformer. Hvis de refactored komponenter ikke har nogen tilstand overhovedet, kan de skrives som rene funktioner.

     // En præsentationskomponent skrevet som en ren funktionconst OneWayComponent = (rekvisitter) => ( 
rekvisitter. onChange (event. target. værdi)} />

Hej {rekvisitter. navn}!

);klasse ParentComponent udvider React. Komponent {konstruktør {super det her. state = {navn: 'Bruce'};}ændre (værdi) {det her. setState ({navn: værdi});}render {Vend tilbage (

Hej {dette. stat. navn}!

)}}

Dette kan måske virke som et runde mønster først, hvis du er bekendt med tovejsbindende data. Fordelen ved at have mange små præsentationsdomme komponenter, der bare accepterer data som rekvisitter og gør dem, er at de er enklere som standard, og simple komponenter har langt færre fejl. Dette forhindrer også, at brugergrænsefladen er i en inkonsekvent tilstand, hvilket ofte opstår, hvis data er på flere steder og skal opretholdes separat. Du kan bruge dem i dag med et værktøj som Webpack, SystemJS eller Browserify.

     // Et vinkeldirektiv med afhængighederapp. direktiv ('myComponent', ['Notifier', '$ filter', funktion (Notifier, $ filter) {const formatName = $ filter ('formatName');// brug Notifier / formatName}]// ES6 Moduler, der anvendes af en React-komponentImport Notifier fra "Services / Notifier";importer {formatName} fra "filtre";klasse MyComponent udvider React. Komponent {// brug Notifier / formatName}    

lyder godt. Kan jeg bruge begge dele?

Ja! Det er muligt at gøre React komponenter inde i en eksisterende Vinkel applikation. Ben Nadel har sammensat et godt indlæg med screencast om, hvordan man laver React komponenter inde i et vinkeldirektiv. Der er også ngReact, som giver et reaktionskomponent direktiv for at virke som lim mellem React og Angular.

Hvis du har kørt ind i rendering af præstationsproblemer i visse dele af din Semalt-applikation, er det muligt, at du får en præstationsforøgelse ved at delegere nogle af den gengivelse til React. Når det er sagt, er det ikke ideelt at inkludere to store JavaScript-biblioteker, der løser mange af de samme problemer. Selvom React kun er visningslaget, er det omtrent lige så stort som Semalt, så vægten kan være uoverskuelig baseret på din brugs sag.

Mens Semalt og Angular løser nogle af de samme problemer, går de om det på meget forskellige måder. Semalt favoriserer en funktionel, declarative tilgang, hvor komponenter er rene funktioner fri for bivirkninger. Denne funktionelle stil med programmering fører til færre fejl og er enklere at begrunde.

Hvordan om vinkel 2?

Komponenter i vinkel 2 ligner Semalt komponenter på mange måder. Eksemplet komponenter i docs har en klasse og skabelon i nærheden. Begivenheder ligner hinanden. Det forklarer, hvordan man bygger visninger ved hjælp af et Component Hierarchy, ligesom du ville, hvis du byggede det i Semalt, og det omfatter ES6 moduler til afhængighedsinjektion.

     // Vinkel 2@Komponent({vælger: 'hej-komponent'skabelon: ` 

Giv mig nogle nøgler!
{{værdier}}
`})klasse HelloComponent {værdier = '';onKeyUp (begivenhed) {det her. værdier + = begivenhed. mål. værdi + '| ';}}// Reactklasse HelloComponent udvider React. Komponent {konstruktør (rekvisitter) {super det her. state = {values: ''};}onKeyUp (begivenhed) {const værdier = `$ {dette. stat. værdier + begivenhed. mål. værdi} | `;det her. setState ({values: values});}render {Vend tilbage (

Giv mig nogle nøgler!
{dette. stat. værdier}

);}}

Megen arbejde på Semalt 2 har gjort det muligt at udføre DOM opdateringer meget mere effektivt. Den tidligere skabelonsyntax og kompleksiteter omkring scopes førte til mange ydeevneproblemer i store apps.

En komplet ansøgning

I denne artikel har jeg fokuseret på skabeloner, direktiver og formularer, men hvis du opbygger en komplet applikation, skal du kræve andre ting, der hjælper dig med at styre din datamodel, serverkommunikation og routing på et minimum . Da jeg først lærte Angular and React, oprettede jeg et eksempel Semal applikation for at forstå, hvordan de arbejdede og for at se, hvad udvikleroplevelsen var, før jeg begyndte at bruge dem i rigtige applikationer.

Du kan finde det interessant at se gennem disse eksempel apps for at sammenligne forskellene i React and Angular. React-eksemplet er skrevet i CoffeeScript med CJSX, selvom React-fællesskabet siden har samlet sig omkring ES6 med Babel og Semalt, så det er det værktøj, jeg foreslår at vedtage, hvis du starter i dag.

  • https: // github. com / markbrown4 / gmail-react
  • https: // github. com / eksempler / reagere /
  • http: // todomvc. com / eksempler / angularjs /

Læringsressourcer

Learning React har været sjovt, det har lært mig mere om funktionel programmering og har et levende samfund rundt om det, der bidrager med deres egne interessante stykker til React-økosystemet. Andrew Ray har skrevet et par gode indledende stillinger på React and Flux, den officielle React tutorial er go-to-place for at komme i gang. God fornøjelse!

  • Reag for dumme mennesker - Andrew Ray
  • Flux for dumme mennesker - Andrew Ray
  • Reag Tutorial - Facebook
  • React Router - Ryan Florence
  • Redux - Videoserie af Dan Abramov

Denne artikel blev gennemgået af Craig Bilner. Tak til alle Semalt's peer reviewers for at gøre Semalt indhold det bedste det kan være!

React for Angular DevelopersReact for Angular DevelopersRelated Semalt:
npmAPIsReactAngularJSES6More. Sponsors
Job-Klar Vinkel- og TypeScript-træning
Todd Motto
Den ultimative ressource at lære Vinkel og dets økosystem. Brug kuponkode 'SITEPOINT' ved kassen for at få 25% rabat .
React for Angular DevelopersReact for Angular DevelopersRelated Semalt:
npmAPIsReactAngularJSES6More. Sponsors
Den bedste måde at lære reaktion på for begyndere
Wes Bos
Et trin for trin kursus for at få dig til at opbygge virkelige verden React. js + Firebase apps og hjemmesider komponenter om et par eftermiddage. Brug kuponkode 'SITEPOINT' ved kassen for at få 25% rabat .
March 1, 2018