Youcef Madadi
Web and game development teacher
Core Principles:
Key Features:
npm install @reduxjs/toolkit react-redux
// src/app/store.js
import { configureStore } from '@reduxjs/toolkit';
export const store = configureStore(/* configuration */);
// App.jsx
import { Provider } from 'react-redux';
/* rest of the code /*
return <Provider store={store}> <App/> </Provider>
// src/features/user/userSlice.js
import { createSlice } from '@reduxjs/toolkit';
const initialState = {
name: '',
email: '',
};
/* slice code */
export const { setUser, clearUser } = userSlice.actions;
export default userSlice.reducer;
const userSlice = createSlice({
name: 'user',
initialState,
reducers: {
setUser: (state, action) => {
state.name = action.payload.name;
state.email = action.payload.email;
},
clearUser: (state) => {
state.name = '';
state.email = '';
},
},
});
import userReducer from '../features/user/userSlice';
export const store = configureStore({
reducer: {
user: userReducer,
},
});
you can make hooks to improve readability of the code to have better experience with RTK
import { useSelector, useDispatch } from 'react-redux';
import { setUser, clearUser } from './features/user/userSlice';
function useUser(){
const user = useSelector((state) => state.user);
const dispatch = useDispatch();
return {
user,
setUser:(newUser)=> dispatch(setUser(newUser))
clearUser:()=> dispatch(clearUser())
};
}
React typically communicates with APIs using the following methods:
HTTP Requests:
WebSockets
socket.io-client
.GraphQL
State Management Libraries
import React, { useEffect, useState } from 'react';
export default function MyComponent() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
fetch('https://api.example.com/data')
.then((response) => response.json())
.then((data) => {
setData(data);
setLoading(false);
})
.catch((error) => {
setError(error);
setLoading(false);
});
}, []);
// part 2
};
if (loading) return <div>Loading...</div>;
if (error) return <div>Error: {error.message}</div>;
return (
<div>
{data && data.map((item) => (
<div key={item.id}>{item.name}</div>
))}
</div>
);
part 2
import React, { useEffect, useState } from 'react';
import axios from 'axios';
export default function MyComponent() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
axios.get('https://api.example.com/data')
.then((response) => {
setData(response.data);
setLoading(false);
})
.catch((error) => {
setError(error);
setLoading(false);
});
}, []);
// part 2
};
if (loading) return <div>Loading...</div>;
if (error) return <div>Error: {error.message}</div>;
return (
<div>
{data && data.map((item) => (
<div key={item.id}>{item.name}</div>
))}
</div>
);
part 2
npm install axios
npm install @reduxjs/toolkit react-redux
import { QueryClient } from '@tanstack/react-query';
const queryClient = new QueryClient();
// App.jsx
import { QueryClientProvider } from '@tanstack/react-query';
/* rest of the code /*
return <QueryClientProvider client={queryClient}>
<App/>
</QueryClientProvider>
npm install @tanstack/react-query
import React, { useEffect, useState } from 'react';
export default function MyComponent() {
const { data, error, isLoading } = useQuery({ queryKey: ['fetchData'], queryFn: fetchData });
if (isLoading) return <div>Loading...</div>;
if (error) return <div>
Error: {error.message}
</div>;
return (
<div>
{data && data.map((item) => (
<div key={item.id}>{item.name}</div>
))}
</div>
);
};
import axios from 'axios';
const fetchData = async () => {
const { data } = await axios.get('https://api.example.com/data');
return data;
};
By Youcef Madadi