Une bibliothèque pour réaliser des interfaces web mais pas seulement
Julien M’Poy
February16, 2018
XML dans du JavaScript)<div>, <p>, …) ou d’autres composants React.render() dans le cas d’un classe)Dans notre fichier index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello World</title>
</head>
<body>
<div id="root">
<!--
The app component will be mounted here.
Have a look in the ReactDOM.render call in index.js
-->
</div>
<script type="text/javascript" src="js/index.js"></script></body>
</html>
Dans notre fichier index.js:
import React from 'react';
import ReactDOM from 'react-dom';
/*
* Toggle comment between these two imports to use either
* the object oriented variant or the functionnal variant.
*/
import App from './AppFunction.js';
// import App from './AppClass.js';
ReactDOM.render(<App />, document.getElementById('root'));
import React from 'react';
const App = props => {
return (
<div>
<h1>Hello World!</h1>
<p>This is a simple functionnal component!</p>
</div>
);
};
export default App;
import React, {Component} from 'react';
class App extends Component {
render() {
return (
<div>
<h1>Hello World!</h1>
<p>This is a simple class component!</p>
</div>
);
}
}
export default App;
Déroulement de l’exécution:
index.js.ReactDOM «monte» le composant.render() et affichage du DOM final dans le <div>.import React from 'react';
/*
* Toggle comment between these two imports to use either
* the object oriented version or the functionnal
* version.
*/
import AnimalsList from './components/AnimalsList.js';
// import AnimalsList from './containers/AnimalsList.js';
const ANIMALS = [
{name: 'Chocolate Lion'},
{name: 'Bad Cat'},
{name: 'Octopus'},
{name: 'Dog'},
];
const App = props => {
return (
<div>
<AnimalsList title="My Animals" animals={ANIMALS} />
</div>
);
};
export default App;
import React from 'react';
const AnimalsList = props => {
return (
<div>
<h1>{props.title}</h1>
<ul>
{props.animals.map((item, index) => {
return <li key={index}>{item.name}</li>;
})}
</ul>
<p>The functionnal version rendered this list.</p>
</div>
);
};
export default AnimalsList;
Le templating côté JavaScript se fait avec { }.
import React, {Component} from 'react';
class AnimalsList extends Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<h1>{this.props.title}</h1>
<ul>
{this.props.animals.map((item, index) => {
return <li key={index}>{item.name}</li>;
})}
</ul>
<p>The class version rendered this list.</p>
</div>
);
}
}
export default AnimalsList;
this.props.childrenchildrenDans notre index.js:
import React from 'react';
import ReactDOM from 'react-dom';
const MyComponent = props => {
return <div>{props.children}</div>;
};
const App = props => {
return (
<MyComponent>
<h1>First child</h1>
<p>Second child</p>
<p>Third child</p>
</MyComponent>
);
};
ReactDOM.render(<App />, document.getElementById('root'));
Un composant peut posséder un état (stateful) ou non (stateless).
En général:
ModelView dans un pattern MVVM.this.setState.render().Dans notre index.js:
import React, {Component} from 'react';
import ReactDOM from 'react-dom';
class Counter extends Component {
constructor(props) {
super(props);
// Set the default state in the constructor
this.state = {counter: 0};
/* "this" is problematic for events handling
* in the render method that's why we have to use
* "bind"
*/
this.incrementCounter = this.incrementCounter.bind(this);
this.decrementCounter = this.decrementCounter.bind(this);
this.resetCounter = this.resetCounter.bind(this);
}
incrementCounter() {
this.setState({counter: this.state.counter + 1});
}
decrementCounter() {
this.setState({counter: this.state.counter - 1});
}
resetCounter() {
this.setState({counter: 0});
}
render() {
var isPeer = this.state.counter % 2 == 0 ? 'peer' : 'even';
return (
<div>
<h1>State and events</h1>
<p>counter: {this.state.counter}</p>
<p>The counter value is {isPeer}.</p>
<button type="button" onClick={this.incrementCounter}>
Increment
</button>
<button type="button" onClick={this.decrementCounter}>
Decrement
</button>
<button type="button" onClick={this.resetCounter}>
Reset
</button>
</div>
);
}
}
ReactDOM.render(<Counter />, document.getElementById('root'));
componentDidMount: appelée la première fois que le component est «dessiné» (render).componentWillUnmount: appelée lorsque le component va être démonté/supprimé.Ces méthodes existent pour ne pas faire de tâches susceptibles de prendre du temps dans le constructeur (eg. allocation/destruction de ressources, AJAX, etc.).
L’affichage du component ne doit pas être retardé par une de ces tâches.
class MyComponent extends React.Component {
render() {
return (
<div class="form-component">
<h1>Hello world</h1>
<p>Hello! It's me! Your first component!</p>
<form>
<label for="message">Message : <label>
<input id="message" name="message" value="">
</form>
</div>
);
}
}
ReactDOM.render(
<MyComponent />, document.getElementById('my-component')
);
class,for, this, with et switch sont des mots réservés en JavaScript. Il faut utiliser className et htmlFor pour palier à ce problème. React s’occupe de faire la transformation pour nous.
class MyComponent extends React.Component {
render() {
return (
<div className="form-component">
<h1>Hello world</h1>
<p>Hello! It's me! Your first component!</p>
<form>
<label htmlFor="message">Message : <label>
<input id="message" name="message" value="">
</form>
</div>
);
}
}
ReactDOM.render(
<MyComponent />, document.getElementById('my-component')
);
On ne peut pas utiliser this.eventHandlerMethod pour gérer les évènements dans render sans utiliser bind dans le constructeur.
Il existe d’autres solutions que bind.
On utilise onClick comme équivalent à onclick, onBlur pour onblur, onMouseOver pour onmouseover, etc.
Un grande partie des évènements sont supportés et il suffit généralement d’utiliser le nom de l’évènement en version camelCase pour l’utiliser (liste exhaustive des évènements supportés).
react-router-dom pour du web et react-router-native pour React Native pour React Native.Procédure assez simple:
$ npm install -g create-react-app
$ create-react-app my-app
$ cd my-app
$ npm run start
En voiture Simone!