Download as pdf or txt
Download as pdf or txt
You are on page 1of 3

‭1.

Partie théorique :‬ import‬‭


‭ {‬‭
Provider‬‭
}‬‭
from‬‭
"react-redux"‬
;‬

‭1. Commande pour créer un nouveau projet React :‬ ‭- `npx create-react-app nom_du_projet`‬ import‬‭
‭ UsersList‬‭
from‬‭
"./UsersList"‬
;‬

‭2. Port par défaut du serveur de développement React :‬ ‭- `3000`‬
import‬‭
‭ AddUser‬‭
from‬‭
"./AddUser"‬
;‬

‭3. Copie du DOM "réel" conservée en mémoire :‬ ‭- `a. Virtual DOM`‬
‭4. Props dans ReactJS :‬ ‭- `c) Les deux a et b sont vrais.`‬ import‬‭
‭ UserEdit‬‭
from‬‭
"./UserEdit"‬
;‬

‭2. Partie pratique‬ import‬‭
‭ {‬‭
BrowserRouter‬
,‬‭
‭ Route‬
,‬‭
‭ Routes‬‭
}‬‭
from‬‭
'react-router-dom'‬
;‬

‭Étape 1: Création du store et les reducers avec Redux Toolkit‬
‭1. **Créer le store Redux:** - Dans `features/store.js`:‬ function‬‭
‭ App‬
() {‬

//store.js‬

return‬‭
‭ (‬
import‬‭
‭ {‬‭
configureStore‬‭
}‬‭
from‬‭
"@reduxjs/toolkit"‬
;‬

<‬
‭Provider‬‭
‭ store‬
=‭
‭{
‬‬
store‬
‭ }‬
‭>‬

import‬‭
‭ usersReducer‬‭
from‬‭
"./usersSlice"‬
;‬

<‬
‭BrowserRouter‬
‭ >‬

const‬‭
‭ store‬‭
=‬‭
configureStore‬
({‬

<‬
‭Routes‬
‭ >‬

reducer:‬‭
‭ {‬
<‬
‭Route‬‭
‭ index‬‭
path‬
=‬
‭"/"‬‭
‭ element‬
=‭
‭{
‬‬
<‬
‭UsersList‬‭
‭ />‬
}‬‭
‭ />‬
user‬
‭ :‬‭
‭ usersReducer‬
,‬

<‬
‭Route‬‭
‭ path‬
=‬
‭"/userEdit/:id"‬‭
‭ element‬
=‬
‭{‬
‭<‬
‭UserEdit‬‭
‭ />‬
}‬‭
‭ />‬
},‬

<‬
‭Route‬‭
‭ path‬
=‬
‭"/addUser"‬‭
‭ element‬
=‬
‭{‬
‭<‬
‭AddUser‬‭
‭ />‬
}‬‭
‭ />‬
});‬

</‬
‭ Routes‬
‭ >‬

export‬‭
‭ default‬‭
store‬
;‬

</‬
‭ BrowserRouter‬
‭ >‬

</‬
‭ Provider‬
‭ >‬

‭2-3-4. **Créer le slice usersSlice:** - Dans `features/usersSlice.js`:‬
);‬

//UserList.js‬

}‬

import‬‭
‭ React‬
, {‬‭
‭ useEffect‬‭
}‬‭
from‬‭
'react'‬
;‬

export‬‭
‭ default‬‭
App‬
;‬

import‬‭
‭ {‬‭
useDispatch‬
,‬‭
‭ useSelector‬‭
}‬‭
from‬‭
'react-redux'‬
;‬

import‬‭
‭ {‬‭
getUsers‬‭
}‬‭
from‬‭
'../features/usersSlice'‬
;‬

import‬‭
‭ UserItem‬‭
from‬‭
'./UserItem'‬
;‬
‭ ‭2. **<UsersList/>:** - Dans `components/UsersList.js`:‬
//UserList.js‬

import‬‭
‭ {‬‭
NavLink‬‭
}‬‭
from‬‭
'react-router-dom'‬
;‬

import‬‭
‭ React‬
, {‬‭
‭ useEffect‬‭
}‬‭
from‬‭
'react'‬
;‬

import‬‭
‭ {‬‭
useDispatch‬
,‬‭
‭ useSelector‬‭
}‬‭
from‬‭
'react-redux'‬
;‬

const‬‭
‭ UsersList‬‭
=‬‭
()‬‭
=>‬‭
{‬
import‬‭
‭ {‬‭
getUsers‬‭
}‬‭
from‬‭
'../features/usersSlice'‬
;‬

const‬‭
‭ dispatch‬‭
=‬‭
useDispatch‬
();‬

import‬‭
‭ UserItem‬‭
from‬‭
'./UserItem'‬
;‬

import‬‭
‭ {‬‭
NavLink‬‭
}‬‭
from‬‭
'react-router-dom'‬
;‬

const‬‭
‭ {‬‭
value‬
,‬‭
‭ isLoading‬
,‬‭
‭ err‬‭
}‬‭
=‬‭
useSelector‬
((‬
‭ state‬
‭ )‬‭
‭ =>‬‭
state‬
.‬
‭user‬
‭ );‬

const‬‭
‭ UsersList‬‭
= ()‬‭
=>‬‭
{‬
useEffect‬
‭ (()‬‭
‭ =>‬‭
{‬
const‬‭
‭ dispatch‬‭
=‬‭
useDispatch‬
();‬

dispatch‬
‭ (‬
‭getUsers‬
‭ ());‬

}, [‬
‭ dispatch‬
‭ ]);‬

const‬‭
‭ {‬‭
value‬
,‬‭
‭ isLoading‬
,‬‭
‭ err‬‭
} =‬‭
useSelector‬
((‬
‭ state‬
‭ )‬‭
‭ =>‬‭
state‬
.‬
‭user‬
‭ );‬

const‬‭
‭ users‬‭
=‬‭
(‬
useEffect‬
‭ (()‬‭
‭ =>‬‭
{‬
<div>‬

dispatch‬
‭ (‬
‭getUsers‬
‭ ());‬

{‬
‭value‬
‭ .‬
‭length‬‭
‭ >‬‭
0‬‭
?‬‭
value‬
.‭
‭m
‬ap‬
((‬
‭ item‬
‭ )‬‭
‭ =>‬‭
<‬
UserItem‬‭
‭ user‬
=‬
‭{‭
‭i
‬tem‬
}‬‭
‭ key‬
=‬
‭{‬
‭item‬
‭ .‬
‭id‬
‭ }‬‭
‭ />‬
) :‬‭
‭ null}‬
}, [‬
‭ dispatch‬
‭ ]);‬

</div>‬

);‬

const‬‭
‭ users‬‭
= (‬
<div>‬

if‬‭
‭ (‬
err‬‭
‭ !==‬‭
null‬
) {‬

{‬
‭value‬
‭ .‬
‭length‬‭
‭ >‬‭
0‬‭
?‬‭
value‬
.‭
‭m
‬ap‬
((‬
‭ item‬
‭ )‬‭
‭ =>‬‭
<‬
UserItem‬‭
‭ user‬
=‬
‭{‭
‭i
‬tem‬
}‬‭
‭ key‬
=‬
‭{‬
‭item‬
‭ .‬
‭id‬
‭ }‬‭
‭ />‬
) :‬‭
‭ null}‬
return‬‭
‭ <h1>‬
{‬
‭err‬
‭ }‭
‭<
‬/h1>‬
;‬

</div>‬

}‬

);‬

return‬‭
‭ (‬
if‬‭
‭ (‬
err‬‭
‭ !==‬‭
null‬
) {‬

<div‬‭
‭ className‬
=‭
‭"
‬container mt-5"‬
>‬

return‬‭
‭ <h1>‬
{‬
‭err‬
‭ }‬
‭</h1>‬
‭ ;‬

<h1>‬
‭ Users List‬
‭ </h1>‬

}‬

{‬
‭isLoading‬‭
‭ ?‬‭
'Loading...'‬‭
:‬‭
users‬
}‬

{‬
‭value‬
‭ .‬
‭length‬‭
‭ ===‬‭
0‬‭
&& !‬
isLoading‬‭
‭ &&‬‭
<h2>‬
There are no users‬
‭ </h2>‬
‭ }‭
‭<
‬br‬‭
/>‬
<‬
‭NavLink‬‭
‭ to‬
=‬
‭"/addUser"‬
‭ ><button>‬
‭ Add User‬
‭ </button></‬
‭ NavLink‬
‭ >‬

</div>‬

);‬

return‬‭
‭ (‬
};‬

<div‬‭
‭ className‬
=‭
‭"
‬container mt-5"‬
>‬

export‬‭
‭ default‬‭
UsersList‬
;‬

<h1>‬
‭ Users List‬
‭ </h1>‬

{‬
‭isLoading‬‭
‭ ?‬‭
'Loading...'‬‭
:‬‭
users‬
}‬

‭Etape 2: Donner les scripts en React JS des composants suivants :‬
‭1. **<App/>:** - Dans `components/App.js`:‬ {‬
‭value‬
‭ .‬
‭length‬‭
‭ ===‬‭
0‬‭
&& !‬
isLoading‬‭
‭ &&‬‭
<h2>‬
There are no users‬
‭ </h2>‬
‭ }‭
‭<
‬br‬‭
/>‬
import‬‭
‭ React‬‭
from‬‭
"react"‬
;‬
‭ <‬
‭NavLink‬‭
‭ to‬
=‬
‭"/addUser"‬
‭ ><button>‬
‭ Add User‬
‭ </button></‬
‭ NavLink‬
‭ >‬

import‬‭
‭ store‬‭
from‬‭
"../features/store"‬
;‬
‭ </div>‬

);‬
‭ email:‬‭
‭ user‬
.‬
‭email‬
‭ ,‬

};‬
‭ });‬

export‬‭
‭ default‬‭
UsersList‬
;‬
‭ }‬

‭3. **<UserItem/>:** - Dans `components/UserItem.js`:‬ }, [‬
‭ user‬
‭ ]);‬

//UserItem.js‬

import‬‭
‭ React‬‭
from‬‭
"react"‬
;‬
‭ const‬‭
‭ handleInputChange‬‭
=‬‭
(‬
e‬
‭)‬‭
‭ =>‬‭
{‬
import‬‭
‭ {‬‭
useDispatch‬‭
}‬‭
from‬‭
"react-redux"‬
;‬
‭ setUserData‬
‭ ({‬
‭ ...‬
‭ userData‬
‭ ,‬
‭[e.target.name]:‬‭
‭ e‬
.‬
‭target‬
‭ .‬
‭value‬
‭ ,});‬

import‬‭
‭ {‬‭
NavLink‬‭
}‬‭
from‬‭
"react-router-dom"‬
;‬
‭ };‬

import‬‭
‭ {‬‭
deleteUser‬‭
}‬‭
from‬‭
"../features/usersSlice"‬
;‬

const‬‭
‭ handleSubmit‬‭
=‬‭
(‬
e‬
‭)‬‭
‭ =>‬‭
{‬
export‬‭
‭ default‬‭
function‬‭
UserItem‬
(‬
‭props‬
‭ ) {‬
‭ e‬
‭.‬
‭preventDefault‬
‭ ();‬

const‬‭
‭ {‬‭
name‬
,‬‭
‭ username‬
,‬‭
‭ email‬
,‬‭
‭ id‬‭
} =‬‭
props‬
.‬
‭user‬
‭ ;‬
‭ dispatch‬
‭ (‬
‭updateUser‬
‭ ({‬‭
‭ id:‬‭
user‬
.‬
‭id‬
‭ ,‬‭
‭ ...‬
userData‬‭
‭ }));‬
const‬‭
‭ dispatch‬‭
=‬‭
useDispatch‬
();‬
‭ navigate‬
‭ (‬
‭"/"‬
‭ );‬

};‬

const‬‭
‭ handleDelete‬‭
= ()‬‭
=>‬‭
{‬
dispatch‬
‭ (‬
‭deleteUser‬
‭ (‬
‭id‬
‭ ));‬
‭ return‬‭
‭ (‬
};‬
‭ <>‬

<h1>‬
‭ Edit User‬
‭ </h1>‬

return‬‭
‭ (‬ <form‬‭
‭ onSubmit‬
=‬
‭ {‭
‭h
‬andleSubmit‬
}‬
‭>‬

<>‬
‭ Name:‬

<div‬‭
‭ style‬
=‬
‭{‬
‭{‭
‭"
‬border"‬
:‬
‭"2px solid black"‬
‭ }‬
‭}‬
‭>‬
‭ <input‬‭
‭ type‬
=‬
‭"text"‬‭
‭ name‬
=‭
‭"
‬name"‬‭
value‬
=‬
‭{‬
‭userData‬
‭ .‬
‭name‬
‭ }‬‭
‭ onChange‬
=‬
‭{‭
‭h
‬andleInputChange‬
}‬
‭/><br/>‬

<h3>‬‭
‭ {‬
name‬
‭ }‭
‭<
‬/h3>‬ Username:‬

<p>‬
‭ @‬
‭{‬
‭username‬
‭ }‭
‭<‬/p>‬ <input‬‭
‭ type‬
=‬
‭"text"‬‭
‭ name‬
=‭
‭"
‬username"‬‭
value‬
=‬
‭{‬
‭userData‬
‭ .‬
‭username‬
‭ }‬

<p>‬
‭ {‬
‭email‬
‭ }‬
‭</p>‬
‭ onChange‬
‭ =‬
‭{‬
‭handleInputChange‬
‭ }‬
‭/><br/>‬

<‬
‭NavLink‬‭
‭ to‬
=‭
‭{
‬‬
‭̀/userEdit/‬
${‬
‭ id‬
‭ }‬
‭‭̀‬
}‬
‭><button>‬
‭ Edit‬
‭ </button></‬
‭ NavLink‬
‭ >‬
‭ Email:‬

<button‬‭
‭ onClick‬
=‬
‭{‬
‭handleDelete‬
‭ }‬
‭>‬
‭Delete‬
‭ </button>‬
‭ <input‬‭
‭ type‬
=‬
‭"text"‬‭
‭ name‬
=‭
‭"
‬email"‬‭
value‬
=‬
‭{‬
‭userData‬
‭ .‬
‭email‬
‭ }‬‭
‭ onChange‬
=‬
‭{‬
‭handleInputChange‬
‭ }‭
‭/
‬><br/>‬
</div>‬
‭ <button‬‭
‭ type‬
=‬
‭"submit"‬
‭ >‬
‭Update User‬
‭ </button><br/>‬

</>‬
‭ <‬
‭Link‬‭
‭ to‬
=‬
‭"/"‬
‭ ><button>‬
‭ back‬
‭ </button></‬
‭ Link‬
‭ >‬

);‬
‭ </form>‬

}‬
‭ </>‬

‭4. **<UserEdit/>:** - Dans `components/UserEdit.js`:‬ );‬

// UserEdit.js‬

};‬

import‬‭
‭ React‬
, {‬‭
‭ useState‬
,‬‭
‭ useEffect‬‭
}‬‭
from‬‭
"react"‬
;‬

export‬‭
‭ default‬‭
UserEdit‬
;‬

import‬‭
‭ {‬‭
useDispatch‬
,‬‭
‭ useSelector‬‭
}‬‭
from‬‭
"react-redux"‬
;‬

import‬‭
‭ {‬‭
useParams‬
,‬‭
‭ useNavigate‬‭
}‬‭
from‬‭
"react-router-dom"‬
;‬

import‬‭
‭ {‬‭
updateUser‬‭
}‬‭
from‬‭
"../features/usersSlice"‬
;‬

import‬‭
‭ {‬‭
Link‬‭
}‬‭
from‬‭
"react-router-dom"‬
;‬

const‬‭
‭ UserEdit‬‭
=‬‭
()‬‭
=>‬‭
{‬
const‬‭
‭ dispatch‬‭
=‬‭
useDispatch‬
();‬

const‬‭
‭ navigate‬‭
=‬‭
useNavigate‬
();‬

const‬‭
‭ {‬‭
id‬‭
}‬‭
=‬‭
useParams‬
();‬

const‬‭
‭ user‬‭
=‬‭
useSelector‬
((‬
‭ state‬
‭ )‬‭
‭ =>‬‭
state‬
.‬
‭user‬
‭ .‬
‭value‬
‭ .‬
‭find‬
‭ ((‬
‭ item‬
‭ )‬‭
‭ =>‬‭
item‬
.‬
‭id‬‭
‭ ===‬‭
parseInt‬
(‭
‭i
‬d‬
)));‬

const‬‭
‭ [‬
userData‬
‭ ,‬‭
‭ setUserData‬
]‬‭
‭ =‬‭
useState‬
({‬

name:‬‭
‭ user‬‭
?‬‭
user‬
.‭
‭n
‬ame‬‭
:‬‭
""‬
,‬

username:‬‭
‭ user‬‭
?‬‭
user‬
.‬
‭username‬‭
‭ :‬‭
""‬
,‬

email:‬‭
‭ user‬‭
?‬‭
user‬
.‬
‭email‬‭
‭ :‬‭
""‬
,‬

});‬

useEffect‬
‭ (()‬‭
‭ =>‬‭
{‬
if‬‭
‭ (‭
u
‬ser‬
) {‬

setUserData‬
‭ ({‬

name:‬‭
‭ user‬
.‭
‭n
‬ame‬
,‬

username:‬‭
‭ user‬
.‬
‭username‬
‭ ,‬

‭AddUser.js:‬
// AddUser.js‬

import‬‭
‭ React‬
, {‬‭
‭ useState‬‭
}‬‭
from‬‭
"react"‬
;‬

import‬‭
‭ {‬‭
useDispatch‬‭
}‬‭
from‬‭
"react-redux"‬
;‬

import‬‭
‭ {‬‭
addUser‬‭
}‬‭
from‬‭
"../features/usersSlice"‬
;‬

import‬‭
‭ {‭
L
‬ink‬
,‬‭
‭ useNavigate‬‭
}‬‭
from‬‭
"react-router-dom"‬
;‬

const‬‭
‭ AddUser‬‭
=‬‭
()‬‭
=>‬‭
{‬
const‬‭
‭ dispatch‬‭
=‬‭
useDispatch‬
();‬

const‬‭
‭ navigate‬‭
=‬‭
useNavigate‬
();‬

const‬‭
‭ [‬
userData‬
‭ ,‬‭
‭ setUserData‬
]‬‭
‭ =‬‭
useState‬
({‬

name:‬‭
‭ ""‬
,‬

username:‬‭
‭ ""‬
,‬

email:‬‭
‭ ""‬
,‬

});‬

const‬‭
‭ handleChange‬‭
=‬‭
(‬
e‬
‭)‬‭
‭ =>‬‭
{‬
setUserData‬
‭ ({‬
‭ ...‬
‭ userData‬
‭ ,‬
‭[e.target.name]:‬‭
‭ e‬
.‬
‭target‬
‭ .‬
‭value‬
‭ ,});‬

};‬

const‬‭
‭ handleSubmit‬‭
=‬‭
(‬
e‬
‭)‬‭
‭ =>‬‭
{‬
e‬
‭.‬
‭preventDefault‬
‭ ();‬

dispatch‬
‭ (‬
‭addUser‬
‭ (‬
‭ userData‬
‭ ));‬

navigate‬
‭ (‬
‭"/"‬
‭ );‬

};‬

return‬‭
‭ (‬
<>‬

<h2>‬
‭ Add User‬
‭ </h2>‬

<form‬‭
‭ onSubmit‬
=‬
‭ {‭
‭h
‬andleSubmit‬
}‬
‭>‬

Name:‬

<input‬‭
‭ type‬
=‭
‭"
‬text"‬‭
name‬
=‭
‭"
‬name"‬‭
value‬
=‬
‭{‬
‭userData‬
‭ .‬
‭name‬
‭ }‬‭
‭ onChange‬
=‬
‭{‭
‭h
‬andleChange‬
}‬
‭/><br/>‬

Username:‬

<input‬‭
‭ type‬
=‭
‭"
‬text"‬‭
name‬
=‭
‭"
‬username"‬‭
value‬
=‬
‭{‬
‭userData‬
‭ .‬
‭username‬
‭ }‬‭
‭ onChange‬
=‬
‭{‬
‭handleChange‬
‭ }‬
‭/><br/>‬

Email:‬

<input‬‭
‭ type‬
=‭
‭"
‬text"‬‭
name‬
=‭
‭"
‬email"‬‭
value‬
=‬
‭{‬
‭userData‬
‭ .‬
‭email‬
‭ }‬‭
‭ onChange‬
=‬
‭{‬
‭handleChange‬
‭ }‬
‭/><br/>‬

<button‬‭
‭ type‬
=‬
‭"submit"‬‭
‭ >‬
Add User‬
‭ </button><br/>‬

<‬
‭Link‬‭
‭ to‬
=‬
‭"/"‬
‭ ><button>‬
‭ back‬
‭ </button></‬
‭ Link‬
‭ >‬

</form>‬

</>‬

);‬

};‬

export‬‭
‭ default‬‭
AddUser‬
;‬

You might also like