From 905a1134c07ea24aa4e4e4351371cf77b027280a Mon Sep 17 00:00:00 2001 From: Brian Mitchell Date: Mon, 18 Mar 2019 12:24:24 -0500 Subject: [PATCH 01/23] Add React Rally 2019 (#1840) --- content/community/conferences.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/content/community/conferences.md b/content/community/conferences.md index e138b119a..ea8613c78 100644 --- a/content/community/conferences.md +++ b/content/community/conferences.md @@ -57,6 +57,11 @@ July 15-21, 2019. New York City, USA [Website](https://reactweek.nyc) - [Twitter](https://twitter.com/ReactWeek) +### React Rally 2019 +August 22-23, 2019. Salt Lake City, USA. + +[Website](https://www.reactrally.com/) - [Twitter](https://twitter.com/ReactRally) - [Instagram](https://www.instagram.com/reactrally/) + ### ComponentsConf 2019 {#componentsconf-2019} September 6, 2019 in Melbourne, Australia [Website](https://www.componentsconf.com.au/) - [Twitter](https://twitter.com/componentsconf) From 806da34988106c2a92c9784edc2bc0e91333ca4a Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Tue, 19 Mar 2019 15:28:18 +0000 Subject: [PATCH 02/23] Add a DOM measurement recipe to Hooks FAQ (#1843) * Add a DOM measurement recipe to Hooks FAQ * Update content/docs/hooks-faq.md Co-Authored-By: gaearon * Update content/docs/hooks-faq.md Co-Authored-By: gaearon --- content/docs/hooks-faq.md | 55 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/content/docs/hooks-faq.md b/content/docs/hooks-faq.md index 9016fa7f4..1e68b379c 100644 --- a/content/docs/hooks-faq.md +++ b/content/docs/hooks-faq.md @@ -41,6 +41,7 @@ This page answers some of the frequently asked questions about [Hooks](/docs/hoo * [How do I implement getDerivedStateFromProps?](#how-do-i-implement-getderivedstatefromprops) * [Is there something like forceUpdate?](#is-there-something-like-forceupdate) * [Can I make a ref to a function component?](#can-i-make-a-ref-to-a-function-component) + * [How can I measure a DOM node?](#how-can-i-measure-a-dom-node) * [What does const [thing, setThing] = useState() mean?](#what-does-const-thing-setthing--usestate-mean) * **[Performance Optimizations](#performance-optimizations)** * [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. 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. +### How can I measure a DOM node? {#how-can-i-measure-a-dom-node} + +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): + +```js{4-8,12} +function MeasureExample() { + const [height, setHeight] = useState(0); + + const measuredRef = useCallback(node => { + if (node !== null) { + setHeight(node.getBoundingClientRect().height); + } + }, []); + + return ( + <> +

Hello, world

+

The above header is {Math.round(height)}px tall

+ + ); +} +``` + +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. + +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. + +If you want, you can [extract this logic](https://codesandbox.io/s/m5o42082xy) into a reusable Hook: + +```js{2} +function MeasureExample() { + const [rect, ref] = useClientRect(); + return ( + <> +

Hello, world

+ {rect !== null && +

The above header is {Math.round(rect.height)}px tall

+ } + + ); +} + +function useClientRect() { + const [rect, setRect] = useState(null); + const ref = useCallback(node => { + if (node !== null) { + setRect(node.getBoundingClientRect()); + } + }, []); + return [rect, ref]; +} +``` + + ### What does `const [thing, setThing] = useState()` mean? {#what-does-const-thing-setthing--usestate-mean} 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. From ac4aa6546e413bc6bdc6d8191081b739fbc6fb27 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Tue, 19 Mar 2019 17:12:44 +0000 Subject: [PATCH 03/23] Add more explanations to Hooks API page (#1845) * Add more explanations to API page * static * add info about useLayoutEffect * Update content/docs/hooks-reference.md Co-Authored-By: gaearon * nits * nit --- content/docs/hooks-faq.md | 4 ++-- content/docs/hooks-reference.md | 39 ++++++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/content/docs/hooks-faq.md b/content/docs/hooks-faq.md index 1e68b379c..7d2953293 100644 --- a/content/docs/hooks-faq.md +++ b/content/docs/hooks-faq.md @@ -908,7 +908,7 @@ function Form() { const [text, updateText] = useState(''); const textRef = useRef(); - useLayoutEffect(() => { + useEffect(() => { textRef.current = text; // Write it to the ref }); @@ -949,7 +949,7 @@ function useEventCallback(fn, dependencies) { throw new Error('Cannot call an event handler while rendering.'); }); - useLayoutEffect(() => { + useEffect(() => { ref.current = fn; }, [fn, ...dependencies]); diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index 4daf0f191..f2cc087d4 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -97,6 +97,8 @@ const [state, setState] = useState(() => { If you update a State Hook to the same value as the current state, React will bail out without rendering the children or firing effects. (React uses the [`Object.is` comparison algorithm](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is#Description).) +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`. + ### `useEffect` {#useeffect} ```js @@ -173,12 +175,24 @@ The array of dependencies is not passed as arguments to the effect function. Con ### `useContext` {#usecontext} ```js -const context = useContext(Context); +const value = useContext(MyContext); ``` -Accepts a context object (the value returned from `React.createContext`) and returns the current context value, as given by the nearest context provider for the given context. +Accepts a context object (the value returned from `React.createContext`) and returns the current context value for that context. The current context value is determined by the `value` prop of the nearest `` above the calling component in the tree. + +When the nearest `` above the component updates, this Hook will trigger a rerender with the latest context `value` passed to that `MyContext` provider. -When the provider updates, this Hook will trigger a rerender with the latest context value. +Don't forget that the argument to `useContext` must be the *context object itself*: + + * **Correct:** `useContext(MyContext)` + * **Incorrect:** `useContext(MyContext.Consumer)` + * **Incorrect:** `useContext(MyContext.Provider)` + +>Tip +> +>If you're familiar with the context API before Hooks, `useContext(MyContext)` is equivalent to `static contextType = MyContext` in a class, or to ``. +> +>`useContext(MyContext)` only lets you *read* the context and subscribe to its changes. You still need a `` above in the tree to *provide* the value for this context. ## Additional Hooks {#additional-hooks} @@ -285,6 +299,8 @@ function Counter({initialCount}) { If you return the same value from a Reducer Hook as the current state, React will bail out without rendering the children or firing effects. (React uses the [`Object.is` comparison algorithm](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is#Description).) +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`. + ### `useCallback` {#usecallback} ```js @@ -356,7 +372,16 @@ function TextInputWithFocusButton() { } ``` -Note that `useRef()` is useful for more than the `ref` attribute. It's [handy for keeping any mutable value around](/docs/hooks-faq.html#is-there-something-like-instance-variables) similar to how you'd use instance fields in classes. +Essentially, `useRef` is like a "box" that can hold a mutable value in its `.current` property. + +You might be familiar with refs primarily as a way to [access the DOM](/docs/refs-and-the-dom.html). If you pass a ref object to React with `
`, React will set its `.current` property to the corresponding DOM node whenever that node changes. + +However, `useRef()` is useful for more than the `ref` attribute. It's [handy for keeping any mutable value around](/docs/hooks-faq.html#is-there-something-like-instance-variables) similar to how you'd use instance fields in classes. + +This works because `useRef()` creates a plain JavaScript object. The only difference between `useRef()` and creating a `{current: ...}` object yourself is that `useRef` will give you the same ref object on every render. + +Keep in mind that `useRef` *doesn't* notify you when its content changes. Mutating the `.current` property doesn't cause a re-render. If you want to run some code when React attaches or detaches a ref to a DOM node, you may want to use a [callback ref](/docs/hooks-faq.html#how-can-i-measure-a-dom-node) instead. + ### `useImperativeHandle` {#useimperativehandle} @@ -389,7 +414,11 @@ Prefer the standard `useEffect` when possible to avoid blocking visual updates. > Tip > -> If you're migrating code from a class component, `useLayoutEffect` fires in the same phase as `componentDidMount` and `componentDidUpdate`, so if you're unsure of which effect Hook to use, it's probably the least risky. +> If you're migrating code from a class component, note `useLayoutEffect` fires in the same phase as `componentDidMount` and `componentDidUpdate`. However, **we recommend starting with `useEffect` first** and only trying `useLayoutEffect` if that causes a problem. +> +>If you use server rendering, keep in mind that *neither* `useLayoutEffect` nor `useEffect` can run until the JavaScript is downloaded. This is why React warns when a server-rendered component contains `useLayoutEffect`. To fix this, either move that logic to `useEffect` (if it isn't necessary for the first render), or delay showing that component until after the client renders (if the HTML looks broken until `useLayoutEffect` runs). +> +>To exclude a component that needs layout effects from the server-rendered HTML, render it conditionally with `showChild && ` and defer showing it with `useEffect(() => { setShowChild(true); }, [])`. This way, the UI doesn't appear broken before hydration. ### `useDebugValue` {#usedebugvalue} From b1bc193dbad464f7c659b10f3f57e37e265a063e Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Tue, 19 Mar 2019 22:09:21 +0000 Subject: [PATCH 04/23] Document useContext bailout strategy (#1848) --- content/docs/hooks-reference.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index f2cc087d4..98c2e14c0 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -188,6 +188,8 @@ Don't forget that the argument to `useContext` must be the *context object itsel * **Incorrect:** `useContext(MyContext.Consumer)` * **Incorrect:** `useContext(MyContext.Provider)` +A component calling `useContext` will always re-render when the context value changes. If re-rendering the component is expensive, you can [optimize it by using memoization](https://github.com/facebook/react/issues/15156#issuecomment-474590693). + >Tip > >If you're familiar with the context API before Hooks, `useContext(MyContext)` is equivalent to `static contextType = MyContext` in a class, or to ``. From 1f2dbb7a4f531d1c9d70ae69e025eac992b37c6a Mon Sep 17 00:00:00 2001 From: Nat Alison Date: Wed, 20 Mar 2019 13:03:43 -0700 Subject: [PATCH 05/23] Update languages for Simplified Chinese completion (#1854) * Update languages for Simplified Chinese completion * Update languages.yml --- content/languages.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/content/languages.yml b/content/languages.yml index 5e0958260..524c41c73 100644 --- a/content/languages.yml +++ b/content/languages.yml @@ -66,11 +66,15 @@ - name: Italian translated_name: Italiano code: it - status: 0 + status: 1 - name: Japanese translated_name: 日本語 code: ja status: 2 +- name: Georgian + translated_name: ქართული + code: ka + status: 0 - name: Central Khmer translated_name: ភាសាខ្មែរ code: km @@ -126,6 +130,7 @@ - name: Swedish translated_name: Svenska code: sv + status: 0 - name: Tamil translated_name: தமிழ் code: ta @@ -134,6 +139,10 @@ translated_name: తెలుగు code: te status: 0 +- name: Thai + translated_name: ไทย + code: th + status: 0 - name: Turkish translated_name: Türkçe code: tr @@ -157,7 +166,7 @@ - name: Simplified Chinese translated_name: 简体中文 code: zh-hans - status: 1 + status: 2 - name: Traditional Chinese translated_name: 繁體中文 code: zh-hant From 9bfaa3d832771e9667a91bb3466edae006373a22 Mon Sep 17 00:00:00 2001 From: Anton Akhatov Date: Sun, 24 Mar 2019 00:41:12 +0300 Subject: [PATCH 06/23] [ru.reactjs.org] fix sync conflicts --- content/docs/hooks-faq.md | 74 ++++----------------------------- content/docs/hooks-reference.md | 51 +++++++++-------------- 2 files changed, 28 insertions(+), 97 deletions(-) diff --git a/content/docs/hooks-faq.md b/content/docs/hooks-faq.md index bb175403e..bfb70d330 100644 --- a/content/docs/hooks-faq.md +++ b/content/docs/hooks-faq.md @@ -18,7 +18,6 @@ prev: hooks-reference.html ).join('\n') --> -<<<<<<< HEAD * [Внедрение хуков](#adoption-strategy) * [В какой версии React появились хуки?](#which-versions-of-react-include-hooks) * [Нужно ли переписать все мои классовые компоненты?](#do-i-need-to-rewrite-all-my-class-components) @@ -42,6 +41,7 @@ prev: hooks-reference.html * [Как я могу реализовать `getDerivedStateFromProps`?](#how-do-i-implement-getderivedstatefromprops) * [Существует что-нибудь наподобие forceUpdate?](#is-there-something-like-forceupdate) * [Могу ли я изменить реф, переданный в функциональный компонент?](#can-i-make-a-ref-to-a-function-component) + * [Как я могу измерить узел DOM?](#how-can-i-measure-a-dom-node) * [Что значит `const [thing, setThing] = useState()`?](#what-does-const-thing-setthing--usestate-mean) * [Оптимизации производительности](#performance-optimizations) * [Могу ли я пропустить эффект при обновлениях?](#can-i-skip-an-effect-on-updates) @@ -62,52 +62,6 @@ prev: hooks-reference.html ### В какой версии React появились хуки? {#which-versions-of-react-include-hooks} Начиная с релиза 16.8.0, React включает в себя стабильную реализацию хуков для: -======= -* **[Adoption Strategy](#adoption-strategy)** - * [Which versions of React include Hooks?](#which-versions-of-react-include-hooks) - * [Do I need to rewrite all my class components?](#do-i-need-to-rewrite-all-my-class-components) - * [What can I do with Hooks that I couldn't with classes?](#what-can-i-do-with-hooks-that-i-couldnt-with-classes) - * [How much of my React knowledge stays relevant?](#how-much-of-my-react-knowledge-stays-relevant) - * [Should I use Hooks, classes, or a mix of both?](#should-i-use-hooks-classes-or-a-mix-of-both) - * [Do Hooks cover all use cases for classes?](#do-hooks-cover-all-use-cases-for-classes) - * [Do Hooks replace render props and higher-order components?](#do-hooks-replace-render-props-and-higher-order-components) - * [What do Hooks mean for popular APIs like Redux connect() and React Router?](#what-do-hooks-mean-for-popular-apis-like-redux-connect-and-react-router) - * [Do Hooks work with static typing?](#do-hooks-work-with-static-typing) - * [How to test components that use Hooks?](#how-to-test-components-that-use-hooks) - * [What exactly do the lint rules enforce?](#what-exactly-do-the-lint-rules-enforce) -* **[From Classes to Hooks](#from-classes-to-hooks)** - * [How do lifecycle methods correspond to Hooks?](#how-do-lifecycle-methods-correspond-to-hooks) - * [How can I do data fetching with Hooks?](#how-can-i-do-data-fetching-with-hooks) - * [Is there something like instance variables?](#is-there-something-like-instance-variables) - * [Should I use one or many state variables?](#should-i-use-one-or-many-state-variables) - * [Can I run an effect only on updates?](#can-i-run-an-effect-only-on-updates) - * [How to get the previous props or state?](#how-to-get-the-previous-props-or-state) - * [Why am I seeing stale props or state inside my function?](#why-am-i-seeing-stale-props-or-state-inside-my-function) - * [How do I implement getDerivedStateFromProps?](#how-do-i-implement-getderivedstatefromprops) - * [Is there something like forceUpdate?](#is-there-something-like-forceupdate) - * [Can I make a ref to a function component?](#can-i-make-a-ref-to-a-function-component) - * [How can I measure a DOM node?](#how-can-i-measure-a-dom-node) - * [What does const [thing, setThing] = useState() mean?](#what-does-const-thing-setthing--usestate-mean) -* **[Performance Optimizations](#performance-optimizations)** - * [Can I skip an effect on updates?](#can-i-skip-an-effect-on-updates) - * [Is it safe to omit functions from the list of dependencies?](#is-it-safe-to-omit-functions-from-the-list-of-dependencies) - * [What can I do if my effect dependencies change too often?](#what-can-i-do-if-my-effect-dependencies-change-too-often) - * [How do I implement shouldComponentUpdate?](#how-do-i-implement-shouldcomponentupdate) - * [How to memoize calculations?](#how-to-memoize-calculations) - * [How to create expensive objects lazily?](#how-to-create-expensive-objects-lazily) - * [Are Hooks slow because of creating functions in render?](#are-hooks-slow-because-of-creating-functions-in-render) - * [How to avoid passing callbacks down?](#how-to-avoid-passing-callbacks-down) - * [How to read an often-changing value from useCallback?](#how-to-read-an-often-changing-value-from-usecallback) -* **[Under the Hood](#under-the-hood)** - * [How does React associate Hook calls with components?](#how-does-react-associate-hook-calls-with-components) - * [What is the prior art for Hooks?](#what-is-the-prior-art-for-hooks) - -## Adoption Strategy {#adoption-strategy} - -### Which versions of React include Hooks? {#which-versions-of-react-include-hooks} - -Starting with 16.8.0, React includes a stable implementation of React Hooks for: ->>>>>>> 1f2dbb7a4f531d1c9d70ae69e025eac992b37c6a * React DOM * React DOM Server @@ -498,15 +452,11 @@ function ScrollView({row}) { ### Могу ли я изменить реф, переданный в функциональный компонент? {#can-i-make-a-ref-to-a-function-component} - Несмотря на то, что вам не понадобится это часто, вы можете предоставить некоторые императивные методы родительскому компоненту, используя хук [`useImperativeHandle`](/docs/hooks-reference.html#useimperativehandle). -<<<<<<< HEAD -### Что значит `const [thing, setThing] = useState()`? {#what-does-const-thing-setthing--usestate-mean} -======= -### How can I measure a DOM node? {#how-can-i-measure-a-dom-node} +### Как я могу измерить узел DOM? {#how-can-i-measure-a-dom-node} -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): +Для измерения положения или размера узла DOM можно использовать [реф-колбек](/docs/refs-and-the-dom.html#callback-refs). React будет вызывать этот колбэк всякий раз, когда ref подключается к другому узлу. Вот [небольшая демонстрация](https://codesandbox.io/s/l7m0v5x4v9): ```js{4-8,12} function MeasureExample() { @@ -520,18 +470,18 @@ function MeasureExample() { return ( <> -

Hello, world

-

The above header is {Math.round(height)}px tall

+

Привет, мир

+

Заголовок выше {Math.round(height)} пикселей в высоту

); } ``` -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. +Мы не выбрали `useRef` в этом примере, потому что объект рефа не уведомляет нас об *изменениях* текущего значения рефа. Использование колбэк-рефа гарантирует, что [даже если дочерний компонент отображает измеренный узел позже](https://codesandbox.io/s/818zzk8m78) (например, в ответ на клик), мы по-прежнему получаем уведомление об этом в родительском компоненте и можем обновлять измерения. -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. +Обратите внимание, что мы передаем `[]` как массив зависимостей в `useCallback`. Это гарантирует, что наш обратный вызов рефа не изменится между повторными рендерами, и поэтому React не вызовет его без необходимости. -If you want, you can [extract this logic](https://codesandbox.io/s/m5o42082xy) into a reusable Hook: +При желании вы можете [извлечь эту логику](https://codesandbox.io/s/m5o42082xy) в многоразовый хук: ```js{2} function MeasureExample() { @@ -558,8 +508,7 @@ function useClientRect() { ``` -### What does `const [thing, setThing] = useState()` mean? {#what-does-const-thing-setthing--usestate-mean} ->>>>>>> 1f2dbb7a4f531d1c9d70ae69e025eac992b37c6a +### Что значит `const [thing, setThing] = useState()`? {#what-does-const-thing-setthing--usestate-mean} Если вы не знакомы с этим синтаксисом, ознакомьтесь с [объяснением](/docs/hooks-state.html#tip-what-do-square-brackets-mean) в документации хука состояния. @@ -962,13 +911,8 @@ function Form() { const [text, updateText] = useState(''); const textRef = useRef(); -<<<<<<< HEAD - useLayoutEffect(() => { - textRef.current = text; // Записать в реф -======= useEffect(() => { textRef.current = text; // Write it to the ref ->>>>>>> 1f2dbb7a4f531d1c9d70ae69e025eac992b37c6a }); const handleSubmit = useCallback(() => { diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index 853961b26..ecc282edd 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -176,29 +176,24 @@ useEffect( const value = useContext(MyContext); ``` -<<<<<<< HEAD -Принимает объект контекста (значение, возвращённое из `React.createContext`) и возвращает текущее значение контекста, как указано ближайшим поставщиком контекста для данного контекста. +Принимает объект контекста (значение, возвращаемое из `React.createContext`) и возвращает текущее значение контекста для этого контекста. Текущее значение контекста определяется пропом `value` ближайшего `` над вызывающим компонентом в дереве. -Когда провайдер обновляется, этот хук инициирует повторный рендер с последним значением контекста. -======= -Accepts a context object (the value returned from `React.createContext`) and returns the current context value for that context. The current context value is determined by the `value` prop of the nearest `` above the calling component in the tree. +Когда ближайший `` находится над обновлениями компонентов этот хук вызовет повторный рендер с последним значением контекста, переданным этому провайдеру `MyContext`. -When the nearest `` above the component updates, this Hook will trigger a rerender with the latest context `value` passed to that `MyContext` provider. +Не забывайте, что аргумент `useContext` должен быть самим объектом *context*: -Don't forget that the argument to `useContext` must be the *context object itself*: + * **Правильно:** `useContext(MyContext)` + * **Неправильно:** `useContext(MyContext.Consumer)` + * **Неправильно:** `useContext(MyContext.Provider)` - * **Correct:** `useContext(MyContext)` - * **Incorrect:** `useContext(MyContext.Consumer)` - * **Incorrect:** `useContext(MyContext.Provider)` +Компонент вызывает `useContext` всегда будет перерендерится при изменении контекста значение. При повторной визуализации компонент стоит дорого, вы можете [оптимизировать его с помощью мемоизации](https://github.com/facebook/react/issues/15156#issuecomment-474590693). -A component calling `useContext` will always re-render when the context value changes. If re-rendering the component is expensive, you can [optimize it by using memoization](https://github.com/facebook/react/issues/15156#issuecomment-474590693). - ->Tip +>Подсказка > ->If you're familiar with the context API before Hooks, `useContext(MyContext)` is equivalent to `static contextType = MyContext` in a class, or to ``. + +>Если вы знакомы с контекстным API до хуков, `useContext(MyContext)` эквивалентно `static contextType = MyContext` в классе или ` ->`useContext(MyContext)` only lets you *read* the context and subscribe to its changes. You still need a `` above in the tree to *provide* the value for this context. ->>>>>>> 1f2dbb7a4f531d1c9d70ae69e025eac992b37c6a +>`useContext (MyContext)` позволяет только *читать* контекст и подписываться на его изменения. Вам все еще нужен `` выше в дереве ,чтобы *предоставить* значение для этого контекста. ## Дополнительные хуки {#additional-hooks} @@ -378,20 +373,16 @@ function TextInputWithFocusButton() { } ``` -<<<<<<< HEAD -Обратите внимание, что `useRef()` полезен не только для атрибута `ref`. Он также [удобен для хранения любого изменяемого значения](/docs/hooks-faq.html#is-there-something-like-instance-variables) примерно так же, как вы используете поля экземпляров в классах. -======= -Essentially, `useRef` is like a "box" that can hold a mutable value in its `.current` property. +По сути, `useRef` - это как «коробка», которая может содержать изменяемое значение в своем `текущем` свойстве. -You might be familiar with refs primarily as a way to [access the DOM](/docs/refs-and-the-dom.html). If you pass a ref object to React with `
`, React will set its `.current` property to the corresponding DOM node whenever that node changes. +Вы можете быть знакомы с рефами в первую очередь как со способом [access the DOM](/docs/refs-and-the-dom.html). Если вы передадите объект рефа для реакции с `
`, React установит его `.current` текущим для соответствующего узла DOM при каждом изменении этого узла. -However, `useRef()` is useful for more than the `ref` attribute. It's [handy for keeping any mutable value around](/docs/hooks-faq.html#is-there-something-like-instance-variables) similar to how you'd use instance fields in classes. +Однако `useRef()` полезен не только для атрибута реф. Это [удобно для сохранения любого изменяемого значения](/docs/hooks-faq.html#is-there-something-like-instance-variables) аналогично тому, как вы бы использовали поля экземпляра в классах. -This works because `useRef()` creates a plain JavaScript object. The only difference between `useRef()` and creating a `{current: ...}` object yourself is that `useRef` will give you the same ref object on every render. +Это работает, потому что `useRef()` создает простой объект JavaScript. Единственное различие между `useRef()` и созданием` {current:...} `сам объект заключается в том, что `useRef` даст вам один и тот же объект реф для каждого рендеринга. -Keep in mind that `useRef` *doesn't* notify you when its content changes. Mutating the `.current` property doesn't cause a re-render. If you want to run some code when React attaches or detaches a ref to a DOM node, you may want to use a [callback ref](/docs/hooks-faq.html#how-can-i-measure-a-dom-node) instead. +Имейте в виду, что `useRef` *не уведомляет вас, когда изменяется его содержимое. Мутация свойство `.current` не вызывает повторной визуализации. Если вы хотите запустить некоторый код, когда React присоединяет или отсоединяет реф к узлу DOM, вы можете использовать [колбек рефа](/docs/hooks-faq.html#how-can-i-measure-a-dom-node) вместо этого. ->>>>>>> 1f2dbb7a4f531d1c9d70ae69e025eac992b37c6a ### `useImperativeHandle` {#useimperativehandle} @@ -424,15 +415,11 @@ FancyInput = forwardRef(FancyInput); > Совет > -<<<<<<< HEAD -> Если вы переносите код из классового компонента, `useLayoutEffect` запускается в той же фазе, что и `componentDidMount` и `componentDidUpdate`, поэтому, если вы не уверены, какой хук эффект использовать, это, вероятно, наименее рискованно. -======= -> If you're migrating code from a class component, note `useLayoutEffect` fires in the same phase as `componentDidMount` and `componentDidUpdate`. However, **we recommend starting with `useEffect` first** and only trying `useLayoutEffect` if that causes a problem. +> Если вы переносите код из классового компонента, `useLayoutEffect` запускается в той же фазе, что и `componentDidMount` и `componentDidUpdate`. Однако, *мы рекомендуем начать вначале с `useEffect`** и только попробовать `useLayoutEffect`, если это вызывает проблему. > ->If you use server rendering, keep in mind that *neither* `useLayoutEffect` nor `useEffect` can run until the JavaScript is downloaded. This is why React warns when a server-rendered component contains `useLayoutEffect`. To fix this, either move that logic to `useEffect` (if it isn't necessary for the first render), or delay showing that component until after the client renders (if the HTML looks broken until `useLayoutEffect` runs). +>Если вы используете серверный рендер, имейте в виду, что *ни* `useLayoutEffect`, ни `useEffect` не могут работать до загрузки JavaScript. Вот почему React предупреждает, когда серверный компонент содержит `useLayoutEffect`. Чтобы исправить это, либо переместите эту логику в `useEffect` (если это не необходимо для первого рендера), либо задержите показ этого компонента до тех пор, пока клиент не отрисовает (если HTML выглядит сломанным до запуска `useLayoutEffect`). > ->To exclude a component that needs layout effects from the server-rendered HTML, render it conditionally with `showChild && ` and defer showing it with `useEffect(() => { setShowChild(true); }, [])`. This way, the UI doesn't appear broken before hydration. ->>>>>>> 1f2dbb7a4f531d1c9d70ae69e025eac992b37c6a +>Чтобы исключить компонент, который нуждается в эффектах макета из HTML-кода, отображаемого сервером, сделайте его условно с помощью `showChild & & ` и отложите показ с помощью ` useEffect(() => { setShowChild(true);}, [])`. Таким образом, пользовательский интерфейс не отображается сломанным перед гидратацией. ### `useDebugValue` {#usedebugvalue} From 11001c0a2b7de3cd4fa5df02dc8e41bc4082458c Mon Sep 17 00:00:00 2001 From: Anton Akhatov Date: Sat, 30 Mar 2019 21:45:52 +0300 Subject: [PATCH 07/23] fix after review --- content/docs/hooks-faq.md | 4 ++-- content/docs/hooks-reference.md | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/content/docs/hooks-faq.md b/content/docs/hooks-faq.md index bfb70d330..a7c3addc9 100644 --- a/content/docs/hooks-faq.md +++ b/content/docs/hooks-faq.md @@ -404,7 +404,7 @@ function Example() { Если вы намеренно хотите считать из асинхронного колбэка *свежайшее* состояние, вы можете сперва сохранить его [в реф](/docs/hooks-faq.html#is-there-something-like-instance-variables), потом изменить его и затем считать его из рефа. -Наконец, возможна другая ситуация, почему вы видите устаревшие пропсы или состояние: когда вы используете оптимизацию с помощью «массива зависимостей», но неправильно указали какие-то зависимости. Например, если эффект передаёт вторым параметром `[]`, но при этом использует `someProp`, то он продолжит «видеть» исходное значение `someProp`. Правильным решением является либо исправление массива, либо отказ от его использования. +Наконец, возможна другая ситуация, почему вы видите устаревшие пропсы или состояние: когда вы используете оптимизацию с помощью «массива зависимостей», но неправильно указали какие-то зависимости. Например, если эффект передаёт вторым параметром `[]`, но при этом использует `someProp`, то он продолжит «видеть» исходное значение `someProp`. Правильным решением является либо исправление массива, либо отказ от его использования. По этим ссылкам описаны [подходы к функциям](#is-it-safe-to-omit-functions-from-the-list-of-dependencies) в аналогичных ситуациях и [другие известные способы](#what-can-i-do-if-my-effect-dependencies-change-too-often) снижения частоты вызова эффектов, исключающие передачу неправильных зависимостей. >Примечание @@ -456,7 +456,7 @@ function ScrollView({row}) { ### Как я могу измерить узел DOM? {#how-can-i-measure-a-dom-node} -Для измерения положения или размера узла DOM можно использовать [реф-колбек](/docs/refs-and-the-dom.html#callback-refs). React будет вызывать этот колбэк всякий раз, когда ref подключается к другому узлу. Вот [небольшая демонстрация](https://codesandbox.io/s/l7m0v5x4v9): +Для измерения положения или размера узла DOM можно использовать [реф-колбэк](/docs/refs-and-the-dom.html#callback-refs). React будет вызывать этот колбэк всякий раз, когда ref подключается к другому узлу. Вот [небольшая демонстрация](https://codesandbox.io/s/l7m0v5x4v9): ```js{4-8,12} function MeasureExample() { diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index ecc282edd..909743d53 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -186,7 +186,8 @@ const value = useContext(MyContext); * **Неправильно:** `useContext(MyContext.Consumer)` * **Неправильно:** `useContext(MyContext.Provider)` -Компонент вызывает `useContext` всегда будет перерендерится при изменении контекста значение. При повторной визуализации компонент стоит дорого, вы можете [оптимизировать его с помощью мемоизации](https://github.com/facebook/react/issues/15156#issuecomment-474590693). + +Компонент вызывающий `useContext` всегда будет перерендериваться при изменении значения контекста. Если повторный рендер компонента затратен, вы можете [оптимизировать его с помощью мемоизации](https://github.com/facebook/react/issues/15156#issuecomment-474590693). >Подсказка > @@ -373,15 +374,15 @@ function TextInputWithFocusButton() { } ``` -По сути, `useRef` - это как «коробка», которая может содержать изменяемое значение в своем `текущем` свойстве. +По сути, `useRef` - это как «коробка», которая может содержать изменяемое значение в своем `.current` свойстве. -Вы можете быть знакомы с рефами в первую очередь как со способом [access the DOM](/docs/refs-and-the-dom.html). Если вы передадите объект рефа для реакции с `
`, React установит его `.current` текущим для соответствующего узла DOM при каждом изменении этого узла. +Возможно вы знакомы с рефами в первую очередь как со способом [получить доступ к DOM](/docs/refs-and-the-dom.html). Если вы передадите объект рефа для реакции с `
`, React установит его `.current` текущим для соответствующего узла DOM при каждом изменении этого узла. Однако `useRef()` полезен не только для атрибута реф. Это [удобно для сохранения любого изменяемого значения](/docs/hooks-faq.html#is-there-something-like-instance-variables) аналогично тому, как вы бы использовали поля экземпляра в классах. Это работает, потому что `useRef()` создает простой объект JavaScript. Единственное различие между `useRef()` и созданием` {current:...} `сам объект заключается в том, что `useRef` даст вам один и тот же объект реф для каждого рендеринга. -Имейте в виду, что `useRef` *не уведомляет вас, когда изменяется его содержимое. Мутация свойство `.current` не вызывает повторной визуализации. Если вы хотите запустить некоторый код, когда React присоединяет или отсоединяет реф к узлу DOM, вы можете использовать [колбек рефа](/docs/hooks-faq.html#how-can-i-measure-a-dom-node) вместо этого. +Имейте в виду, что `useRef` *не* уведомляет вас, когда изменяется его содержимое. Мутация свойства `.current` не вызывает повторной визуализации. Если вы хотите запустить некоторый код, когда React присоединяет или отсоединяет реф к узлу DOM, вы можете использовать [колбек рефа](/docs/hooks-faq.html#how-can-i-measure-a-dom-node) вместо этого. ### `useImperativeHandle` {#useimperativehandle} From b5fd7b96ed891f4cd9314d70e8b729f30380997c Mon Sep 17 00:00:00 2001 From: Anton Akhatov Date: Sat, 30 Mar 2019 21:54:24 +0300 Subject: [PATCH 08/23] fix after review --- content/docs/hooks-faq.md | 2 +- content/docs/hooks-reference.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/content/docs/hooks-faq.md b/content/docs/hooks-faq.md index a7c3addc9..84102e3e9 100644 --- a/content/docs/hooks-faq.md +++ b/content/docs/hooks-faq.md @@ -912,7 +912,7 @@ function Form() { const textRef = useRef(); useEffect(() => { - textRef.current = text; // Write it to the ref + textRef.current = text; // Записать это в реф }); const handleSubmit = useCallback(() => { diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index 909743d53..9b12e3967 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -382,7 +382,7 @@ function TextInputWithFocusButton() { Это работает, потому что `useRef()` создает простой объект JavaScript. Единственное различие между `useRef()` и созданием` {current:...} `сам объект заключается в том, что `useRef` даст вам один и тот же объект реф для каждого рендеринга. -Имейте в виду, что `useRef` *не* уведомляет вас, когда изменяется его содержимое. Мутация свойства `.current` не вызывает повторной визуализации. Если вы хотите запустить некоторый код, когда React присоединяет или отсоединяет реф к узлу DOM, вы можете использовать [колбек рефа](/docs/hooks-faq.html#how-can-i-measure-a-dom-node) вместо этого. +Имейте в виду, что `useRef` *не* уведомляет вас, когда изменяется его содержимое. Мутирование свойства `.current` не вызывает повторный рендер. Если вы хотите запустить некоторый код, когда React присоединяет или отсоединяет реф к узлу DOM, вы можете использовать [колбек рефа](/docs/hooks-faq.html#how-can-i-measure-a-dom-node) вместо этого. ### `useImperativeHandle` {#useimperativehandle} @@ -418,7 +418,7 @@ FancyInput = forwardRef(FancyInput); > > Если вы переносите код из классового компонента, `useLayoutEffect` запускается в той же фазе, что и `componentDidMount` и `componentDidUpdate`. Однако, *мы рекомендуем начать вначале с `useEffect`** и только попробовать `useLayoutEffect`, если это вызывает проблему. > ->Если вы используете серверный рендер, имейте в виду, что *ни* `useLayoutEffect`, ни `useEffect` не могут работать до загрузки JavaScript. Вот почему React предупреждает, когда серверный компонент содержит `useLayoutEffect`. Чтобы исправить это, либо переместите эту логику в `useEffect` (если это не необходимо для первого рендера), либо задержите показ этого компонента до тех пор, пока клиент не отрисовает (если HTML выглядит сломанным до запуска `useLayoutEffect`). +>Если вы используете серверный рендер, имейте в виду, что *ни* `useLayoutEffect`, ни `useEffect` не могут работать до загрузки JavaScript. Вот почему React предупреждает, когда серверный компонент содержит `useLayoutEffect`. Чтобы исправить это, либо переместите эту логику в `useEffect` (если это не нужно для первого рендера), либо задержите показ этого компонента до тех пор, пока клиент не отрисовает (если HTML выглядит сломанным до запуска `useLayoutEffect`). > >Чтобы исключить компонент, который нуждается в эффектах макета из HTML-кода, отображаемого сервером, сделайте его условно с помощью `showChild & & ` и отложите показ с помощью ` useEffect(() => { setShowChild(true);}, [])`. Таким образом, пользовательский интерфейс не отображается сломанным перед гидратацией. From 7e502fb948770ddc2872e24eb933ecd783ddc16b Mon Sep 17 00:00:00 2001 From: Anton Akhatov Date: Sat, 30 Mar 2019 21:59:39 +0300 Subject: [PATCH 09/23] fix after review --- content/docs/hooks-faq.md | 2 +- content/docs/hooks-reference.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/hooks-faq.md b/content/docs/hooks-faq.md index 84102e3e9..ec7302121 100644 --- a/content/docs/hooks-faq.md +++ b/content/docs/hooks-faq.md @@ -456,7 +456,7 @@ function ScrollView({row}) { ### Как я могу измерить узел DOM? {#how-can-i-measure-a-dom-node} -Для измерения положения или размера узла DOM можно использовать [реф-колбэк](/docs/refs-and-the-dom.html#callback-refs). React будет вызывать этот колбэк всякий раз, когда ref подключается к другому узлу. Вот [небольшая демонстрация](https://codesandbox.io/s/l7m0v5x4v9): +Для измерения положения или размера узла DOM можно использовать [колбэк-реф](/docs/refs-and-the-dom.html#callback-refs). React будет вызывать этот колбэк всякий раз, когда ref подключается к другому узлу. Вот [небольшая демонстрация](https://codesandbox.io/s/l7m0v5x4v9): ```js{4-8,12} function MeasureExample() { diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index 9b12e3967..20395fc35 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -382,7 +382,7 @@ function TextInputWithFocusButton() { Это работает, потому что `useRef()` создает простой объект JavaScript. Единственное различие между `useRef()` и созданием` {current:...} `сам объект заключается в том, что `useRef` даст вам один и тот же объект реф для каждого рендеринга. -Имейте в виду, что `useRef` *не* уведомляет вас, когда изменяется его содержимое. Мутирование свойства `.current` не вызывает повторный рендер. Если вы хотите запустить некоторый код, когда React присоединяет или отсоединяет реф к узлу DOM, вы можете использовать [колбек рефа](/docs/hooks-faq.html#how-can-i-measure-a-dom-node) вместо этого. +Имейте в виду, что `useRef` *не* уведомляет вас, когда изменяется его содержимое. Мутирование свойства `.current` не вызывает повторный рендер. Если вы хотите запустить некоторый код, когда React присоединяет или отсоединяет реф к узлу DOM, вы можете использовать [колбэк-реф](/docs/hooks-faq.html#how-can-i-measure-a-dom-node) вместо этого. ### `useImperativeHandle` {#useimperativehandle} From 0f15d6631185a3932eae36181e3440bd77201274 Mon Sep 17 00:00:00 2001 From: Anton Ahatov Date: Mon, 1 Apr 2019 18:27:22 +0300 Subject: [PATCH 10/23] Update content/docs/hooks-reference.md --- content/docs/hooks-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index 20395fc35..60b8a3402 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -96,7 +96,7 @@ const [state, setState] = useState(() => { Если вы обновите состояние хука тем же значением, что и текущее состояние, React досрочно выйдет из хука без повторного рендера дочерних элементов и запуска эффектов. (React использует [алгоритм сравнения `Object.is`](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/is#Description).) -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`. +Обратите внимание, что для React всё еще может быть необходим повторный рендер этого компонента. Это не должно быть проблемой, потому что React не будет сильно «углубляться» в дерево. Если вы делаете дорогостоящие вычисления во время рендеринга, вы можете оптимизировать их с помощью `useMemo`. ### `useEffect` {#useeffect} From bc339576754824527cf88afaaf6b64a9c8372651 Mon Sep 17 00:00:00 2001 From: Anton Ahatov Date: Mon, 1 Apr 2019 18:27:30 +0300 Subject: [PATCH 11/23] Update content/docs/hooks-reference.md --- content/docs/hooks-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index 60b8a3402..e337e91d8 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -301,7 +301,7 @@ function Counter({initialCount}) { Если вы вернёте то же значение из редюсера хука, что и текущее состояние, React выйдет без перерисовки дочерних элементов или запуска эффектов. (React использует [алгоритм сравнения Object.is](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/is#Description).) -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`. +Обратите внимание, что для React всё еще может быть необходим повторный рендер этого компонента. Это не должно быть проблемой, потому что React не будет сильно «углубляться» в дерево. Если вы делаете дорогостоящие вычисления во время рендеринга, вы можете оптимизировать их с помощью `useMemo`. ### `useCallback` {#usecallback} From 4ae90f6eba844239f967ac1fb8d1be972b0b772f Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Tue, 2 Apr 2019 09:53:17 +0300 Subject: [PATCH 12/23] Update content/docs/hooks-faq.md Co-Authored-By: gcor --- content/docs/hooks-faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/hooks-faq.md b/content/docs/hooks-faq.md index ec7302121..80813133b 100644 --- a/content/docs/hooks-faq.md +++ b/content/docs/hooks-faq.md @@ -456,7 +456,7 @@ function ScrollView({row}) { ### Как я могу измерить узел DOM? {#how-can-i-measure-a-dom-node} -Для измерения положения или размера узла DOM можно использовать [колбэк-реф](/docs/refs-and-the-dom.html#callback-refs). React будет вызывать этот колбэк всякий раз, когда ref подключается к другому узлу. Вот [небольшая демонстрация](https://codesandbox.io/s/l7m0v5x4v9): +Для определения положения или размера DOM-узла можно использовать [колбэк-реф](/docs/refs-and-the-dom.html#callback-refs). React будет вызывать этот колбэк всякий раз, когда реф привязывается к другому узлу. Вот [небольшая демонстрация](https://codesandbox.io/s/l7m0v5x4v9): ```js{4-8,12} function MeasureExample() { From c50331e8c273783ae67e9792662bc21e52d4e249 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Tue, 2 Apr 2019 09:53:27 +0300 Subject: [PATCH 13/23] Update content/docs/hooks-faq.md Co-Authored-By: gcor --- content/docs/hooks-faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/hooks-faq.md b/content/docs/hooks-faq.md index 80813133b..44ce5dc93 100644 --- a/content/docs/hooks-faq.md +++ b/content/docs/hooks-faq.md @@ -471,7 +471,7 @@ function MeasureExample() { return ( <>

Привет, мир

-

Заголовок выше {Math.round(height)} пикселей в высоту

+

Заголовок выше имеет высоту {Math.round(height)} пикселей

); } From 2d37a5ef224ed11e6df50402c723f1b2725cc74e Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Tue, 2 Apr 2019 09:53:34 +0300 Subject: [PATCH 14/23] Update content/docs/hooks-faq.md Co-Authored-By: gcor --- content/docs/hooks-faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/hooks-faq.md b/content/docs/hooks-faq.md index 44ce5dc93..c06fc970b 100644 --- a/content/docs/hooks-faq.md +++ b/content/docs/hooks-faq.md @@ -479,7 +479,7 @@ function MeasureExample() { Мы не выбрали `useRef` в этом примере, потому что объект рефа не уведомляет нас об *изменениях* текущего значения рефа. Использование колбэк-рефа гарантирует, что [даже если дочерний компонент отображает измеренный узел позже](https://codesandbox.io/s/818zzk8m78) (например, в ответ на клик), мы по-прежнему получаем уведомление об этом в родительском компоненте и можем обновлять измерения. -Обратите внимание, что мы передаем `[]` как массив зависимостей в `useCallback`. Это гарантирует, что наш обратный вызов рефа не изменится между повторными рендерами, и поэтому React не вызовет его без необходимости. +Обратите внимание, что мы передаем `[]` как массив зависимостей в `useCallback`. Это гарантирует, что наш колбэк-реф не изменится между повторными рендерами, а значит React не будет вызывать его без необходимости. При желании вы можете [извлечь эту логику](https://codesandbox.io/s/m5o42082xy) в многоразовый хук: From ba24f1d1560a0c831122c256696f3578cc6a004e Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Tue, 2 Apr 2019 09:53:42 +0300 Subject: [PATCH 15/23] Update content/docs/hooks-reference.md Co-Authored-By: gcor --- content/docs/hooks-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index e337e91d8..cc711b5f3 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -380,7 +380,7 @@ function TextInputWithFocusButton() { Однако `useRef()` полезен не только для атрибута реф. Это [удобно для сохранения любого изменяемого значения](/docs/hooks-faq.html#is-there-something-like-instance-variables) аналогично тому, как вы бы использовали поля экземпляра в классах. -Это работает, потому что `useRef()` создает простой объект JavaScript. Единственное различие между `useRef()` и созданием` {current:...} `сам объект заключается в том, что `useRef` даст вам один и тот же объект реф для каждого рендеринга. +Это возможно, поскольку `useRef()` создаёт обычный JavaScript-объект. Единственная разница между `useRef()` и просто созданием самого объекта `{current: ...}` — это то, что хук `useRef` даст один и тот же объект с рефом при каждом рендере. Имейте в виду, что `useRef` *не* уведомляет вас, когда изменяется его содержимое. Мутирование свойства `.current` не вызывает повторный рендер. Если вы хотите запустить некоторый код, когда React присоединяет или отсоединяет реф к узлу DOM, вы можете использовать [колбэк-реф](/docs/hooks-faq.html#how-can-i-measure-a-dom-node) вместо этого. From 42d54fd8406c324a718100034ccd6549564c3801 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Tue, 2 Apr 2019 09:53:51 +0300 Subject: [PATCH 16/23] Update content/docs/hooks-reference.md Co-Authored-By: gcor --- content/docs/hooks-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index cc711b5f3..62840fab0 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -418,7 +418,7 @@ FancyInput = forwardRef(FancyInput); > > Если вы переносите код из классового компонента, `useLayoutEffect` запускается в той же фазе, что и `componentDidMount` и `componentDidUpdate`. Однако, *мы рекомендуем начать вначале с `useEffect`** и только попробовать `useLayoutEffect`, если это вызывает проблему. > ->Если вы используете серверный рендер, имейте в виду, что *ни* `useLayoutEffect`, ни `useEffect` не могут работать до загрузки JavaScript. Вот почему React предупреждает, когда серверный компонент содержит `useLayoutEffect`. Чтобы исправить это, либо переместите эту логику в `useEffect` (если это не нужно для первого рендера), либо задержите показ этого компонента до тех пор, пока клиент не отрисовает (если HTML выглядит сломанным до запуска `useLayoutEffect`). +>Если вы используете серверный рендеринг, имейте в виду, что *ни* `useLayoutEffect`, ни `useEffect` не могут работать до загрузки JavaScript. Вот почему React предупреждает, когда серверный компонент содержит `useLayoutEffect`. Чтобы справиться с данной проблемой, либо переместите эту логику в `useEffect` (если она не нужна для первого рендера), либо задержите отображение этого компонента до тех пор, пока не выполнится рендеринг на стороне клиента (если HTML некорректный до запуска `useLayoutEffect`). > >Чтобы исключить компонент, который нуждается в эффектах макета из HTML-кода, отображаемого сервером, сделайте его условно с помощью `showChild & & ` и отложите показ с помощью ` useEffect(() => { setShowChild(true);}, [])`. Таким образом, пользовательский интерфейс не отображается сломанным перед гидратацией. From 402c0a9c035639696e7a8f87a64958b1b765e807 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Tue, 2 Apr 2019 09:54:09 +0300 Subject: [PATCH 17/23] Update content/docs/hooks-reference.md Co-Authored-By: gcor --- content/docs/hooks-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index 62840fab0..93dac03e6 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -416,7 +416,7 @@ FancyInput = forwardRef(FancyInput); > Совет > -> Если вы переносите код из классового компонента, `useLayoutEffect` запускается в той же фазе, что и `componentDidMount` и `componentDidUpdate`. Однако, *мы рекомендуем начать вначале с `useEffect`** и только попробовать `useLayoutEffect`, если это вызывает проблему. +> Если вы переносите код из классового компонента, `useLayoutEffect` запускается в той же фазе, что и `componentDidMount` и `componentDidUpdate`. Тем не менее, *мы рекомендуем начать с `useEffect`**, и попробовать использовать `useLayoutEffect`, если тот приводит к возникновению проблем. > >Если вы используете серверный рендеринг, имейте в виду, что *ни* `useLayoutEffect`, ни `useEffect` не могут работать до загрузки JavaScript. Вот почему React предупреждает, когда серверный компонент содержит `useLayoutEffect`. Чтобы справиться с данной проблемой, либо переместите эту логику в `useEffect` (если она не нужна для первого рендера), либо задержите отображение этого компонента до тех пор, пока не выполнится рендеринг на стороне клиента (если HTML некорректный до запуска `useLayoutEffect`). > From 3cf2d7361a7d1fbb5fb0fbd7c85c9792d5ce068e Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Tue, 2 Apr 2019 09:54:19 +0300 Subject: [PATCH 18/23] Update content/docs/hooks-faq.md Co-Authored-By: gcor --- content/docs/hooks-faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/hooks-faq.md b/content/docs/hooks-faq.md index c06fc970b..90469e516 100644 --- a/content/docs/hooks-faq.md +++ b/content/docs/hooks-faq.md @@ -481,7 +481,7 @@ function MeasureExample() { Обратите внимание, что мы передаем `[]` как массив зависимостей в `useCallback`. Это гарантирует, что наш колбэк-реф не изменится между повторными рендерами, а значит React не будет вызывать его без необходимости. -При желании вы можете [извлечь эту логику](https://codesandbox.io/s/m5o42082xy) в многоразовый хук: +При желании вы можете [извлечь эту логику](https://codesandbox.io/s/m5o42082xy) в переиспользуемый хук: ```js{2} function MeasureExample() { From cfb5e299015ca3a12a7be86911d3b25cad3901b7 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Tue, 2 Apr 2019 09:54:28 +0300 Subject: [PATCH 19/23] Update content/docs/hooks-faq.md Co-Authored-By: gcor --- content/docs/hooks-faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/hooks-faq.md b/content/docs/hooks-faq.md index 90469e516..f11e5c67d 100644 --- a/content/docs/hooks-faq.md +++ b/content/docs/hooks-faq.md @@ -488,7 +488,7 @@ function MeasureExample() { const [rect, ref] = useClientRect(); return ( <> -

Hello, world

+

Привет, мир

{rect !== null &&

The above header is {Math.round(rect.height)}px tall

} From 6a4edbb5bdb8c708d6fb838edcf0d81c79038ae1 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Tue, 2 Apr 2019 09:55:53 +0300 Subject: [PATCH 20/23] Update content/docs/hooks-reference.md Co-Authored-By: gcor --- content/docs/hooks-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index 93dac03e6..0d08d6414 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -420,7 +420,7 @@ FancyInput = forwardRef(FancyInput); > >Если вы используете серверный рендеринг, имейте в виду, что *ни* `useLayoutEffect`, ни `useEffect` не могут работать до загрузки JavaScript. Вот почему React предупреждает, когда серверный компонент содержит `useLayoutEffect`. Чтобы справиться с данной проблемой, либо переместите эту логику в `useEffect` (если она не нужна для первого рендера), либо задержите отображение этого компонента до тех пор, пока не выполнится рендеринг на стороне клиента (если HTML некорректный до запуска `useLayoutEffect`). > ->Чтобы исключить компонент, который нуждается в эффектах макета из HTML-кода, отображаемого сервером, сделайте его условно с помощью `showChild & & ` и отложите показ с помощью ` useEffect(() => { setShowChild(true);}, [])`. Таким образом, пользовательский интерфейс не отображается сломанным перед гидратацией. +>Чтобы исключить компонент, который нуждается в эффектах макета из HTML-кода, полученного в результате серверного рендеринга, выполните его рендер по условию `showChild && ` и отложите отображение с помощью `useEffect(() => { setShowChild(true); }, [])``. Таким образом, пользовательский интерфейс не будет выглядеть некорректно перед гидратацией. ### `useDebugValue` {#usedebugvalue} From b6c974ca239bec6e429c62f235dce1d8c3371dcb Mon Sep 17 00:00:00 2001 From: Anton Ahatov Date: Tue, 2 Apr 2019 09:56:40 +0300 Subject: [PATCH 21/23] Update content/docs/hooks-reference.md --- content/docs/hooks-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index 0d08d6414..ab397e0dd 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -189,7 +189,7 @@ const value = useContext(MyContext); Компонент вызывающий `useContext` всегда будет перерендериваться при изменении значения контекста. Если повторный рендер компонента затратен, вы можете [оптимизировать его с помощью мемоизации](https://github.com/facebook/react/issues/15156#issuecomment-474590693). ->Подсказка +>Совет > >Если вы знакомы с контекстным API до хуков, `useContext(MyContext)` эквивалентно `static contextType = MyContext` в классе или ` Date: Tue, 2 Apr 2019 09:58:34 +0300 Subject: [PATCH 22/23] Apply suggestions from code review Co-Authored-By: gcor --- content/docs/hooks-faq.md | 2 +- content/docs/hooks-reference.md | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/content/docs/hooks-faq.md b/content/docs/hooks-faq.md index f11e5c67d..580884286 100644 --- a/content/docs/hooks-faq.md +++ b/content/docs/hooks-faq.md @@ -490,7 +490,7 @@ function MeasureExample() { <>

Привет, мир

{rect !== null && -

The above header is {Math.round(rect.height)}px tall

+

Заголовок выше имеет высоту {Math.round(height)} пикселей

} ); diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index ab397e0dd..c5412368d 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -180,21 +180,21 @@ const value = useContext(MyContext); Когда ближайший `` находится над обновлениями компонентов этот хук вызовет повторный рендер с последним значением контекста, переданным этому провайдеру `MyContext`. -Не забывайте, что аргумент `useContext` должен быть самим объектом *context*: +Запомните, аргумент для `useContext` должен быть *непосредственно сам объект контекста*: * **Правильно:** `useContext(MyContext)` * **Неправильно:** `useContext(MyContext.Consumer)` * **Неправильно:** `useContext(MyContext.Provider)` -Компонент вызывающий `useContext` всегда будет перерендериваться при изменении значения контекста. Если повторный рендер компонента затратен, вы можете [оптимизировать его с помощью мемоизации](https://github.com/facebook/react/issues/15156#issuecomment-474590693). +Компонент, вызывающий `useContext`, всегда будет перерендериваться при изменении значения контекста. Если повторный рендер компонента затратен, вы можете [оптимизировать его с помощью мемоизации](https://github.com/facebook/react/issues/15156#issuecomment-474590693). >Совет > ->Если вы знакомы с контекстным API до хуков, `useContext(MyContext)` эквивалентно `static contextType = MyContext` в классе или `Если вы были знакомы с API контекстов до появления хуков, то вызов `useContext(MyContext)` аналогичен выражению `static contextType = MyContext` в классе, либо компоненту ``. > ->`useContext (MyContext)` позволяет только *читать* контекст и подписываться на его изменения. Вам все еще нужен `` выше в дереве ,чтобы *предоставить* значение для этого контекста. +>`useContext (MyContext)` позволяет только *читать* контекст и подписываться на его изменения. Вам всё ещё нужен `` выше в дереве, чтобы *предоставить* значение для этого контекста. ## Дополнительные хуки {#additional-hooks} @@ -374,11 +374,11 @@ function TextInputWithFocusButton() { } ``` -По сути, `useRef` - это как «коробка», которая может содержать изменяемое значение в своем `.current` свойстве. +По сути, `useRef` похож на «коробку», которая может содержать изменяемое значение в своём свойстве `.current`. -Возможно вы знакомы с рефами в первую очередь как со способом [получить доступ к DOM](/docs/refs-and-the-dom.html). Если вы передадите объект рефа для реакции с `
`, React установит его `.current` текущим для соответствующего узла DOM при каждом изменении этого узла. +Возможно, вы знакомы с рефами в основном как со способом [получить доступ к DOM](/docs/refs-and-the-dom.html). Если вы передадите React объект рефа с помощью подобного выражения `
`, React установит собственное свойство `.current` на соответствующий DOM-узел при каждом его изменении. -Однако `useRef()` полезен не только для атрибута реф. Это [удобно для сохранения любого изменяемого значения](/docs/hooks-faq.html#is-there-something-like-instance-variables) аналогично тому, как вы бы использовали поля экземпляра в классах. +Но хук `useRef()` полезен не только установкой атрибута с рефом. Он [удобен для сохранения любого мутируемого значения](/docs/hooks-faq.html#is-there-something-like-instance-variables), по аналогии с тем, как вы используете поля экземпляра в классах. Это возможно, поскольку `useRef()` создаёт обычный JavaScript-объект. Единственная разница между `useRef()` и просто созданием самого объекта `{current: ...}` — это то, что хук `useRef` даст один и тот же объект с рефом при каждом рендере. From ce39f1d64236ac4c0701c5d399103ac08eb2c564 Mon Sep 17 00:00:00 2001 From: Anton Ahatov Date: Tue, 2 Apr 2019 10:00:58 +0300 Subject: [PATCH 23/23] Update content/docs/hooks-reference.md --- content/docs/hooks-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index c5412368d..66a79ab48 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -178,7 +178,7 @@ const value = useContext(MyContext); Принимает объект контекста (значение, возвращаемое из `React.createContext`) и возвращает текущее значение контекста для этого контекста. Текущее значение контекста определяется пропом `value` ближайшего `` над вызывающим компонентом в дереве. -Когда ближайший `` находится над обновлениями компонентов этот хук вызовет повторный рендер с последним значением контекста, переданным этому провайдеру `MyContext`. +Когда ближайший `` над компонентом обновляется, этот хук вызовет повторный рендер с последним значением контекста, переданным этому провайдеру `MyContext`. Запомните, аргумент для `useContext` должен быть *непосредственно сам объект контекста*: