SmarMaker - Documentation
Docs» 15_training:module2-introduction-react:philosophie

Chapitre 1 : Philosophie React

Composants vs Templates

L'approche PHP traditionnelle

En PHP, vous séparez généralement :

  • Le contrôleur : logique métier
  • La vue : template HTML avec des variables
snippet.php
// Contrôleur
$users = $userRepository->findAll();
include 'views/users.php';
 
// Vue (users.php)
<ul>
    <?php foreach ($users as $user): ?>
        <li><?= htmlspecialchars($user->name) ?></li>
    <?php endforeach; ?>
</ul>

L'approche React

En React, logique et rendu sont ensemble dans un composant :

snippet.javascript
function UserList({ users }) {
    // Logique ici si nécessaire
    const activeUsers = users.filter(u => u.active);
 
    // Rendu
    return (
        <ul>
            {activeUsers.map(user => (
                <li key={user.id}>{user.name}</li>
            ))}
        </ul>
    );
}

Pourquoi ? Parce que la logique d'affichage et le rendu sont intrinsèquement liés. Les séparer artificiellement complique la maintenance.

Le Virtual DOM

Le problème avec le DOM réel

Manipuler le DOM est lent. Chaque modification peut déclencher un recalcul du layout et un repaint du navigateur.

snippet.javascript
// Approche classique - chaque ligne touche le DOM
document.getElementById('name').textContent = user.name;
document.getElementById('email').textContent = user.email;
document.getElementById('role').textContent = user.role;

La solution React

React maintient une copie légère du DOM en mémoire (Virtual DOM). Quand les données changent :

  1. React crée un nouveau Virtual DOM
  2. Compare avec l'ancien (algorithme de “diffing”)
  3. Calcule les changements minimaux
  4. Applique uniquement ces changements au vrai DOM
snippet.javascript
// Vous décrivez juste le résultat souhaité
function UserCard({ user }) {
    return (
        <div>
            <span id="name">{user.name}</span>
            <span id="email">{user.email}</span>
            <span id="role">{user.role}</span>
        </div>
    );
}
// React s'occupe d'optimiser les mises à jour

Flux de données unidirectionnel

Le problème du two-way binding

Dans certains frameworks, les données circulent dans les deux sens : la vue peut modifier le modèle et vice versa. Cela peut créer des boucles et rendre le debugging difficile.

La solution React

En React, les données descendent toujours du parent vers l'enfant via les props :

       App
        │
        ▼ props (users)
    UserList
        │
        ▼ props (user)
    UserCard

Si un enfant veut modifier des données, il appelle une fonction passée par le parent :

snippet.javascript
function App() {
    const [users, setUsers] = useState([]);
 
    const deleteUser = (id) => {
        setUsers(users.filter(u => u.id !== id));
    };
 
    return <UserList users={users} onDelete={deleteUser} />;
}
 
function UserList({ users, onDelete }) {
    return (
        <ul>
            {users.map(user => (
                <UserCard
                    key={user.id}
                    user={user}
                    onDelete={onDelete}
                />
            ))}
        </ul>
    );
}
 
function UserCard({ user, onDelete }) {
    return (
        <div>
            {user.name}
            <button onClick={() => onDelete(user.id)}>Supprimer</button>
        </div>
    );
}

Les données descendent (props), les actions remontent (callbacks).

Déclaratif vs Impératif

Approche impérative (jQuery)

Vous décrivez comment faire les choses, étape par étape :

snippet.javascript
// "Quand le bouton est cliqué, trouve l'élément, modifie son contenu..."
$('#btn').click(function() {
    const count = parseInt($('#count').text()) + 1;
    $('#count').text(count);
    if (count > 10) {
        $('#count').addClass('warning');
    }
});

Approche déclarative (React)

Vous décrivez ce que vous voulez en fonction de l'état :

snippet.javascript
function Counter() {
    const [count, setCount] = useState(0);
 
    return (
        <div>
            <span className={count > 10 ? 'warning' : ''}>
                {count}
            </span>
            <button onClick={() => setCount(count + 1)}>
                +1
            </button>
        </div>
    );
}

Vous ne dites pas “ajoute la classe warning”. Vous dites “si count > 10, la classe est warning”. React se charge du reste.

Comparaison avec d'autres approches

Concept PHP/jQuery React
Où est la logique ? Séparée (MVC) Dans le composant
Comment modifier l'UI ? Manipuler le DOM Changer l'état
Flux de données Bidirectionnel possible Unidirectionnel
Paradigme Impératif Déclaratif

Points clés à retenir

  1. Composants : blocs réutilisables qui encapsulent logique et rendu
  2. Virtual DOM : React optimise les mises à jour automatiquement
  3. Flux unidirectionnel : données vers le bas, actions vers le haut
  4. Déclaratif : décrivez le résultat, pas les étapes

← Retour au module | Chapitre suivant : JSX →

Previous Next

Made with ❤ by CAP-REL · SmartMaker · GNU AGPL v3+
Code source · Faire un don
SmarMaker - Documentation
Traductions de cette page:
  • Français
  • Deutsch
  • English
  • Español
  • Italiano
  • Nederlands

Table of Contents

Table des matières

  • Chapitre 1 : Philosophie React
    • Composants vs Templates
      • L'approche PHP traditionnelle
      • L'approche React
    • Le Virtual DOM
      • Le problème avec le DOM réel
      • La solution React
    • Flux de données unidirectionnel
      • Le problème du two-way binding
      • La solution React
    • Déclaratif vs Impératif
      • Approche impérative (jQuery)
      • Approche déclarative (React)
    • Comparaison avec d'autres approches
    • Points clés à retenir
  • SmartAuth
  • SmartMaker - Back (PHP)
    • Mapping Dolibarr - React
  • SmartMaker - Front (React)
    • Animations de pages
    • Architecture
    • Astuces
    • Calendar
    • Composants et pages
    • Configuration du Provider
    • Debug et Logs
    • Hooks SmartCommon
    • PWA (Progressive Web App)
    • Requêtes API
    • Routage
    • SmartCommon
    • Stockage de données
    • Thèmes
    • Traductions
  • HowTo - Pas à pas - Votre première application
    • Développement PHP (back)
    • Développement React (front)
    • Première étape : Module Builder Dolibarr
    • SmartAuth
    • SmartBoot : Un "squelette" quasiment prêt à l'emploi
  • Formation SmartMaker
    • Module 1 : Fondamentaux JavaScript ES6+
      • Chapitre 1 : Variables et Scope
      • Chapitre 2 : Fonctions
      • Chapitre 3 : Programmation Asynchrone
      • Chapitre 4 : Modules ES6
    • Module 2 : Introduction à React
      • Chapitre 1 : Philosophie React
      • Chapitre 2 : JSX
      • Chapitre 3 : Composants
    • Module 3 : Hooks React Fondamentaux
      • Chapitre 1 : useState
      • Chapitre 2 : useEffect
      • Chapitre 3 : useRef
      • Chapitre 4 : useContext
    • Module 4 : React Avancé
      • Chapitre 1 : useCallback et useMemo
      • Chapitre 2 : Custom Hooks
      • Chapitre 3 : Redux et Redux Toolkit
    • Module 5 : Architecture SmartMaker
      • Chapitre 1 : Structure du projet
      • Chapitre 2 : Configuration
      • Chapitre 3 : Flux de données
    • Module 6 : SmartCommon - Composants
      • Chapitre 1 : Mise en page
      • Chapitre 2 : Navigation
      • Chapitre 3 : Formulaires
      • Chapitre 4 : Affichage
    • Module 7 : SmartCommon - Hooks
      • Chapitre 1 : useApi
      • Chapitre 2 : Gestion d'état
      • Chapitre 3 : Hooks utilitaires
    • Module 8 : Backend API (PHP)
      • Chapitre 1 : Routage
      • Chapitre 2 : Controllers
      • Chapitre 3 : Mappers
      • Extrafields et formulaires dynamiques
    • Module 9 : Intégration complète
      • Chapitre 1 : Backend
      • Chapitre 2 : Frontend
      • Chapitre 3 : Déploiement
    • Module 10 : Fonctionnalités avancées
      • Chapitre 1 : Mode offline
      • Chapitre 2 : Internationalisation (i18n)
      • Chapitre 3 : Autres fonctionnalités
    • Module 11 : Bonnes pratiques
  • Démonstration
  • Start
  • Composants et pages
  • Afficher le texte source
  • Anciennes révisions
  • Liens de retour
  • Haut de page