Maison >interface Web >js tutoriel >Aide-mémoire React.js complète pour les développeurs
React.js est devenu la pierre angulaire du développement Web moderne pour la création d'applications Web dynamiques et hautes performances. Cette aide-mémoire complète couvrira tout ce que vous devez savoir pour maîtriser React.js, y compris des exemples pratiques, des extraits de code et des explications détaillées de toutes les fonctionnalités. L'objectif est de fournir un guide détaillé auquel vous pouvez vous référer à tout moment.
React.js, souvent simplement appelé React, est une bibliothèque JavaScript open source utilisée pour créer des interfaces utilisateur, en particulier pour les applications d'une seule page où vous avez besoin d'une expérience utilisateur rapide et interactive. Développé par Facebook, React permet aux développeurs de créer de grandes applications Web capables de se mettre à jour et de s'afficher efficacement en réponse aux modifications des données.
Le concept principal de React est le composant, qui est un module autonome qui restitue certains résultats. Les composants peuvent être imbriqués, gérés et gérés indépendamment, ce qui rend le processus de développement efficace et maintenable.
Avant de commencer avec React, vous devez configurer l'environnement de développement. Voici comment :
Téléchargez et installez Node.js depuis le site officiel.
Vérifiez l'installation en exécutant :
node -v npm -v
Installer Create React App : Create React App est un environnement confortable pour apprendre React et un excellent moyen de démarrer une nouvelle application d'une seule page dans React.
npm install -g create-react-app
Une fois l'environnement configuré, vous pouvez créer une nouvelle application React.
Créer un nouveau projet :
npx create-react-app my-app cd my-app npm start
Cette commande crée un nouveau répertoire avec le nom spécifié (my-app), configure un nouveau projet React et démarre le serveur de développement. Vous pouvez ouvrir votre navigateur et accéder à http://localhost:3000 pour voir votre nouvelle application React.
Les composants sont les éléments constitutifs de toute application React. Ils vous permettent de diviser l'interface utilisateur en éléments indépendants et réutilisables.
Les composants fonctionnels sont des fonctions JavaScript qui acceptent les accessoires comme argument et renvoient des éléments React. Ils sont plus simples et plus faciles à écrire que les composants de classe.
import React from 'react'; const Welcome = ({ name }) => { return 4a249f0d628e2318394fd9b75b4636b1Welcome, {name}!473f0a7621bec819994bb5020d29372a; }; export default Welcome;
Les composants de classe sont des classes ES6 qui étendent React.Component et ont une méthode de rendu qui renvoie un élément React.
import React, { Component } from 'react'; class Welcome extends Component { render() { return 4a249f0d628e2318394fd9b75b4636b1Welcome, {this.props.name}!473f0a7621bec819994bb5020d29372a; } } export default Welcome;
Gestion de l'état : les composants fonctionnels utilisent des hooks (useState, useEffect, etc.) pour la gestion de l'état, tandis que les composants de classe utilisent les méthodes this.state et lifecycle.
Méthodes de cycle de vie : les composants de classe ont des méthodes de cycle de vie telles que composantDidMount, composantDidUpdate et composantWillUnmount. Les composants fonctionnels utilisent le hook useEffect pour gérer les effets secondaires.
Simplicité : les composants fonctionnels sont plus simples et moins verbeux, ce qui les rend plus faciles à lire et à maintenir.
JSX est une extension de syntaxe qui vous permet d'écrire du HTML directement dans JavaScript. Il produit des "éléments" React.
JSX ressemble à HTML mais est transformé en JavaScript.
const element = 4a249f0d628e2318394fd9b75b4636b1Hello, world!473f0a7621bec819994bb5020d29372a;
Vous pouvez intégrer n'importe quelle expression JavaScript dans JSX en l'enveloppant entre accolades.
const name = 'John'; const element = 4a249f0d628e2318394fd9b75b4636b1Hello, {name}!473f0a7621bec819994bb5020d29372a;
JSX vous permet d'utiliser des attributs avec une syntaxe similaire au HTML.
const element = 475c150c326c59ec9b2dd1e6a1c38014;
State est un objet intégré qui stocke les valeurs de propriété appartenant au composant. Lorsque l'objet d'état change, le composant est restitué.
Le hook useState est utilisé pour ajouter un état aux composants fonctionnels.
import React, { useState } from 'react'; const Counter = () => { const [count, setCount] = useState(0); return ( dc6dce4a544fdca2df29d5ac0ea9906b e388a4556c0f65e1904146cc1a846beeYou clicked {count} times94b3e26ee717c64999d7867364b1b4a3 5ddc0978355752d4bf828563dc007a14 setCount(count + 1)}>Click me65281c5ac262bf6d81768915a4a77ac0 16b28748ea4df4d9c2150843fecfba68 ); }; export default Counter;
Les accessoires sont des arguments transmis aux composants React. Les accessoires sont transmis aux composants via les attributs HTML.
Les accessoires sont en lecture seule et immuables.
const Greeting = (props) => { return 4a249f0d628e2318394fd9b75b4636b1Hello, {props.name}!473f0a7621bec819994bb5020d29372a; }; const App = () => { return 1e9b83e740a258dee7f01e880ba004db; };
PropTypes vous permettent de définir le type d'accessoires qu'un composant doit recevoir. Les accessoires par défaut peuvent être définis pour garantir qu'un accessoire aura une valeur si elle n'a pas été spécifiée.
import React from 'react'; import PropTypes from 'prop-types'; const Greeting = ({ name }) => { return 4a249f0d628e2318394fd9b75b4636b1Hello, {name}!473f0a7621bec819994bb5020d29372a; }; Greeting.propTypes = { name: PropTypes.string.isRequired, }; Greeting.defaultProps = { name: 'Guest', }; export default Greeting;
Lifecycle methods are special methods in class components that run at specific points in a component's life.
componentDidMount: Executed after the component is rendered.
componentDidUpdate: Executed after the component's updates are flushed to the DOM.
componentWillUnmount: Executed before the component is removed from the DOM.
class MyComponent extends React.Component { componentDidMount() { // Runs after component is mounted } componentDidUpdate(prevProps, prevState) { // Runs after component updates } componentWillUnmount() { // Runs before component is unmounted } render() { return dc6dce4a544fdca2df29d5ac0ea9906bMy Component16b28748ea4df4d9c2150843fecfba68; } }
The useEffect hook combines the functionalities of componentDidMount, componentDidUpdate, and componentWillUnmount.
import React, { useState, useEffect } from 'react'; const MyComponent = () => { const [count, setCount] = useState(0); useEffect(() => { // Runs on mount and update document.title = `You clicked ${count} times`; // Cleanup function (runs on unmount) return () => { console.log('Cleanup'); }; }, [count]); // Dependency array return ( dc6dce4a544fdca2df29d5ac0ea9906b e388a4556c0f65e1904146cc1a846beeYou clicked {count} times94b3e26ee717c64999d7867364b1b4a3 5ddc0978355752d4bf828563dc007a14 setCount(count + 1)}>Click me65281c5ac262bf6d81768915a4a77ac0 16b28748ea4df4d9c2150843fecfba68 ); }; export default MyComponent;
React events are named using camelCase, rather than lowercase. With JSX, you pass a function as the event handler, rather than a string.
const handleClick = () => { console.log('Button clicked'); }; const MyComponent = () => { return a2cfc4f771b7cbacb8fc705e23ded36bClick me65281c5ac262bf6d81768915a4a77ac0; };
React's event system is known as Synthetic Events. It is a cross-browser wrapper around the browser's native event system.
Handling forms in React involves controlling the input elements and managing the state.
import React, { useState } from 'react'; const MyForm = () => { const [value, setValue] = useState(''); const handleChange = (event) => { setValue(event.target.value); }; const handleSubmit = (event) => { event.preventDefault(); alert('A name was submitted: ' + value); }; return ( a9bf9d9bedc9abd7dd4d836a79412b6a 2e1cf0710519d5598b1f0f14c36ba674 Name: 504d17b0f6b03dc75f5b399918bed261 8c1ecd4bb896b2264e0711597d40766c 92e8cbd9feac6a729893ae422743759e f5a47148e367a6035fd7a2faa965022e ); }; export default MyForm;
Avoid inline event handlers: Define event handlers outside of the JSX for better readability and performance.
Use Arrow Functions: Use arrow functions to avoid issues with this binding.
Debounce Expensive Operations: Debounce expensive operations like API calls to avoid performance issues.
You can use JavaScript if-else statements inside the render method.
const MyComponent = ({ isLoggedIn }) => { if (isLoggedIn) { return 4a249f0d628e2318394fd9b75b4636b1Welcome back!473f0a7621bec819994bb5020d29372a; } else { return 4a249f0d628e2318394fd9b75b4636b1Please sign in.473f0a7621bec819994bb5020d29372a; } };
Ternary operators are a concise way to perform conditional rendering.
const MyComponent = ({ isLoggedIn }) => { return ( dc6dce4a544fdca2df29d5ac0ea9906b {isLoggedIn ? 4a249f0d628e2318394fd9b75b4636b1Welcome back!473f0a7621bec819994bb5020d29372a : 4a249f0d628e2318394fd9b75b4636b1Please sign in.473f0a7621bec819994bb5020d29372a} 16b28748ea4df4d9c2150843fecfba68 ); };
You can use the logical && operator to include elements conditionally.
const MyComponent = ({ isLoggedIn }) => { return ( dc6dce4a544fdca2df29d5ac0ea9906b {isLoggedIn && 4a249f0d628e2318394fd9b75b4636b1Welcome back!473f0a7621bec819994bb5020d29372a} 16b28748ea4df4d9c2150843fecfba68 ); };
Inline if with logical && operator allows you to conditionally include an element in the output.
const Mailbox = ({ unreadMessages }) => { return ( dc6dce4a544fdca2df29d5ac0ea9906b 4a249f0d628e2318394fd9b75b4636b1Hello!473f0a7621bec819994bb5020d29372a {unreadMessages.length > 0 && c1a436a314ed609750bd7c7d319db4da You have {unreadMessages.length} unread messages. 2e9b454fa8428549ca2e64dfac4625cd } 16b28748ea4df4d9c2150843fecfba68 ); };
You can build collections of elements and include them in JSX using curly braces {}.
const numbers = [1, 2, 3, 4, 5]; const listItems = numbers.map((number) => 2e99a2afa389bfb220fcd51d65729993 {number} bed06894275b65c1ab86501b08a632eb ); const NumberList = () => { return ( ff6d136ddc5fdfeffaf53ff6ee95f185{listItems}929d1f5ca49e04fdcb27f9465b944689 ); };
Keys help React identify which items have changed, are added, or are removed. Keys should be given to the elements inside the array to give the elements a stable identity.
const NumberList = (props) => { const numbers = props.numbers; const listItems = numbers.map((number) => 2e99a2afa389bfb220fcd51d65729993 {number} bed06894275b65c1ab86501b08a632eb ); return ( ff6d136ddc5fdfeffaf53ff6ee95f185{listItems}929d1f5ca49e04fdcb27f9465b944689 ); };
Keys used within arrays should be unique among their siblings.
function Blog(props) { const sidebar = ( ff6d136ddc5fdfeffaf53ff6ee95f185 {props.posts.map((post) => 87c6bb9020f9bc84ce365f117dbefb25 {post.title} bed06894275b65c1ab86501b08a632eb )} 929d1f5ca49e04fdcb27f9465b944689 ); const content = props.posts.map((post) => 19bcd6b2eb431bc35ca7af1f5e43e263 684271ed9684bde649abda8831d4d355{post.title}39528cedfa926ea0c01e69ef5b2ea9b0 e388a4556c0f65e1904146cc1a846bee{post.content}94b3e26ee717c64999d7867364b1b4a3 16b28748ea4df4d9c2150843fecfba68 ); return ( dc6dce4a544fdca2df29d5ac0ea9906b {sidebar} 231a563c997aa9e3e0ae614bd16728b0 {content} 16b28748ea4df4d9c2150843fecfba68 ); }
Handling form data in React involves managing the state of the form fields.
import React, { useState } from 'react'; const MyForm = () => { const [value, setValue] = useState(''); const handleChange = (event) => { setValue(event.target.value); }; const handleSubmit = (event) => { event.preventDefault(); alert('A name was submitted: ' + value); }; return ( a9bf9d9bedc9abd7dd4d836a79412b6a 2e1cf0710519d5598b1f0f14c36ba674 Name: 504d17b0f6b03dc75f5b399918bed261 8c1ecd4bb896b2264e0711597d40766c 92e8cbd9feac6a729893ae422743759e f5a47148e367a6035fd7a2faa965022e ); }; export default MyForm;
Controlled components are those that are controlled by React state. Uncontrolled components are those that maintain their own internal state.
class NameForm extends React.Component { constructor(props) { super(props); this.state = { value: '' }; this.handleChange = this.handleChange.bind(this); this.handleSubmit = this.handleSubmit.bind(this); } handleChange(event) { this.setState({ value: event.target.value }); } handleSubmit(event) { alert('A name was submitted: ' + this.state.value); event.preventDefault(); } render() { return ( 244054e4e8cabd44c7e8193aa6f63fb5 2e1cf0710519d5598b1f0f14c36ba674 Name: 733698873fa50da8fa779e67406daca2 8c1ecd4bb896b2264e0711597d40766c 92e8cbd9feac6a729893ae422743759e f5a47148e367a6035fd7a2faa965022e ); } }
Refs provide a way to access DOM nodes or React elements created in the render method.
class NameForm extends React.Component { constructor(props) { super(props); this.input = React.createRef(); this.handleSubmit = this.handleSubmit.bind(this); } handleSubmit(event) { alert('A name was submitted: ' + this.input.current.value); event.preventDefault(); } render() { return ( 244054e4e8cabd44c7e8193aa6f63fb5 2e1cf0710519d5598b1f0f14c36ba674 Name: 63001db5982f3e60a1b9208a578f6cf9 8c1ecd4bb896b2264e0711597d40766c 92e8cbd9feac6a729893ae422743759e f5a47148e367a6035fd7a2faa965022e ); } }
Form validation ensures that user inputs are valid.
const MyForm = () => { const [name, setName] = useState(''); const [email, setEmail] = useState(''); const [error, setError] = useState(''); const handleSubmit = (event) => { event.preventDefault(); if (!name || !email) { setError('Name and Email are required'); } else { setError(''); // Submit form } }; return ( a9bf9d9bedc9abd7dd4d836a79412b6a {error && e388a4556c0f65e1904146cc1a846bee{error}94b3e26ee717c64999d7867364b1b4a3} 2e1cf0710519d5598b1f0f14c36ba674 Name: e6680c943276b2479743ae48aa2c3c4d setName(e.target.value)} /> 8c1ecd4bb896b2264e0711597d40766c 2e1cf0710519d5598b1f0f14c36ba674 Email: 7448c870435c8466d6415b4cd5e57af3 setEmail(e.target.value)} /> 8c1ecd4bb896b2264e0711597d40766c 92e8cbd9feac6a729893ae422743759e f5a47148e367a6035fd7a2faa965022e ); }; export default MyForm;
React Router is a library for routing in React applications. It allows you to handle navigation and rendering of different components based on the URL.
Install React Router:
npm install react-router-dom
Set Up Routes:
import React from 'react'; import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'; const Home = () => <h2>Home</h2>; const About = () => <h2>About</h2>; const App = () => { return ( <Router> <Switch> <Route exact path="/" component={Home} /> <Route path="/about" component={About} /> </Switch> </Router> ); }; export default App;
You can use route parameters to capture values from the URL.
import React from 'react'; import { BrowserRouter as Router, Route, Switch, useParams } from 'react-router-dom'; const User = () => { const { id } = useParams(); return c1a436a314ed609750bd7c7d319db4daUser ID: {id}2e9b454fa8428549ca2e64dfac4625cd; }; const App = () => { return ( a7f2cf15f06fbef780c6b2609731da81 da7c15ee158c884a4ad5d56e941eda87 ce6eeaea0ee015d7c7834a2da08622ed 3fd1eab6a3ee1fe92fde6d97b1988f07 80ecef3d33cd6309af735c93542122ea ); }; export default App;
Nested routes allow you to render sub-components within a parent component.
import React from 'react'; import { BrowserRouter as Router, Route, Switch, Link, useRouteMatch } from 'react-router-dom'; const Topic = ({ match }) => 684271ed9684bde649abda8831d4d355Requested Topic ID: {match.params.topicId}39528cedfa926ea0c01e69ef5b2ea9b0; const Topics = ({ match }) => { let { path, url } = useRouteMatch(); return ( dc6dce4a544fdca2df29d5ac0ea9906b c1a436a314ed609750bd7c7d319db4daTopics2e9b454fa8428549ca2e64dfac4625cd ff6d136ddc5fdfeffaf53ff6ee95f185 25edfb22a4f469ecb59f1190150159c6 b725e8e2701aa5ef3b10cf4a4a8d3034Components06f735b502bd5273dad825215f7c405b bed06894275b65c1ab86501b08a632eb 25edfb22a4f469ecb59f1190150159c6 8e1f596f8f79d213858f4f3ff1b58fceProps v. State06f735b502bd5273dad825215f7c405b bed06894275b65c1ab86501b08a632eb 929d1f5ca49e04fdcb27f9465b944689 da7c15ee158c884a4ad5d56e941eda87 61f0fa4321c44137e30312030a9c0e20 684271ed9684bde649abda8831d4d355Please select a topic.39528cedfa926ea0c01e69ef5b2ea9b0 c14cb6b64e224f4e5a949337b2570e26 9d194525d14decb3df37718d52f26590 3fd1eab6a3ee1fe92fde6d97b1988f07 16b28748ea4df4d9c2150843fecfba68 ); }; const App = () => { return ( a7f2cf15f06fbef780c6b2609731da81 dc6dce4a544fdca2df29d5ac0ea9906b ff6d136ddc5fdfeffaf53ff6ee95f185 25edfb22a4f469ecb59f1190150159c6 4edbf5b784c612aafd5036a3e2d83c2dHome06f735b502bd5273dad825215f7c405b bed06894275b65c1ab86501b08a632eb 25edfb22a4f469ecb59f1190150159c6 b640d72ae84e3bad89e0179d1e328243Topics06f735b502bd5273dad825215f7c405b bed06894275b65c1ab86501b08a632eb 929d1f5ca49e04fdcb27f9465b944689 231a563c997aa9e3e0ae614bd16728b0 da7c15ee158c884a4ad5d56e941eda87 bbb3e500d9f4f89883020186a2ddbb4a f0e68096eeb3ed9fbd81056f58b8d5f3 3fd1eab6a3ee1fe92fde6d97b1988f07 16b28748ea4df4d9c2150843fecfba68 80ecef3d33cd6309af735c93542122ea ); }; export default App;
You can use the Redirect component to redirect to a different route programmatically.
import React from 'react'; import { BrowserRouter as Router, Route, Switch, Redirect } from 'react-router-dom'; const Home = () => c1a436a314ed609750bd7c7d319db4daHome2e9b454fa8428549ca2e64dfac4625cd; const About = () => c1a436a314ed609750bd7c7d319db4daAbout2e9b454fa8428549ca2e64dfac4625cd; const App = () => { return ( a7f2cf15f06fbef780c6b2609731da81 da7c15ee158c884a4ad5d56e941eda87 bbb3e500d9f4f89883020186a2ddbb4a c9dc43901ba2d8c28c3c578e571107b7 7709cf1d190ed88bc67892b77f43d992 3fd1eab6a3ee1fe92fde6d97b1988f07 80ecef3d33cd6309af735c93542122ea ); }; export default App;
The Context API provides a way to pass data through the component tree without having to pass props down manually at every level.
To create a context, use React.createContext.
const MyContext = React.createContext();
To consume a context value, use the useContext hook in functional components or Context.Consumer in class components.
const MyComponent = () => { const value = useContext(MyContext); return dc6dce4a544fdca2df29d5ac0ea9906b{value}16b28748ea4df4d9c2150843fecfba68; };
const MyComponent = () => { return ( b689c0d1a993785138e54bc7cc21f63f ea5c314853a1992950c8ee28be9bd72f 8e66e6aff1f0a13ebced51b2c1b5d182 ); }; const AnotherComponent = () => { const value = useContext(MyContext); return dc6dce4a544fdca2df29d5ac0ea9906b{value}16b28748ea4df4d9c2150843fecfba68; };
To update context, create a provider component with state.
const MyProvider = ({ children }) => { const [value, setValue] = useState('Hello'); return ( 682880ab8c111fd3ec21b55025046065 {children} 8e66e6aff1f0a13ebced51b2c1b5d182 ); }; const MyComponent = () => { const { value, setValue } = useContext(MyContext); return ( dc6dce4a544fdca2df29d5ac0ea9906b {value} 5ddc0978355752d4bf828563dc007a14 setValue('Updated Value')}>Update65281c5ac262bf6d81768915a4a77ac0 16b28748ea4df4d9c2150843fecfba68 ); };
Avoid overusing context: Use context sparingly and only for global data.
Use multiple contexts: Separate concerns by using multiple contexts.
Memoize context values: Use useMemo to avoid unnecessary re-renders.
Hooks are functions that let you use state and other React features in functional components.
useState: Adds state to functional components.
useEffect: Performs side effects in functional components.
useContext: Accesses context values.
useReducer: Manages complex state logic.
const initialState = { count: 0 }; function reducer(state, action) { switch (action.type) { case 'increment': return { count: state.count + 1 }; case 'decrement': return { count: state.count - 1 }; default: throw new Error(); } } function Counter() { const [state, dispatch] = useReducer(reducer, initialState); return ( dc6dce4a544fdca2df29d5ac0ea9906b Count: {state.count} 5ddc0978355752d4bf828563dc007a14 dispatch({ type: 'increment' })}>+65281c5ac262bf6d81768915a4a77ac0 5ddc0978355752d4bf828563dc007a14 dispatch({ type: 'decrement' })}>-65281c5ac262bf6d81768915a4a77ac0 16b28748ea4df4d9c2150843fecfba68 ); }
Custom hooks are functions that encapsulate logic and can be reused across components.
const useFetch = (url) => { const [data, setData] = useState(null); useEffect(() => { fetch(url) .then((response) => response.json()) .then((data) => setData(data)); }, [url]); return data; }; const MyComponent = () => { const data = useFetch('https://api.example.com/data'); return dc6dce4a544fdca2df29d5ac0ea9906b{data ? JSON.stringify(data) : 'Loading...'}16b28748ea4df4d9c2150843fecfba68; };
Call hooks at the top level: Do not call hooks inside loops, conditions, or nested functions.
Only call hooks from React functions: Call hooks from functional components or custom hooks.
Higher-Order Components (HOC) are functions that take a component and return a new component.
HOCs are used to add additional functionality to components.
const withLogging = (WrappedComponent) => { return (props) => { console.log('Rendering', WrappedComponent.name); return 31403eb0b6940459d9df68e14fc75564; }; };
const EnhancedComponent = withLogging(MyComponent);
const MyComponent = (props) => { return dc6dce4a544fdca2df29d5ac0ea9906bMy Component16b28748ea4df4d9c2150843fecfba68; }; const EnhancedComponent = withLogging(MyComponent);
Do not mutate the original component: Return a new component.
Use display names for debugging: Set displayName on the HOC for better debugging.
Error boundaries are React components that catch JavaScript errors anywhere in their child component tree, log those errors, and display a fallback UI.
Error boundaries catch errors during rendering, in lifecycle methods, and in constructors of the whole tree below them.
class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError(error) { return { hasError: true }; } componentDidCatch(error, errorInfo) { // You can also log the error to an error reporting service console.log(error, errorInfo); } render() { if (this.state.hasError) { return 4a249f0d628e2318394fd9b75b4636b1Something went wrong.473f0a7621bec819994bb5020d29372a; } return this.props.children; } }
Error boundaries catch errors in the render method and in lifecycle methods.
const MyComponent = () => { throw new Error('An error occurred'); return dc6dce4a544fdca2df29d5ac0ea9906bMy Component16b28748ea4df4d9c2150843fecfba68; }; const App = () => { return ( e61056d4a8a9030688e67f3b8b93a2b5 c91df85aa2a01a1e069f702d655e9491 cb28499deb11178577145cfc441388a7 ); };
Use error boundaries to catch errors in components: Use error boundaries to catch and display errors in UI components.
Log errors for debugging: Log errors to external services for debugging.
Memoization helps to avoid re-rendering components unnecessarily.
import React, { memo } from 'react'; const MyComponent = memo(({ value }) => { return dc6dce4a544fdca2df29d5ac0ea9906b{value}16b28748ea4df4d9c2150843fecfba68; });
Code splitting helps to load only the necessary code and improve performance.
import React, { Suspense, lazy } from 'react'; const OtherComponent = lazy(() => import('./OtherComponent')); const MyComponent = () => { return ( <Suspense fallback={dc6dce4a544fdca2df29d5ac0ea9906bLoading...16b28748ea4df4d9c2150843fecfba68}> 8f13323f6387d4fb51abaf18b61b3667 08ee156419279e45977839a62de7dfe8 ); };
Lazy loading helps to load components only when they are needed.
import React, { Suspense, lazy } from 'react'; const Other Component = lazy(() => import('./OtherComponent')); const MyComponent = () => { return ( <Suspense fallback={dc6dce4a544fdca2df29d5ac0ea9906bLoading...16b28748ea4df4d9c2150843fecfba68}> 8f13323f6387d4fb51abaf18b61b3667 08ee156419279e45977839a62de7dfe8 ); };
useMemo: Memoizes expensive calculations.
useCallback: Memoizes functions.
const MyComponent = ({ value }) => { const memoizedValue = useMemo(() => { return computeExpensiveValue(value); }, [value]); const memoizedCallback = useCallback(() => { doSomething(value); }, [value]); return ( dc6dce4a544fdca2df29d5ac0ea9906b {memoizedValue} f1e0750461fc4f521cd24a5533f81591Click me65281c5ac262bf6d81768915a4a77ac0 16b28748ea4df4d9c2150843fecfba68 ); };
Use React Developer Tools to identify performance bottlenecks.
Jest and React Testing Library are popular tools for testing React components.
Snapshot Testing: Capture the rendered component and compare it with a saved snapshot.
Unit Testing: Test individual components and functions.
Integration Testing: Test the integration between components and services.
import { render, screen } from '@testing-library/react'; import MyComponent from './MyComponent'; test('renders MyComponent', () => { render(c91df85aa2a01a1e069f702d655e9491); const element = screen.getByText(/My Component/i); expect(element).toBeInTheDocument(); });
Organize components by feature: Group related components together.
Use descriptive names: Use clear and descriptive names for components and props.
Keep components small: Break down large components into smaller, reusable components.
Lift state up: Lift state to the nearest common ancestor.
Utiliser le contexte pour l'état global : utiliser l'API Context pour la gestion de l'état global.
Utiliser les modules CSS : utilisez des modules CSS pour les styles étendus et modulaires.
Utiliser des composants stylisés : utilisez des composants stylisés pour un style dynamique.
Évitez les nouveaux rendus inutiles : utilisez la mémorisation et les outils d'optimisation des performances intégrés de React.
Utiliser le fractionnement du code : divisez votre code pour charger uniquement les composants nécessaires.
Écrivez des tests complets : rédigez des tests pour toutes les parties critiques de votre application.
Utiliser les tests d'instantanés : utilisez les tests d'instantanés pour détecter les changements involontaires.
React.js est une bibliothèque puissante pour créer des applications Web modernes. En comprenant et en utilisant ses concepts de base, vous pouvez créer des applications efficaces, maintenables et évolutives. Cette aide-mémoire sert de guide complet pour vous aider à maîtriser React.js, couvrant tout, des concepts de base aux sujets avancés.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!