Skip to content
Snippets Groups Projects
Commit 18b2de40 authored by Jean-Christophe's avatar Jean-Christophe
Browse files

useEffect hook à la création du composant

parent 41ee1cdc
No related branches found
No related tags found
No related merge requests found
...@@ -49,7 +49,10 @@ où `tag` peut prendre comme valeur : ...@@ -49,7 +49,10 @@ où `tag` peut prendre comme valeur :
* `v5.2` : modification et état courant : mise en évidence du problème * `v5.2` : modification et état courant : mise en évidence du problème
voir `/src/components/star.jsx` voir `/src/components/star.jsx`
* `v5.3` : modification et état courant : utilisation d'une fonction en argument de `setOn` pour modifier l'état à partir de la valeur précédente * `v5.3` : modification et état courant : utilisation d'une fonction en argument de `setOn` pour modifier l'état à partir de la valeur précédente
voir `/src/components/star.component.jsx` (et `/src/components/person.component.jsx`) voir `/src/components/star.jsx` (et `/src/components/person.component.jsx`)
* `v5.5` : cycle de vie du composant : utilisation du hook `useEffect` pour agir au moment de la création du composant : juste après le premier rendu.
voir `/src/components/personListing.jsx`
Faire ```git checkout main``` pour revenir à la version finale. Faire ```git checkout main``` pour revenir à la version finale.
div.personListing {
border : dashed thin black ;
padding : 10px;
margin : 5px;
}
import { useState } from 'react'; import { useState } from 'react';
// import stysheet defining style specific to this component // import stysheet defining style specific to this component
import './assets/style/person.css'; import '../assets/style/person.css';
/* /*
* define a component that uses props, props is a javascript object * define a component that uses props, props is a javascript object
*/ */
const Person = ( { name = 'Anonymous' , age , delay } ) => { const Person = ( { name = 'Anonymous', age, started, delay } ) => {
const [ currentAge, setCurrentAge ] = useState(age); const [ currentAge, setCurrentAge ] = useState(age);
// become older every delay ms
setInterval( () => setCurrentAge( previousCurrentAge => previousCurrentAge + 1 ), delay);
return ( return (
<div className="person">Here is : <div className="person">Here is :
......
import React from 'react'; import { useState, useEffect } from 'react';
import { mockFetch } from '../util/mockAPI.js';
import '../assets/style/personListing.css';
import Person from './person.component.jsx'; import Person from './person.component.jsx';
/*
* props.persons is an Array, here we assume with at least two elements const PersonListing = props => {
* Here a list of components is built, but no "key" property is provided => /!\ pb, see console const { started, delay } = props;
*/
const PersonListing = ({ persons , delay }) => { const [persons, setPersons ] = useState([]);
const personComponents = persons.map(person => <Person
useEffect( () => {
console.log('component did mount');
const fetchData = async () => {
const data = await mockFetch('http://source.of.data/persons',1000);
setPersons( data );
}
fetchData();
}, []);
const personComponents = persons?.map(person => <Person
{...person} {...person}
{...props}
key={person.id} key={person.id}
delay = { delay }
/>); />);
return ( return (
<div> <div className="personListing">
People getting older every <span class="highlight">{delay}</span> seconds People getting older every {delay} seconds
{personComponents} {personComponents}
</div> </div>
); );
......
import { useState } from 'react';
import PersonListing from './personListing.component.jsx';
const PersonListingController = ({ initialDelay = 250 }) => {
const [ closed, setClosed ] = useState(false);
const [ started, setStarted ] = useState(false);
const [ delay, setDelay ] = useState(initialDelay)
const startStop = () => setStarted( previousStarted => ! previousStarted);
const closeComponent = () => setClosed(true);
const changeDelay = newDelay => setDelay(newDelay);
if (closed)
return null;
// else
return (
<div>
<div className = 'controller'>
<button onClick= { startStop }>
{ started ? 'Stop' : 'Start'}
</button>
<button onClick= { () => changeDelay(250) }>Delay = 250</button>
<button onClick= { () => changeDelay(1000) }>Delay = 1000</button>
<button onClick= { closeComponent }>Close</button>
</div>
<PersonListing
delay = { delay }
started = { started }
/>
</div>
);
}
export default PersonListingController;
\ No newline at end of file
import React from 'react';
import '../style/person.css';
/*
* define component as a class that extends React.component
*/
export default class Person extends React.Component {
constructor(props) {
super(props);
}
render() {
const { name , age } = this.props;
const view = <div className="person">Here is :
<div>name : <span>{ name }</span> </div>
<div>age : <span>{ age }</span> </div>
</div>
return view;
}
}
import { createRoot } from 'react-dom/client'; import { createRoot } from 'react-dom/client';
// import React component import PersonListingController from '../components/personListingController.component.jsx';
import Star from '../components/star.component.jsx'
const bootstrapReact = () => { const bootstrapReact = () => {
const root = createRoot(document.getElementById('insertReactHere')); const root = createRoot(document.getElementById('insertReactHere'));
const component = <> const component = <PersonListingController />;
<Star /> <Star /> <Star />
</>
root.render(component); root.render(component);
} }
......
// used to "simulate" data fetching from some URL, here personsData is returned
/*
@param timetout simulate fetching delay, in ms, choose some high value (e.g. 2000) to highlight asynchronous operation
*/
import personsData from '../data/personsData.js';
const mockFetch = async (mockURL, timeout = 10) => {
return await new Promise(resolve => setTimeout(() => {
console.log(`simulate fetching data from ${mockURL}`);
resolve(personsData);
},
timeout)); // simulate a 'timeout' duration for fetching operation
}
export { mockFetch };
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment