Workshop: React
Repo
https://github.com/magnudae/react-workshop
Hva er React? (1/3)
- Bibliotek for å bygge brukergrensesnitt
UI bygget opp av komponenter
- Komponent er en instans av en klasse
- Klasse må inneholde render()
var HelloWorld = React.createClass({
render: function() {
return (
<div>
<h1> Hello World! </h1>
</div>
);
}
});
JSX
- JS-syntaks som likner XML
- Enklere å lese og jobbe med
var HelloWorld = React.createClass({
render: function() {
return (
<div>
<h1> Hello World! </h1>
<p> Dette er et eksempel </p>
</div>
);
}
});
Uten JSX
var HelloWorld = React.createClass({
render: function() {
return (
React.createElement("div", null,
React.createElement("h1", null, "HelloWorld"),
React.createElement("p", null, "Dette er et eksempel")
)
);
}
});
Oppgave
Gjør om MainComponent til å skrive ut
1. "Hello World!" i en <h1>
2. Noe tekst i en <p>
Ekstra: Legg til et bilde og bruk imageUrl som src
Nestede komponenter
- UI består av et tre av komponenter
var InnerComponent = React.createClass({
render: function() {
return (
<p>
Dette er et eksempel
</p>
);
}
});
var HelloWorld = React.createClass({
render: function() {
return (
<div>
<h1> Hello World! </h1>
<InnerComponent />
</div>
);
}
});
Oppgave
Lag en ny komponent og flytt enten <h1>-en eller <p>-en fra MainComponent dit
Ekstra: Lag den nye komponenten i en egen fil
Komponenter innholder to typer data
this.props
this.state
Mutable
(med this.setState)
Immutable
this.props - Properties
- Dette er hvordan data beveger seg ned treet av komponenter
- Kommer fra forelder-komponent
- Alltid immutable data
Eksempel
var InnerComponent = React.createClass({
render: function() {
return (
<p>
{this.props.innertext}
</p>
);
}
});
var HelloWorld = React.createClass({
render: function() {
return (
<div>
<h1> Hello World! </h1>
<InnerComponent innertext="Dette er et eksempel" />
</div>
);
}
});
this.state
- Beskriver en tilstand i en komponent
- Eks. dropdown
- Gjelder kun for en komponent
- Mutable - men endres kun via this.setState-metoden
- Trigger render-metoden
Eksempel
var CounterComponent = React.createClass({
getInitialState: function(){
return {
counter: 1
};
},
_onClick: function (event) {
this.setState({
counter: this.state.counter + 1
});
},
render: function() {
return (
<div>
<p>
Counter: {this.state.counter}
</p>
<button onClick={this._onClick}> 1 up </button>
</div>
);
}
});
Oppgave
1. Send en property inn i den nye komponenten og vis den på skjermen
2. Lag en ny tilstandsvariabel og vis den på skjermen (hint: getInitialState)
3. Lag en button og oppdater den nye tilstanden med onClick
Hva er React? (2/3)
- Bibliotek for å bygge brukergrensesnitt
- Lager et tre av komponenter/render-funksjoner
- Data sendes som parametere
- Funksjonene returnerer HTML
Collection rendering
var MessagesComponent = React.createClass({
getInitialState: function(){
return {
messages: [
{text: "Lorem ipsum dolor sit amet"},
{text: "Cras convallis congue"},
{text: "Donec cursus leo malesuada"}
]
};
},
render: function() {
var messages = this.state.messages.map(function (message) {
return (
<p>{message.text}</p>
);
});
return (
<div>
{messages}
</div>
);
}
});
Oppgave
Send en liste (med lengde > 1) med tekster som props til barnekomponenten din, og vis disse tekstene i hver
sin <li>-tag inni en <ul>-tag
Ekstra: Se i konsollen i nettleseren din. Får du
feilmelding fra React? Hvorfor?
Behind the scenes
-
this.setState() endrer tilstanden til en komponent
-
render() blir kalt, som igjen rekursivt kaller render() på alle barnekomponenter
-
Sender med eventuelle props
-
Sender med eventuelle props
-
render() resulterer i et tre av Reacts egne datastruktur
-
Virtual DOM
-
Virtual DOM
- Differansen mellom virtuell og ekte DOM blir beregnet,
og ekte DOM blir oppdatert dersom nødvendig
class MainComponent extends React.Component {
constructor(props){
this.state = {
win: "lost damn!",
};
}
render() {
return (
<div>
<h1> Hello World </h1>
</div>
);
}
};
The ES6 way
var InputComponent = React.createClass({
getInitialState: function(){
return {
placeholder: "Input here"
};
},
render: function() {
return (
<div>
<textarea placeholder={this.state.placeholder} />
</div>
);
}
});
module.exports = InputComponent;
The "old" way
Hva er React? (3/3)
- Bibliotek for å bygge brukergrensesnitt
- Lager et tre av komponenter/render-funksjoner
- Data sendes som parametere
- Funksjonene returnerer HTML
- Komplett re-rendering for hver tilstandsendring i komponenten
Flux architecture
Utvidelser
- McFly
- Fluxible
- Fluxxor
- Reflux
- mm
var Flux = <require McFly instance>;
var _text = [];
var Store = Flux.createStore({
emitChange: function() {
this.emit("CHANGE_EVENT");
},
addChangeListener: function(callback) {
this.on("CHANGE_EVENT", callback);
},
getText: function(){
return _text;
}
}, function(payload){
if(payload.actionType === "TEST_ACTION") {
_text.push(payload.text);
Store.emitChange();
}
});
Store
var Flux = <require McFly instance>;
var Actions = Flux.createActions({
testAction: function(text) {
return {
actionType: 'TEST_ACTION',
text: text
}
}
});
Actions
Oppgave 1
Lag en ny action
Eks: onClick sender tekst action
Oppgave 2
Ta i mot den nye actionen i storen
Eks: Lagre innkommende tekst
Oppgave 3
Oppdater applikasjonen
Eks: Få appen til å oppdateres på en change emit
BONUS
- componentWillMount( )
- componentWIllUnmount( )
Mount/Unmount
Update
- componentWillRecieveProps( nextprops )
- shouldComponentUpdate( nextProps, nextState )
- componentWillUpdate( nextProps, nextState )
Oppgave 2
Lag en shouldComponentUpdate funksjon som bare oppdaterer component i spesielle cases
Eks: Hver gang vi har et partall antall meldinger
Oppgave 1
Bruk componentWillRecieveProps til å påvirke
staten til componenten
Eks: Sett placeholder state ifra props
Workshop: React
By Magnús Dæhlen
Workshop: React
- 1,077