Skip to content

Commit ca87bab

Browse files
authored
Merge pull request #119 from reactjs/sync-b1bc193d
Sync with reactjs.org @ b1bc193
2 parents 5deca83 + 36b96a0 commit ca87bab

File tree

3 files changed

+97
-7
lines changed

3 files changed

+97
-7
lines changed

content/community/conferences.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ July 15-21, 2019. New York City, USA
5757

5858
[Website](https://reactweek.nyc) - [Twitter](https://twitter.com/ReactWeek)
5959

60+
### React Rally 2019
61+
August 22-23, 2019. Salt Lake City, USA.
62+
63+
[Website](https://www.reactrally.com/) - [Twitter](https://twitter.com/ReactRally) - [Instagram](https://www.instagram.com/reactrally/)
64+
6065
### ComponentsConf 2019 {#componentsconf-2019}
6166
September 6, 2019 in Melbourne, Australia
6267
[Website](https://www.componentsconf.com.au/) - [Twitter](https://twitter.com/componentsconf)

content/docs/hooks-faq.md

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ This page answers some of the frequently asked questions about [Hooks](/docs/hoo
4141
* [How do I implement getDerivedStateFromProps?](#how-do-i-implement-getderivedstatefromprops)
4242
* [Is there something like forceUpdate?](#is-there-something-like-forceupdate)
4343
* [Can I make a ref to a function component?](#can-i-make-a-ref-to-a-function-component)
44+
* [How can I measure a DOM node?](#how-can-i-measure-a-dom-node)
4445
* [What does const [thing, setThing] = useState() mean?](#what-does-const-thing-setthing--usestate-mean)
4546
* **[Performance Optimizations](#performance-optimizations)**
4647
* [Can I skip an effect on updates?](#can-i-skip-an-effect-on-updates)
@@ -451,6 +452,60 @@ Try to avoid this pattern if possible.
451452

452453
While you shouldn't need this often, you may expose some imperative methods to a parent component with the [`useImperativeHandle`](/docs/hooks-reference.html#useimperativehandle) Hook.
453454

455+
### How can I measure a DOM node? {#how-can-i-measure-a-dom-node}
456+
457+
In order to measure the position or size of a DOM node, you can use a [callback ref](/docs/refs-and-the-dom.html#callback-refs). React will call that callback whenever the ref gets attached to a different node. Here is a [small demo](https://codesandbox.io/s/l7m0v5x4v9):
458+
459+
```js{4-8,12}
460+
function MeasureExample() {
461+
const [height, setHeight] = useState(0);
462+
463+
const measuredRef = useCallback(node => {
464+
if (node !== null) {
465+
setHeight(node.getBoundingClientRect().height);
466+
}
467+
}, []);
468+
469+
return (
470+
<>
471+
<h1 ref={measuredRef}>Hello, world</h1>
472+
<h2>The above header is {Math.round(height)}px tall</h2>
473+
</>
474+
);
475+
}
476+
```
477+
478+
We didn't choose `useRef` in this example because an object ref doesn't notify us about *changes* to the current ref value. Using a callback ref ensures that [even if a child component displays the measured node later](https://codesandbox.io/s/818zzk8m78) (e.g. in response to a click), we still get notified about it in the parent component and can update the measurements.
479+
480+
Note that we pass `[]` as a dependency array to `useCallback`. This ensures that our ref callback doesn't change between the re-renders, and so React won't call it unnecessarily.
481+
482+
If you want, you can [extract this logic](https://codesandbox.io/s/m5o42082xy) into a reusable Hook:
483+
484+
```js{2}
485+
function MeasureExample() {
486+
const [rect, ref] = useClientRect();
487+
return (
488+
<>
489+
<h1 ref={ref}>Hello, world</h1>
490+
{rect !== null &&
491+
<h2>The above header is {Math.round(rect.height)}px tall</h2>
492+
}
493+
</>
494+
);
495+
}
496+
497+
function useClientRect() {
498+
const [rect, setRect] = useState(null);
499+
const ref = useCallback(node => {
500+
if (node !== null) {
501+
setRect(node.getBoundingClientRect());
502+
}
503+
}, []);
504+
return [rect, ref];
505+
}
506+
```
507+
508+
454509
### What does `const [thing, setThing] = useState()` mean? {#what-does-const-thing-setthing--usestate-mean}
455510

456511
If you're not familiar with this syntax, check out the [explanation](/docs/hooks-state.html#tip-what-do-square-brackets-mean) in the State Hook documentation.
@@ -853,7 +908,7 @@ function Form() {
853908
const [text, updateText] = useState('');
854909
const textRef = useRef();
855910
856-
useLayoutEffect(() => {
911+
useEffect(() => {
857912
textRef.current = text; // Write it to the ref
858913
});
859914
@@ -894,7 +949,7 @@ function useEventCallback(fn, dependencies) {
894949
throw new Error('Cannot call an event handler while rendering.');
895950
});
896951
897-
useLayoutEffect(() => {
952+
useEffect(() => {
898953
ref.current = fn;
899954
}, [fn, ...dependencies]);
900955

content/docs/hooks-reference.md

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ const [state, setState] = useState(() => {
9797

9898
Si vous mettez à jour un Hook d'état avec la même valeur que son état actuel, React abandonnera cette mise à jour, ce qui signifie qu'aucun nouveau rendu des enfants ne sera effectué et qu'aucun effet ne sera déclenché. (React utilise [l'algorithme de comparaison `Object.is`](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/is).)
9999

100+
Note that React may still need to render that specific component again before bailing out. That shouldn't be a concern because React won't unnecessarily go "deeper" into the tree. If you're doing expensive calculations while rendering, you can optimize them with `useMemo`.
101+
100102
### `useEffect` {#useeffect}
101103

102104
```js
@@ -171,12 +173,26 @@ Le tableau d'entrées n'est pas fourni comme argument à la fonction d'effet. Co
171173
### `useContext` {#usecontext}
172174

173175
```js
174-
const context = useContext(Context);
176+
const value = useContext(MyContext);
175177
```
176178

177-
Accepte un objet contexte (la valeur renvoyée par `React.createContext`), et renvoie la valeur actuelle du contexte telle qu'elle est donnée par le fournisseur de contexte le plus proche pour l’objet contexte utilisé.
179+
Accepte un objet contexte (la valeur renvoyée par `React.createContext`), et renvoie la valeur actuelle du contexte. Celle-ci est déterminée par la prop `value` du plus proche `<MyContext.Provider>` au-dessus du composant dans l'arbre.
180+
181+
Quand le plus proche `<MyContext.Provider>` au-dessus du composant est mis à jour, ce Hook va déclencher un rafraîchissement avec la `value` la plus récente passée au fournisseur `MyContext`.
182+
183+
N’oubliez pas que l’argument de `useContext` doit être *l’objet contexte lui-même* :
184+
185+
* **Correct :** `useContext(MyContext)`
186+
* **Erroné :** `useContext(MyContext.Consumer)`
187+
* **Erroné :** `useContext(MyContext.Provider)`
178188

179-
Quand le fournisseur met la valeur à jour, ce Hook va déclencher un nouveau rendu avec la valeur la plus récente du contexte.
189+
Un composant qui appelle `useContext` se rafraîchira toujours quand la valeur du contexte change. Si ce rafraîchissement est coûteux, vous pouvez [l’optimiser grâce à la mémoïsation](https://github.com/facebook/react/issues/15156#issuecomment-474590693).
190+
191+
> Astuce
192+
>
193+
> Si vous aviez l’habitude de l’API de Contexte avant les Hooks, `useContext(MyContext)` est équivalent à `static contextType = MyContext` dans une classe, ou à `<MyContext.Consumer>`.
194+
>
195+
> `useContext(MyContext)` vous permet seulement de *lire* le contexte et de vous abonner à ses modifications. Vous aurez toujours besoin d’un `<MyContext.Provider>` plus haut dans l’arbre pour *fournir* une valeur de contexte.
180196
181197
## Hooks supplémentaires {#additional-hooks}
182198

@@ -283,6 +299,8 @@ function Counter({initialCount}) {
283299

284300
Si vous renvoyez la même valeur que l'état actuel dans un Hook de réduction, React abandonnera la mise à jour, ce qui signifie qu'aucun nouveau rendu des enfants ne sera effectué et qu'aucun effet ne sera déclenché. (React utilise [l'algorithme de comparaison `Object.is`](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/is).)
285301

302+
Note that React may still need to render that specific component again before bailing out. That shouldn't be a concern because React won't unnecessarily go "deeper" into the tree. If you're doing expensive calculations while rendering, you can optimize them with `useMemo`.
303+
286304
### `useCallback` {#usecallback}
287305

288306
```js
@@ -353,7 +371,15 @@ function TextInputWithFocusButton() {
353371
}
354372
```
355373

356-
Remarquez que `useRef()` est utile au-delà du seul attribut `ref`. C'est [pratique pour garder des valeurs modifiables sous la main](/docs/hooks-faq.html#is-there-something-like-instance-variables), comme lorsque vous utilisez des champs d’instance dans les classes.
374+
En gros, `useRef` est comme une « boîte » qui pourrait contenir une valeur modifiable dans sa propriété `.current`.
375+
376+
Vous avez peut-être l'habitude d'utiliser des refs principalement pour [accéder au DOM](/docs/refs-and-the-dom.html). Si vous passez un objet ref à React avec `<div ref={myRef} />`, React calera sa propriété `.current` sur le nœud DOM correspondant chaque fois que ce dernier change.
377+
378+
Ceci dit, `useRef()` est utile au-delà du seul attribut `ref`. C'est [pratique pour garder des valeurs modifiables sous la main](/docs/hooks-faq.html#is-there-something-like-instance-variables), comme lorsque vous utilisez des champs d’instance dans les classes.
379+
380+
Ça fonctionne parce que `useRef()` crée un objet JavaScript brut. La seule différence entre `useRef()` et la création manuelle d’un objet `{current: ... }`, c'est que `useRef` vous donnera le même objet à chaque rendu.
381+
382+
Gardez à l'esprit que `useRef` *ne vous notifie pas* quand le contenu change. Modifier la propriété `.current` n'entraîne pas un rafraîchissement. Si vous voulez exécuter du code quand React attache ou détache une ref sur un nœud DOM, vous voudrez sans doute utiliser plutôt une [ref à base de fonction de rappel](/docs/hooks-faq.html#how-can-i-measure-a-dom-node).
357383

358384
### `useImperativeHandle` {#useimperativehandle}
359385

@@ -385,7 +411,11 @@ Préférez l'utilisation du `useEffect` standard chaque fois que possible, pour
385411

386412
> Astuce
387413
>
388-
> Si vous migrez du code depuis un composant écrit à l'aide d'une classe, `useLayoutEffect` s'exécute dans la même phase que `componentDidMount` et `componentDidUpdate`. Si vous n'êtes donc pas sûr·e du Hook d'effet à utiliser, c'est probablement le moins risqué.
414+
> Si vous migrez du code depuis un composant écrit à l'aide d'une classe, sachez que `useLayoutEffect` s'exécute dans la même phase que `componentDidMount` et `componentDidUpdate`. **Nous vous conseillons de commencer avec `useEffect`**, et de ne tenter `useLayoutEffect` que si vous rencontrez des problèmes.
415+
>
416+
> Si vous faites du rendu côté serveur , n'oubliez pas que *ni* `useLayoutEffect` ni `useEffect` ne seront exécutés jusqu'à ce que votre code JS soit téléchargé et exécuté côté client. C’est pourquoi React vous averti quand un composant utilise `useLayoutEffect` dans le cadre d’un rendu côté serveur. Pour corriger ça, vous pouvez soit déplacer la logique dans `useEffect` (si elle n'est pas nécessaire pour le premier affichage), soit reporter l'affichage du composant jusqu'à ce que l’affichage côté client soit effectué (si le HTML aurait eu l’air cassé avant exécution du `useLayoutEffect`).
417+
>
418+
> Pour exclure un composant nécessitant des effets de mise en page *(layout effects, NdT)* du HTML généré côté serveur, vous pouvez l'afficher conditionnellement avec un `showChild && <Child />`, et différer son affichage grâce à un `useEffect(() => { setShowChild(true); }, [])`. Ainsi, l’UI ne semblera pas cassé avec son hydratation.
389419
390420
### `useDebugValue` {#usedebugvalue}
391421

0 commit comments

Comments
 (0)