react jsx babel composant props component state lifecycle ref
React.js
javascript et son écosystème
Licence mention Informatique
Université Lille – Sciences et Technologies
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 1
react jsx babel composant props component state lifecycle ref
orienté vues, approche déclarative
orienté composants
efficacité basée sur un DOM virtuel
installation
npm install react react-dom
+ dans navigateur React DevTools
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 2
react jsx babel composant props component state lifecycle ref
premier contact
react v0.1
// dans /src/main.js
import React from ’react’;
import ReactDOM from ’react-dom’;
const bootstrapReact =
() => ReactDOM.render(
React.createElement(’h3’, null, ’React in action !’),
document.getElementById(’insertReactHere’)
);
window.addEventListener( ’DOMContentLoaded’, bootstrapReact );
react v0.2
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 3
react jsx babel composant props component state lifecycle ref
webpack
mise en place
// dans webpack.config.js
module.exports = {
entry: ’./src/main.js’,
output: {
path: path.resolve(__dirname, ’public’),
filename: ’javascripts/bundle.js’
},...
// dans /public/index.html
...
<head>
<script src="javascripts/bundle.js"></script>
...
<body>
...
<div id="insertReactHere"></div>
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 4
react jsx babel composant props component state lifecycle ref
jsx
une extension syntaxique à JavaScript react v0.3
// dans /src/main.js
ReactDOM.render(
<article>
<h3>React in action, using jsx</h3>
<div>this div is in an article</div>
<div>this div is in the same article</div>
</article>,
document.getElementById(’insertReactHere’)
);
une expression JSX n’est ni du javascript ni une chaı̂ne de caractères
=⇒ nécessite un transpilage
une expression placée entre accolades { } est du code javascript
interprété
attribut : class className
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 5
react jsx babel composant props component state lifecycle ref
babel
transpiler le code (transformer/compiler)
installation
npm install @babel/core babel-loader --save-dev
permettre l’utilisation d’évolutions de javascript non encore intégrées
→ exemple : les modules es6
npm install @babel/preset-env --save-dev
créer le fichier de configuration .babelrc
{
"presets": ["@babel/preset-env"]
}
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 6
react jsx babel composant props component state lifecycle ref
avec webpack
application du transpilage avec webpack avec le babel-loader
npm install babel-loader --save-dev
ajout d’une règle dans webpack.config.js
// dans webpack.config.js
module: {
rules: [
{
test: /.js$/, // pour les fichiers .js
exclude: (/node_modules/),
use: [
{ loader : ’babel-loader’ }
]
},
... // autres règles .css, images, etc.
]
}
};
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 7
react jsx babel composant props component state lifecycle ref
babel et jsx
transpilage JSX avec Babel :
installation du module de transpilage pour react
npm install --save-dev @babel/preset-react
dans .babelrc, ajouter le module à presets
"presets": ["@babel/preset-env", "@babel/preset-react"]
application via npm run build
react v0.3
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 8
react jsx babel composant props component state lifecycle ref
premiers composants
composant sans état :
fonction dont le résultat est le contenu du composant.
le nom d’un composant commence pas une majuscule.
// dans /components/first.js
import React from ’react’;
const First =
() =>
<article>
...
</article>
export default First;
// dans /src/main.js
import First from ’../components/first.js’;
ReactDOM.render(<First />,
document.getElementById(’insertReactHere’));
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 9
react v0.4
react jsx babel composant props component state lifecycle ref
propriétés
via le paramètre props de la fonction constructeur
JSX : valeurs passées comme des attributs du composant
objet dont les propriétés sont non mutables
// dans /components/person.js
const Person =
(props) =>
<div className="person">I am :
<dl>
<dt>name</dt><dd> { props.name } </dd>
<dt>age</dt><dd> { props.age } </dd>
</dl>
</div>
// dans /src/main.js
<Person name="Someone Else" age = "42" />
<Person name="New One" age="1"/>
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 10
react v0.5
react jsx babel composant props component state lifecycle ref
props.children
les propriétés peuvent être des tableaux, des objets, etc.
props.children désigne les nœuds enfants fournis au composant lors
de son utilisation
// dans /components/personListing.js
const PersonListing =
(props) => <div>
<Person { ...props.persons[0] } />
<Person { ...props.persons[1] } />
{ props.children }
</div>
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 11
react jsx babel composant props component state lifecycle ref
// dans /src/main.js
import persons from ’../data/persons.js’; // un tableau d’objets
import PersonListing from ’../components/listing.js’;
import Person from ’../components/person.js’
const bootstrapReact = ()=> ReactDOM.render(
<PersonListing persons={ persons }>
<h3> first child</h3> // children
<Person name="Someone Else" age = "42" />
<Person name="New One" age="1"/>
</PersonListing>, ...
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 12
react jsx babel composant props component state lifecycle ref
classes de composants
extends React.component
les propriétés props sont en paramètre du constructeur
appel de super(props)
props devient this.props
c’est la méthode render() qui renvoie la vue du composant
le résultat ne peut avoir qu’un seul composant racine
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 13
react v1
react jsx babel composant props component state lifecycle ref
// dans /components/person.js
import React from ’react’;
export default class Person extends React.Component {
constructor(props)
super(props);
}
render() {
return(
<div className="person">I am :
<dl>
<dt>name</dt><dd> { this.props.name } </dd>
<dt>age</dt><dd> { this.props.age } </dd>
</dl>
</div>
);
}
}
approche déclarative : on décrit dans render() ce que l’on veut avoir
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 14
react jsx babel composant props component state lifecycle ref
defaultProps et propTypes
valeur par défaut et contraintes sur les propriétés
validation des valeurs des props à l’exécution, phase de développement
message warning dans la console en cas de non respect
// dans /components/person.js
import PropTypes from ’prop-types’;
export default class Person extends React.Component {
...
}
Person.defaultProps = {
name : ’Anonymous’
}
Person.propTypes = {
name : PropTypes.string,
age : PropTypes.number.isRequired
}
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 15
react jsx babel composant props component state lifecycle ref
composants à état
rappel : this.props non mutable
this.state représente l’état d’un composant : un objet
initialisé dans le constructeur
les modifications de l’état doivent être réalisées par des appels à la
méthode setState() qui prend en paramètre un objet décrivant les
modifications de state
les modifications sont ensuite répercutées sur la vue générée par
render()
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 16
react v2
react jsx babel composant props component state lifecycle ref
événements
Les modifications de l’état peuvent résulter d’un évènement.
les noms des événéments sont en notation “camelCase”
onclick onClick
avec JSX c’est la fonction qui est fournie comme valeur
bind() probablement nécessaire
onClick = {this.handleClick.bind(this)}
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 17
react jsx babel composant props component state lifecycle ref
// dans /components/star.js
export default class Star extends React.Component {
constructor(props) {
super(props);
this.state = { on : ... };
this.handleClick = this.handleClick.bind(this);
}
selectSource() {
if (this.state.on) return ... else return ...;
}
handleClick(event) {
this.setState( ... );
}
render() {
return(
<img src = { this.selectSource() }
onClick= { this.handleClick }
/> );
}
}
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 18
react jsx babel composant props component state lifecycle ref
state et props
il ne faut utiliser this.props pour initialiser l’état uniquement si la
prop utilisée a été explicitement définie uniquement dans le but de
servir “valeur d’initialisation”
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 19
react jsx babel composant props component state lifecycle ref
setState et état précédent
les mises à jour de l’état (et de props) peuvent être asynchrones
pour des raisons de performance React peut exécuter plusieurs
setState en une fois
donc, il ne faut pas baser la nouvelle valeur de l’état sur sa “valeur
courante”.
Ceci peut poser un problème de cohérence :
this.setState({on : ! this.state.on}); //
dans un tel cas il faut utiliser la version de setState qui prend en
paramètre une fonction qui sera appelée avec les valeurs qu’avaient de
state et props au moment de la mise à jour :
this.setState( (prevstate, props) => ({ on : ! prevstate.on }) );
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 20
react jsx babel composant props component state lifecycle ref
fusion des mises à jour
si l’état est composé de plusieurs données, on peut les mettre à jour
séparément,
React se charge de faire la fusion des mises à jour
constructor(props) {
super(props);
this.state = {
name : "anonymous",
age : 18
};
}
Les mises à jour peuvent être faites indépendamment si besoin :
changeValues(newName) {
this.setState({ name : newName });
... some operations ...
let newAge = ...;
this.setState({ age : newAge });
}
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 21
react jsx babel composant props component state lifecycle ref
liste de composants
on peut créer des collections de composants et les inclure dans JSX
avec { }.
lors de la production d’une collection de composants, il est nécessaire
d’attribuer à chaque composant une clé unique dans la liste
// dans /components/rating.js
render() {
let stars = new Array(5).fill(0).map (
(e,i) => <Star on={ i < this.state.rating } />
);
return(
<div className="rating">
{ stars }
</div>
);
}
Warning: Each child in an array or iterator should have a unique
"key" prop
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 22
react v2.5-bad
react jsx babel composant props component state lifecycle ref
attribut key
il faut définir l’attribut key
permet d’identifier les éléments ajoutés, supprimés ou modifiés
// dans /components/rating.js
render() {
let stars = new Array(5).fill(0).map(
(e,i) => <Star on= { i < this.state.rating } key={i} />
);
return(
<div className="rating">
{ stars }
</div>
);
}
typiquement une clef unique type id d’une base de données, à défaut
numéro d’ordre dans la liste
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 23
react v2.5-ok
react jsx babel composant props component state lifecycle ref
placer l’état au plus haut
dans React les valeurs sont transmises uniquement de « haut en bas »
entre les composants
une modification de l’état d’un enfant n’a pas d’effet sur un parent
quand les changements d’une valeur impactent plusieurs composants,
il faut la définir dans l’état du composant « le plus haut placé »
c’est-à-dire dans le composant racine commun à tous les composants
concernés
les demandes de changement par un enfant sont gérées par une
fonction du parent concerné
la fonction qui gère ce changement est transmise par le parent en tant
que props
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 24
react v3
react jsx babel composant props component state lifecycle ref
application
C’est la valeur de « rating » qui détermine les valeurs des « stars ». Il faut
gérer les modifications d’état au niveau de ce composant.
l’état value est défini dans Rating
dans Star la valeur de on est passée comme props, elle dépend de la
valeur de value dans le composant Rating parent
Rating transmet à Star la référence de la fonction qui permet de
modifier son état (onStarClicked)
au lieu d’exécuter setState, dans Star on exécute la fonction passée
pour onStarClicked
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 25
react jsx babel composant props component state lifecycle ref
// dans /components/rating.js
export default class Rating extends React.Component {
constructor(props) {
super(props);
this.state = { value : this.props.value };
}
handleStarClicked(starNum) {
...
this.setState( value : newValue );
}
render() {
let stars = new Array(5).fill(0).map(
(e,i) =>
<Star
on = { i < this.state.value }
onStarClicked = { () => this.handleStarClicked(i) }
key = {i}
/>
);
return(
<div className="rating">
...
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 26
react v3
react jsx babel composant props component state lifecycle ref
// dans /components/star.js
class Star extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
selectSource() {
if (this.props.on) { ...
}
handleClick() {
this.props.onStarClicked();
}
render() {
return(
<img src={this.selectSource()}
onClick={this.handleClick}
/>
);
}
}
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 27
react v3
react jsx babel composant props component state lifecycle ref
programmation déclarative
dans render() on décrit le composant en fonction des valeurs de
state et props
on fait évaluer l’état d’un composant par setState
cette modification peut provoquer des modifications des props
transmises aux composants enfants
la gestion de la dynamique des changements du composant est géré
par React
on n’a pas à expliciter ce qui doit se passer après un changement
après un changement, si besoin, React provoque un nouvel appel à
render qui adapte le composant
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 28
react jsx babel composant props component state lifecycle ref
composant optionnel
une valeur null pour un enfant se traduit par une absence
permet une construction optionnelles d’un composant
// dans /components/rating.js
render() {
const stars = ...;
// optional help
let help = null;
if (this.props.help !== undefined)
help = <Help alt="rating help"
msg= "yellow is better than gray"/>
return(<div className="rating">
{ stars}
<span> ({this.state.value}) </span>
{ help } // present if not null, ie. if this.props.help exists
</div>);
}
// dans /src/main.js
<Rating value = {5} help = { true }/>
<Rating value = {3}/>
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 29
react v3.1
react jsx babel composant props component state lifecycle ref
placer l’état au plus haut (bis)
react v4
composant BookList
constitué à partir de plusieurs composants Book
composant Book
les données d’un livre provienne du composant BookList
la vue gère les données des livres dont un composant Rating
on veut pouvoir afficher et donner une évaluation à chaque livre et
connaitre de la moyenne des évaluations sur l’ensemble des livres
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 30
react jsx babel composant props component state lifecycle ref
l’état doit être placé au niveau de BookList
il est constitué de la liste des données sur les livres
chaque livre dispose d’une évaluation (contrôlée dans vue Rating)
les éléments enfants remontent les demandes de modifications via des
fonctions fournies par BookList par une propriété :
clic sur Star
⇒ modification de l’évaluation d’un livre
⇒ modification de la moyenne des évaluations
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 31
react jsx babel composant props component state lifecycle ref
voir dans le code
//dans /components/BookList
const allbooks = this.state.books.map(
book => <Book
{ ...book }
onBookChange = this.handleBookChange }
key = { book.id }
/> )
utilisation de l’opérateur spread « { ...book } » avec JSX pour
éviter de répéter toutes les propriétés :
équivaut à : title={book.title} author={book.author} ...
l’attribut key dans la construction de la liste de composants
transmission par la propriété onBookChange de la fonction à appeler
par le composant enfant en cas de changement
noter que c’est bien handleBookChange qui appelle setState()
le rating moyen qui est affiché (et donc « mis à jour » si besoin)
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 32
react jsx babel composant props component state lifecycle ref
voir dans le code
dans /component/book.js ( pas de « state »)
//dans /component/book.js
handleRatingChange(newRating) {
const modifiedBook = { ...this.props, rating : newRating};
this.props.onBookChange(modifiedBook);
}
utilisation de l’opérateur spread dans ...this.props
et construction du nouvel objet par “remplacement” de rating
utilisation de la fonction passée en propriété pour transmettre les
modifications au parent :
this.props.onBookChange(modifiedBook)
création du lien par la propriété onRatingChange du composant
Rating
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 33
react jsx babel composant props component state lifecycle ref
voir dans le code
dans /components/Rating.js
pas de « state »
utilisation de this.props.onRatingChange dans
handleStarClicked
mise en place de la propriété onStarClicked de Star
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 34
react jsx babel composant props component state lifecycle ref
voir dans le code
dans /components/Star.js
voir onClick sur l’image et l’utilisation de
this.props.onStarChange
suivre le chemin de propagation du “message” en cas de clic sur
l’image d’un composant Star :
(Star) onClick handleClick this.props.onStarClicked
(Rating) handleStarClicked this.props.onRatingChange
(Book) handleRatingChange this.props.onBookChange
(BookList) handleBookChange setState
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 35
react jsx babel composant props component state lifecycle ref
méthode du « cycle de vie »
componentDidMount : exécutée après que le composant ait été inséré
dans le DOM render a été appelée
componentWillUpdate : exécutée avant que le composant ne soit
mis à jour dans le DOM render n’a pas encore été ré-appelée
componentDidUpdate : exécutée après que le composant ait été mis
à jour dans le DOM render a déjà été ré-appelée
componentWillUnMount : exécutée juste avant que le composant ne
soit retiré du DOM
componentWillMount et componentWillUpdate sont deprecated
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 36
react jsx babel composant props component state lifecycle ref
// dans /components/booklist.js
export default class BookList extends React.Component {
constructor(props) {
super(props);
this.state = { books : [] }
}
componentDidMount() {
// fetch allbooks data in some database...
this.setState({ books : allbooks});
}
...
}
// dans /src/main.js
const bootstrapReact =
() => ReactDOM.render(
<BookList />, // pas de ’props’
...
);
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 37
react jsx babel composant props component state lifecycle ref
référence vers l’élément DOM
il peut être nécessaire de disposer d’une référence directe vers l’élément
DOM
utilisation de l’attribut ref qui définit un callback
appelé juste avant componentDidMount() ou componentDidUpdate()
qui prend en paramètre l’élément DOM créé
un pattern classique est de l’utiliser pour initialiser un attribut du
composant qui mémorise la référence :
ref = { element => this.myElement = element }
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 38
react v4.1,4.2
react jsx babel composant props component state lifecycle ref
exemple
// dans /components/book.js
highlightTitle() {
this.titleSpan.style.backgroundColor = "yellow";
...
}
render() {
return(
<div className="book">
<span ref={ span => this.titleSpan = span }>
{this.props.title}
</span>
...
<button onClick={ this.highlightTitle }>highlight</button>
</div>
);
}
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 39
react jsx babel composant props component state lifecycle ref
input et valeur initiale
une valeur initiale constante (value) dans un input rend le champ
non éditable react v4.3-bad
il est nécessaire de gérer la valeur par le state et d’évoir une mise à
jour de la valeur sur l’évènement onChange react v4.3-ok
NB : l’évènement onBlur permet de ne déclencher un évènement qu’à
la fin de la saisie
alors que onChange le fait en cours de saisie
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 40
react jsx babel composant props component state lifecycle ref
aller plus loin
Flux ou Redux pour faciliter la gestion de l’état des composants
Store et Actions
React côté serveur
applications isomorphes
React Native pour construire des applications mobiles
Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 41

react (1)contexte appbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

  • 1.
    react jsx babelcomposant props component state lifecycle ref React.js javascript et son écosystème Licence mention Informatique Université Lille – Sciences et Technologies Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 1
  • 2.
    react jsx babelcomposant props component state lifecycle ref orienté vues, approche déclarative orienté composants efficacité basée sur un DOM virtuel installation npm install react react-dom + dans navigateur React DevTools Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 2
  • 3.
    react jsx babelcomposant props component state lifecycle ref premier contact react v0.1 // dans /src/main.js import React from ’react’; import ReactDOM from ’react-dom’; const bootstrapReact = () => ReactDOM.render( React.createElement(’h3’, null, ’React in action !’), document.getElementById(’insertReactHere’) ); window.addEventListener( ’DOMContentLoaded’, bootstrapReact ); react v0.2 Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 3
  • 4.
    react jsx babelcomposant props component state lifecycle ref webpack mise en place // dans webpack.config.js module.exports = { entry: ’./src/main.js’, output: { path: path.resolve(__dirname, ’public’), filename: ’javascripts/bundle.js’ },... // dans /public/index.html ... <head> <script src="javascripts/bundle.js"></script> ... <body> ... <div id="insertReactHere"></div> Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 4
  • 5.
    react jsx babelcomposant props component state lifecycle ref jsx une extension syntaxique à JavaScript react v0.3 // dans /src/main.js ReactDOM.render( <article> <h3>React in action, using jsx</h3> <div>this div is in an article</div> <div>this div is in the same article</div> </article>, document.getElementById(’insertReactHere’) ); une expression JSX n’est ni du javascript ni une chaı̂ne de caractères =⇒ nécessite un transpilage une expression placée entre accolades { } est du code javascript interprété attribut : class className Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 5
  • 6.
    react jsx babelcomposant props component state lifecycle ref babel transpiler le code (transformer/compiler) installation npm install @babel/core babel-loader --save-dev permettre l’utilisation d’évolutions de javascript non encore intégrées → exemple : les modules es6 npm install @babel/preset-env --save-dev créer le fichier de configuration .babelrc { "presets": ["@babel/preset-env"] } Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 6
  • 7.
    react jsx babelcomposant props component state lifecycle ref avec webpack application du transpilage avec webpack avec le babel-loader npm install babel-loader --save-dev ajout d’une règle dans webpack.config.js // dans webpack.config.js module: { rules: [ { test: /.js$/, // pour les fichiers .js exclude: (/node_modules/), use: [ { loader : ’babel-loader’ } ] }, ... // autres règles .css, images, etc. ] } }; Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 7
  • 8.
    react jsx babelcomposant props component state lifecycle ref babel et jsx transpilage JSX avec Babel : installation du module de transpilage pour react npm install --save-dev @babel/preset-react dans .babelrc, ajouter le module à presets "presets": ["@babel/preset-env", "@babel/preset-react"] application via npm run build react v0.3 Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 8
  • 9.
    react jsx babelcomposant props component state lifecycle ref premiers composants composant sans état : fonction dont le résultat est le contenu du composant. le nom d’un composant commence pas une majuscule. // dans /components/first.js import React from ’react’; const First = () => <article> ... </article> export default First; // dans /src/main.js import First from ’../components/first.js’; ReactDOM.render(<First />, document.getElementById(’insertReactHere’)); Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 9 react v0.4
  • 10.
    react jsx babelcomposant props component state lifecycle ref propriétés via le paramètre props de la fonction constructeur JSX : valeurs passées comme des attributs du composant objet dont les propriétés sont non mutables // dans /components/person.js const Person = (props) => <div className="person">I am : <dl> <dt>name</dt><dd> { props.name } </dd> <dt>age</dt><dd> { props.age } </dd> </dl> </div> // dans /src/main.js <Person name="Someone Else" age = "42" /> <Person name="New One" age="1"/> Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 10 react v0.5
  • 11.
    react jsx babelcomposant props component state lifecycle ref props.children les propriétés peuvent être des tableaux, des objets, etc. props.children désigne les nœuds enfants fournis au composant lors de son utilisation // dans /components/personListing.js const PersonListing = (props) => <div> <Person { ...props.persons[0] } /> <Person { ...props.persons[1] } /> { props.children } </div> Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 11
  • 12.
    react jsx babelcomposant props component state lifecycle ref // dans /src/main.js import persons from ’../data/persons.js’; // un tableau d’objets import PersonListing from ’../components/listing.js’; import Person from ’../components/person.js’ const bootstrapReact = ()=> ReactDOM.render( <PersonListing persons={ persons }> <h3> first child</h3> // children <Person name="Someone Else" age = "42" /> <Person name="New One" age="1"/> </PersonListing>, ... Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 12
  • 13.
    react jsx babelcomposant props component state lifecycle ref classes de composants extends React.component les propriétés props sont en paramètre du constructeur appel de super(props) props devient this.props c’est la méthode render() qui renvoie la vue du composant le résultat ne peut avoir qu’un seul composant racine Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 13 react v1
  • 14.
    react jsx babelcomposant props component state lifecycle ref // dans /components/person.js import React from ’react’; export default class Person extends React.Component { constructor(props) super(props); } render() { return( <div className="person">I am : <dl> <dt>name</dt><dd> { this.props.name } </dd> <dt>age</dt><dd> { this.props.age } </dd> </dl> </div> ); } } approche déclarative : on décrit dans render() ce que l’on veut avoir Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 14
  • 15.
    react jsx babelcomposant props component state lifecycle ref defaultProps et propTypes valeur par défaut et contraintes sur les propriétés validation des valeurs des props à l’exécution, phase de développement message warning dans la console en cas de non respect // dans /components/person.js import PropTypes from ’prop-types’; export default class Person extends React.Component { ... } Person.defaultProps = { name : ’Anonymous’ } Person.propTypes = { name : PropTypes.string, age : PropTypes.number.isRequired } Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 15
  • 16.
    react jsx babelcomposant props component state lifecycle ref composants à état rappel : this.props non mutable this.state représente l’état d’un composant : un objet initialisé dans le constructeur les modifications de l’état doivent être réalisées par des appels à la méthode setState() qui prend en paramètre un objet décrivant les modifications de state les modifications sont ensuite répercutées sur la vue générée par render() Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 16 react v2
  • 17.
    react jsx babelcomposant props component state lifecycle ref événements Les modifications de l’état peuvent résulter d’un évènement. les noms des événéments sont en notation “camelCase” onclick onClick avec JSX c’est la fonction qui est fournie comme valeur bind() probablement nécessaire onClick = {this.handleClick.bind(this)} Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 17
  • 18.
    react jsx babelcomposant props component state lifecycle ref // dans /components/star.js export default class Star extends React.Component { constructor(props) { super(props); this.state = { on : ... }; this.handleClick = this.handleClick.bind(this); } selectSource() { if (this.state.on) return ... else return ...; } handleClick(event) { this.setState( ... ); } render() { return( <img src = { this.selectSource() } onClick= { this.handleClick } /> ); } } Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 18
  • 19.
    react jsx babelcomposant props component state lifecycle ref state et props il ne faut utiliser this.props pour initialiser l’état uniquement si la prop utilisée a été explicitement définie uniquement dans le but de servir “valeur d’initialisation” Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 19
  • 20.
    react jsx babelcomposant props component state lifecycle ref setState et état précédent les mises à jour de l’état (et de props) peuvent être asynchrones pour des raisons de performance React peut exécuter plusieurs setState en une fois donc, il ne faut pas baser la nouvelle valeur de l’état sur sa “valeur courante”. Ceci peut poser un problème de cohérence : this.setState({on : ! this.state.on}); // dans un tel cas il faut utiliser la version de setState qui prend en paramètre une fonction qui sera appelée avec les valeurs qu’avaient de state et props au moment de la mise à jour : this.setState( (prevstate, props) => ({ on : ! prevstate.on }) ); Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 20
  • 21.
    react jsx babelcomposant props component state lifecycle ref fusion des mises à jour si l’état est composé de plusieurs données, on peut les mettre à jour séparément, React se charge de faire la fusion des mises à jour constructor(props) { super(props); this.state = { name : "anonymous", age : 18 }; } Les mises à jour peuvent être faites indépendamment si besoin : changeValues(newName) { this.setState({ name : newName }); ... some operations ... let newAge = ...; this.setState({ age : newAge }); } Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 21
  • 22.
    react jsx babelcomposant props component state lifecycle ref liste de composants on peut créer des collections de composants et les inclure dans JSX avec { }. lors de la production d’une collection de composants, il est nécessaire d’attribuer à chaque composant une clé unique dans la liste // dans /components/rating.js render() { let stars = new Array(5).fill(0).map ( (e,i) => <Star on={ i < this.state.rating } /> ); return( <div className="rating"> { stars } </div> ); } Warning: Each child in an array or iterator should have a unique "key" prop Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 22 react v2.5-bad
  • 23.
    react jsx babelcomposant props component state lifecycle ref attribut key il faut définir l’attribut key permet d’identifier les éléments ajoutés, supprimés ou modifiés // dans /components/rating.js render() { let stars = new Array(5).fill(0).map( (e,i) => <Star on= { i < this.state.rating } key={i} /> ); return( <div className="rating"> { stars } </div> ); } typiquement une clef unique type id d’une base de données, à défaut numéro d’ordre dans la liste Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 23 react v2.5-ok
  • 24.
    react jsx babelcomposant props component state lifecycle ref placer l’état au plus haut dans React les valeurs sont transmises uniquement de « haut en bas » entre les composants une modification de l’état d’un enfant n’a pas d’effet sur un parent quand les changements d’une valeur impactent plusieurs composants, il faut la définir dans l’état du composant « le plus haut placé » c’est-à-dire dans le composant racine commun à tous les composants concernés les demandes de changement par un enfant sont gérées par une fonction du parent concerné la fonction qui gère ce changement est transmise par le parent en tant que props Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 24 react v3
  • 25.
    react jsx babelcomposant props component state lifecycle ref application C’est la valeur de « rating » qui détermine les valeurs des « stars ». Il faut gérer les modifications d’état au niveau de ce composant. l’état value est défini dans Rating dans Star la valeur de on est passée comme props, elle dépend de la valeur de value dans le composant Rating parent Rating transmet à Star la référence de la fonction qui permet de modifier son état (onStarClicked) au lieu d’exécuter setState, dans Star on exécute la fonction passée pour onStarClicked Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 25
  • 26.
    react jsx babelcomposant props component state lifecycle ref // dans /components/rating.js export default class Rating extends React.Component { constructor(props) { super(props); this.state = { value : this.props.value }; } handleStarClicked(starNum) { ... this.setState( value : newValue ); } render() { let stars = new Array(5).fill(0).map( (e,i) => <Star on = { i < this.state.value } onStarClicked = { () => this.handleStarClicked(i) } key = {i} /> ); return( <div className="rating"> ... Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 26 react v3
  • 27.
    react jsx babelcomposant props component state lifecycle ref // dans /components/star.js class Star extends React.Component { constructor(props) { super(props); this.handleClick = this.handleClick.bind(this); } selectSource() { if (this.props.on) { ... } handleClick() { this.props.onStarClicked(); } render() { return( <img src={this.selectSource()} onClick={this.handleClick} /> ); } } Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 27 react v3
  • 28.
    react jsx babelcomposant props component state lifecycle ref programmation déclarative dans render() on décrit le composant en fonction des valeurs de state et props on fait évaluer l’état d’un composant par setState cette modification peut provoquer des modifications des props transmises aux composants enfants la gestion de la dynamique des changements du composant est géré par React on n’a pas à expliciter ce qui doit se passer après un changement après un changement, si besoin, React provoque un nouvel appel à render qui adapte le composant Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 28
  • 29.
    react jsx babelcomposant props component state lifecycle ref composant optionnel une valeur null pour un enfant se traduit par une absence permet une construction optionnelles d’un composant // dans /components/rating.js render() { const stars = ...; // optional help let help = null; if (this.props.help !== undefined) help = <Help alt="rating help" msg= "yellow is better than gray"/> return(<div className="rating"> { stars} <span> ({this.state.value}) </span> { help } // present if not null, ie. if this.props.help exists </div>); } // dans /src/main.js <Rating value = {5} help = { true }/> <Rating value = {3}/> Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 29 react v3.1
  • 30.
    react jsx babelcomposant props component state lifecycle ref placer l’état au plus haut (bis) react v4 composant BookList constitué à partir de plusieurs composants Book composant Book les données d’un livre provienne du composant BookList la vue gère les données des livres dont un composant Rating on veut pouvoir afficher et donner une évaluation à chaque livre et connaitre de la moyenne des évaluations sur l’ensemble des livres Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 30
  • 31.
    react jsx babelcomposant props component state lifecycle ref l’état doit être placé au niveau de BookList il est constitué de la liste des données sur les livres chaque livre dispose d’une évaluation (contrôlée dans vue Rating) les éléments enfants remontent les demandes de modifications via des fonctions fournies par BookList par une propriété : clic sur Star ⇒ modification de l’évaluation d’un livre ⇒ modification de la moyenne des évaluations Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 31
  • 32.
    react jsx babelcomposant props component state lifecycle ref voir dans le code //dans /components/BookList const allbooks = this.state.books.map( book => <Book { ...book } onBookChange = this.handleBookChange } key = { book.id } /> ) utilisation de l’opérateur spread « { ...book } » avec JSX pour éviter de répéter toutes les propriétés : équivaut à : title={book.title} author={book.author} ... l’attribut key dans la construction de la liste de composants transmission par la propriété onBookChange de la fonction à appeler par le composant enfant en cas de changement noter que c’est bien handleBookChange qui appelle setState() le rating moyen qui est affiché (et donc « mis à jour » si besoin) Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 32
  • 33.
    react jsx babelcomposant props component state lifecycle ref voir dans le code dans /component/book.js ( pas de « state ») //dans /component/book.js handleRatingChange(newRating) { const modifiedBook = { ...this.props, rating : newRating}; this.props.onBookChange(modifiedBook); } utilisation de l’opérateur spread dans ...this.props et construction du nouvel objet par “remplacement” de rating utilisation de la fonction passée en propriété pour transmettre les modifications au parent : this.props.onBookChange(modifiedBook) création du lien par la propriété onRatingChange du composant Rating Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 33
  • 34.
    react jsx babelcomposant props component state lifecycle ref voir dans le code dans /components/Rating.js pas de « state » utilisation de this.props.onRatingChange dans handleStarClicked mise en place de la propriété onStarClicked de Star Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 34
  • 35.
    react jsx babelcomposant props component state lifecycle ref voir dans le code dans /components/Star.js voir onClick sur l’image et l’utilisation de this.props.onStarChange suivre le chemin de propagation du “message” en cas de clic sur l’image d’un composant Star : (Star) onClick handleClick this.props.onStarClicked (Rating) handleStarClicked this.props.onRatingChange (Book) handleRatingChange this.props.onBookChange (BookList) handleBookChange setState Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 35
  • 36.
    react jsx babelcomposant props component state lifecycle ref méthode du « cycle de vie » componentDidMount : exécutée après que le composant ait été inséré dans le DOM render a été appelée componentWillUpdate : exécutée avant que le composant ne soit mis à jour dans le DOM render n’a pas encore été ré-appelée componentDidUpdate : exécutée après que le composant ait été mis à jour dans le DOM render a déjà été ré-appelée componentWillUnMount : exécutée juste avant que le composant ne soit retiré du DOM componentWillMount et componentWillUpdate sont deprecated Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 36
  • 37.
    react jsx babelcomposant props component state lifecycle ref // dans /components/booklist.js export default class BookList extends React.Component { constructor(props) { super(props); this.state = { books : [] } } componentDidMount() { // fetch allbooks data in some database... this.setState({ books : allbooks}); } ... } // dans /src/main.js const bootstrapReact = () => ReactDOM.render( <BookList />, // pas de ’props’ ... ); Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 37
  • 38.
    react jsx babelcomposant props component state lifecycle ref référence vers l’élément DOM il peut être nécessaire de disposer d’une référence directe vers l’élément DOM utilisation de l’attribut ref qui définit un callback appelé juste avant componentDidMount() ou componentDidUpdate() qui prend en paramètre l’élément DOM créé un pattern classique est de l’utiliser pour initialiser un attribut du composant qui mémorise la référence : ref = { element => this.myElement = element } Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 38 react v4.1,4.2
  • 39.
    react jsx babelcomposant props component state lifecycle ref exemple // dans /components/book.js highlightTitle() { this.titleSpan.style.backgroundColor = "yellow"; ... } render() { return( <div className="book"> <span ref={ span => this.titleSpan = span }> {this.props.title} </span> ... <button onClick={ this.highlightTitle }>highlight</button> </div> ); } Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 39
  • 40.
    react jsx babelcomposant props component state lifecycle ref input et valeur initiale une valeur initiale constante (value) dans un input rend le champ non éditable react v4.3-bad il est nécessaire de gérer la valeur par le state et d’évoir une mise à jour de la valeur sur l’évènement onChange react v4.3-ok NB : l’évènement onBlur permet de ne déclencher un évènement qu’à la fin de la saisie alors que onChange le fait en cours de saisie Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 40
  • 41.
    react jsx babelcomposant props component state lifecycle ref aller plus loin Flux ou Redux pour faciliter la gestion de l’état des composants Store et Actions React côté serveur applications isomorphes React Native pour construire des applications mobiles Université Lille – Sciences et Technologies - Licence mention Informatique javascript et son écosystème 41