From 3bff1ac3fb87d4757ba069bcd9ae229b1bdb0327 Mon Sep 17 00:00:00 2001 From: Pavlos Vinieratos Date: Thu, 8 Apr 2021 14:53:23 +0100 Subject: [PATCH 01/25] update on RN and react 17 (#3620) --- content/blog/2020-10-20-react-v17.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2020-10-20-react-v17.md b/content/blog/2020-10-20-react-v17.md index 83a1f7481..e25282140 100644 --- a/content/blog/2020-10-20-react-v17.md +++ b/content/blog/2020-10-20-react-v17.md @@ -58,7 +58,7 @@ React 17 supports the [new JSX transform](/blog/2020/09/22/introducing-the-new-j ## React Native {#react-native} -React Native has a separate release schedule. We currently expect the support for React 17 to land in React Native 0.65, but the exact version is subject to change. As always, you can track the release discussions on the React Native Community releases [issue tracker](https://github.com/react-native-community/releases). +React Native has a separate release schedule. We landed the support for React 17 in React Native 0.64. As always, you can track the release discussions on the React Native Community releases [issue tracker](https://github.com/react-native-community/releases). ## Installation {#installation} From 968f09159512b59afd5246a928789ae52592c923 Mon Sep 17 00:00:00 2001 From: Yuxiang Yang Date: Mon, 12 Apr 2021 14:46:51 +0800 Subject: [PATCH 02/25] update Optimizing Performance section (#3605) (#3623) Co-authored-by: Ethan Yang --- content/docs/optimizing-performance.md | 31 +++++--------------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/content/docs/optimizing-performance.md b/content/docs/optimizing-performance.md index a3270959c..a78a7904a 100644 --- a/content/docs/optimizing-performance.md +++ b/content/docs/optimizing-performance.md @@ -156,32 +156,6 @@ You can learn more about this in [webpack documentation](https://webpack.js.org/ Remember that you only need to do this for production builds. You shouldn't apply `TerserPlugin` in development because it will hide useful React warnings, and make the builds much slower. -## Profiling Components with the Chrome Performance Tab {#profiling-components-with-the-chrome-performance-tab} - -In the **development** mode, you can visualize how components mount, update, and unmount, using the performance tools in supported browsers. For example: - -
React components in Chrome timeline
- -To do this in Chrome: - -1. Temporarily **disable all Chrome extensions, especially React DevTools**. They can significantly skew the results! - -2. Make sure you're running the application in the development mode. - -3. Open the Chrome DevTools **[Performance](https://developers.google.com/web/tools/chrome-devtools/evaluate-performance/timeline-tool)** tab and press **Record**. - -4. Perform the actions you want to profile. Don't record more than 20 seconds or Chrome might hang. - -5. Stop recording. - -6. React events will be grouped under the **User Timing** label. - -For a more detailed walkthrough, check out [this article by Ben Schwarz](https://calibreapp.com/blog/react-performance-profiling-optimization). - -Note that **the numbers are relative so components will render faster in production**. Still, this should help you realize when unrelated UI gets updated by mistake, and how deep and how often your UI updates occur. - -Currently Chrome, Edge, and IE are the only browsers supporting this feature, but we use the standard [User Timing API](https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API) so we expect more browsers to add support for it. - ## Profiling Components with the DevTools Profiler {#profiling-components-with-the-devtools-profiler} `react-dom` 16.5+ and `react-native` 0.57+ provide enhanced profiling capabilities in DEV mode with the React DevTools Profiler. @@ -199,6 +173,11 @@ If you haven't yet installed the React DevTools, you can find them here: > A production profiling bundle of `react-dom` is also available as `react-dom/profiling`. > Read more about how to use this bundle at [fb.me/react-profiling](https://fb.me/react-profiling) +> Note +> +> Before React 17, we use the standard [User Timing API](https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API) to profile components with the chrome performance tab. +> For a more detailed walkthrough, check out [this article by Ben Schwarz](https://calibreapp.com/blog/react-performance-profiling-optimization). + ## Virtualize Long Lists {#virtualize-long-lists} If your application renders long lists of data (hundreds or thousands of rows), we recommended using a technique known as "windowing". This technique only renders a small subset of your rows at any given time, and can dramatically reduce the time it takes to re-render the components as well as the number of DOM nodes created. From cf0f0f9375008130ed2da1fea0afc6d737f598b0 Mon Sep 17 00:00:00 2001 From: ramadevsign <50571688+orama254@users.noreply.github.com> Date: Wed, 14 Apr 2021 16:57:40 +0300 Subject: [PATCH 03/25] docs: Fix broken links to React Conf videos (#3629) Co-authored-by: Sebastian Silbermann --- content/community/videos.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/community/videos.md b/content/community/videos.md index a99dc80c7..b59ddfb98 100644 --- a/content/community/videos.md +++ b/content/community/videos.md @@ -13,12 +13,12 @@ Videos dedicated to the discussion of React and the React ecosystem. ### React Conf 2019 {#react-conf-2019} A playlist of videos from React Conf 2019. - + ### React Conf 2018 {#react-conf-2018} A playlist of videos from React Conf 2018. - + ### React.js Conf 2017 {#reactjs-conf-2017} From cde17832a49273a013428a9a33dae21d9c543157 Mon Sep 17 00:00:00 2001 From: ramadevsign <50571688+orama254@users.noreply.github.com> Date: Thu, 15 Apr 2021 11:24:28 +0300 Subject: [PATCH 04/25] docs: Add react learning path on frontend masters link (#3628) Co-authored-by: Sebastian Silbermann --- content/community/courses.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/community/courses.md b/content/community/courses.md index 47883c50a..1a9e66e5a 100644 --- a/content/community/courses.md +++ b/content/community/courses.md @@ -28,7 +28,7 @@ permalink: community/courses.html - [Egghead.io](https://egghead.io/browse/frameworks/react) - Short instructional videos on React and many other topics. -- [Frontend Masters](https://frontendmasters.com/courses/) - Video courses on React and other frontend frameworks. +- [Frontend Masters](https://frontendmasters.com/learn/react/) - Video courses on React. - [Fullstack React](https://www.fullstackreact.com/) - The up-to-date, in-depth, complete guide to React and friends. From 446345cfba91b62546f46f88fad893937a826cdc Mon Sep 17 00:00:00 2001 From: Nancy Heiss <6857695+nancyheiss@users.noreply.github.com> Date: Fri, 16 Apr 2021 13:28:38 -0700 Subject: [PATCH 05/25] fixing typo in tutorial readme (#3639) Co-authored-by: Nancy Heiss --- content/tutorial/tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial/tutorial.md b/content/tutorial/tutorial.md index 772695181..a79c91584 100644 --- a/content/tutorial/tutorial.md +++ b/content/tutorial/tutorial.md @@ -524,7 +524,7 @@ Note how in `handleClick`, we call `.slice()` to create a copy of the `squares` ### Why Immutability Is Important {#why-immutability-is-important} -In the previous code example, we suggested that you use the `.slice()` method to create a copy of the `squares` array to modify instead of modifying the existing array. We'll now discuss immutability and why immutability is important to learn. +In the previous code example, we suggested that you use the `.slice()` method to create a copy of the `squares` array to copy instead of modifying the existing array. We'll now discuss immutability and why immutability is important to learn. There are generally two approaches to changing data. The first approach is to *mutate* the data by directly changing the data's values. The second approach is to replace the data with a new copy which has the desired changes. From 8e0ed8f8990d58f1b5abe8de74cbf1896295f91e Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Mon, 19 Apr 2021 17:01:37 -0400 Subject: [PATCH 06/25] Removed createBlockingRoot API docs and added a warning note (#3642) --- content/docs/concurrent-mode-adoption.md | 4 ++++ content/docs/concurrent-mode-reference.md | 13 ------------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/content/docs/concurrent-mode-adoption.md b/content/docs/concurrent-mode-adoption.md index 720c34c17..f5b8d9db1 100644 --- a/content/docs/concurrent-mode-adoption.md +++ b/content/docs/concurrent-mode-adoption.md @@ -21,6 +21,10 @@ next: concurrent-mode-reference.html > >This documentation is aimed at early adopters and people who are curious. **If you're new to React, don't worry about these features** -- you don't need to learn them right now. +>Caution: +> +>All references below to "blocking mode" and `createBlockingRoot` are outdated and should be ignored. + - [Installation](#installation) diff --git a/content/docs/concurrent-mode-reference.md b/content/docs/concurrent-mode-reference.md index 663af1b3b..e36bb0532 100644 --- a/content/docs/concurrent-mode-reference.md +++ b/content/docs/concurrent-mode-reference.md @@ -28,7 +28,6 @@ This page is an API reference for the React [Concurrent Mode](/docs/concurrent-m - [Enabling Concurrent Mode](#concurrent-mode) - [`createRoot`](#createroot) - - [`createBlockingRoot`](#createblockingroot) - [Suspense](#suspense) - [`Suspense`](#suspensecomponent) - [`SuspenseList`](#suspenselist) @@ -47,18 +46,6 @@ Replaces `ReactDOM.render(, rootNode)` and enables Concurrent Mode. For more information on Concurrent Mode, check out the [Concurrent Mode documentation.](/docs/concurrent-mode-intro.html) -### `createBlockingRoot` {#createblockingroot} - -```js -ReactDOM.createBlockingRoot(rootNode).render() -``` - -Replaces `ReactDOM.render(, rootNode)` and enables [Blocking Mode](/docs/concurrent-mode-adoption.html#migration-step-blocking-mode). - -Opting into Concurrent Mode introduces semantic changes to how React works. This means that you can't use Concurrent Mode in just a few components. Because of this, some apps may not be able to migrate directly to Concurrent Mode. - -Blocking Mode only contains a small subset of Concurrent Mode features and is intended as an intermediary migration step for apps that are unable to migrate directly. - ## Suspense API {#suspense} ### `Suspense` {#suspensecomponent} From 420c3974830052a6e438e75254f4584a56d7c125 Mon Sep 17 00:00:00 2001 From: Bryn Dyment Date: Tue, 20 Apr 2021 16:26:24 +0900 Subject: [PATCH 07/25] =?UTF-8?q?Update=20code-splitting.md=20(setup=20?= =?UTF-8?q?=E2=86=92=20=20set=20up)=20(#3643)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (`setup` is the noun form and `set up` is the verb form.) --- content/docs/code-splitting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/code-splitting.md b/content/docs/code-splitting.md index 5d7591cb1..0d1a90b98 100644 --- a/content/docs/code-splitting.md +++ b/content/docs/code-splitting.md @@ -42,7 +42,7 @@ console.log(add(16, 26)); // 42 If you're using [Create React App](https://create-react-app.dev/), [Next.js](https://nextjs.org/), [Gatsby](https://www.gatsbyjs.org/), or a similar tool, you will have a Webpack setup out of the box to bundle your app. -If you aren't, you'll need to setup bundling yourself. For example, see the [Installation](https://webpack.js.org/guides/installation/) and [Getting Started](https://webpack.js.org/guides/getting-started/) guides on the Webpack docs. +If you aren't, you'll need to set up bundling yourself. For example, see the [Installation](https://webpack.js.org/guides/installation/) and [Getting Started](https://webpack.js.org/guides/getting-started/) guides on the Webpack docs. ## Code Splitting {#code-splitting} From 8251eabd38ecc29fca1a890c2381f5663f476f38 Mon Sep 17 00:00:00 2001 From: danield770 Date: Thu, 22 Apr 2021 12:19:27 +0300 Subject: [PATCH 08/25] `lifecycle` -> `lifecycle method` (#3650) --- content/docs/reference-react-component.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/reference-react-component.md b/content/docs/reference-react-component.md index 510a73a2c..a5dabb5d8 100644 --- a/content/docs/reference-react-component.md +++ b/content/docs/reference-react-component.md @@ -299,7 +299,7 @@ Note that this method is fired on *every* render, regardless of the cause. This getSnapshotBeforeUpdate(prevProps, prevState) ``` -`getSnapshotBeforeUpdate()` is invoked right before the most recently rendered output is committed to e.g. the DOM. It enables your component to capture some information from the DOM (e.g. scroll position) before it is potentially changed. Any value returned by this lifecycle will be passed as a parameter to `componentDidUpdate()`. +`getSnapshotBeforeUpdate()` is invoked right before the most recently rendered output is committed to e.g. the DOM. It enables your component to capture some information from the DOM (e.g. scroll position) before it is potentially changed. Any value returned by this lifecycle method will be passed as a parameter to `componentDidUpdate()`. This use case is not common, but it may occur in UIs like a chat thread that need to handle scroll position in a special way. From 5119600cf6f7a5dcbd4d2cc23f6b4ff55d2969b2 Mon Sep 17 00:00:00 2001 From: m019m1 <50258878+m019m1@users.noreply.github.com> Date: Thu, 22 Apr 2021 16:53:02 +0700 Subject: [PATCH 09/25] Include where `setState` is comming from (#3652) Co-authored-by: Sebastian Silbermann --- content/docs/hooks-reference.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/docs/hooks-reference.md b/content/docs/hooks-reference.md index 1aa14c7f2..1343cc90c 100644 --- a/content/docs/hooks-reference.md +++ b/content/docs/hooks-reference.md @@ -76,6 +76,7 @@ If your update function returns the exact same value as the current state, the s > Unlike the `setState` method found in class components, `useState` does not automatically merge update objects. You can replicate this behavior by combining the function updater form with object spread syntax: > > ```js +> const [state, setState] = useState({}); > setState(prevState => { > // Object.assign would also work > return {...prevState, ...updatedValues}; From c3c93e2a7ff1b1f7b8735a3a87d4b10937eaaf91 Mon Sep 17 00:00:00 2001 From: nkalinos Date: Tue, 27 Apr 2021 04:13:24 -0700 Subject: [PATCH 10/25] added hyperlink for Netlify (#3445) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a10ba5f0d..5d6618963 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ The documentation is divided into several sections with a different tone and pur 1. `git push my-fork-name the-name-of-my-branch` 1. Go to the [reactjs.org repo](https://github.com/reactjs/reactjs.org) and you should see recently pushed branches. 1. Follow GitHub's instructions. -1. If possible, include screenshots of visual changes. A Netlify build will also be automatically created once you make your PR so other people can see your change. +1. If possible, include screenshots of visual changes. A [Netlify](https://www.netlify.com/) build will also be automatically created once you make your PR so other people can see your change. ## Translation From 16158f195a86fc2dbb59b3ea5a5c32ce161dccb9 Mon Sep 17 00:00:00 2001 From: Skaidra Bake Date: Thu, 6 May 2021 12:11:22 +0100 Subject: [PATCH 11/25] Update devtools screenshot to latest version (#3670) --- content/images/tutorial/devtools.png | Bin 23994 -> 35001 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/content/images/tutorial/devtools.png b/content/images/tutorial/devtools.png index 6c47657030ce26571b0684f0c154d44204f02864..59cea8db66782e84c0ce9839a7b491a30a54baad 100644 GIT binary patch literal 35001 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
e}>0Z)qMirl4+W+Kwn9~oy>LmgWTe#lf7n!X& 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 z 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 From 5201abf69c5786062b8718502b7aa014646f5a7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 08:00:14 +0000 Subject: [PATCH 12/25] Bump lodash from 4.17.20 to 4.17.21 (#3680) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index be08f8d6c..7a646028e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9780,9 +9780,9 @@ lodash.uniq@4.5.0, lodash.uniq@^4.5.0: integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= lodash@^4.11.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-update@^3.0.0: version "3.4.0" From 12b08e47bf3e6c9204cb35b9b670fd60439b70d0 Mon Sep 17 00:00:00 2001 From: Marisha Parker Date: Fri, 14 May 2021 06:48:48 -0600 Subject: [PATCH 13/25] Update addons-test-utils.md (#3660) Co-authored-by: Sebastian Silbermann --- content/docs/addons-test-utils.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/content/docs/addons-test-utils.md b/content/docs/addons-test-utils.md index d269eaa73..ea92f3eb9 100644 --- a/content/docs/addons-test-utils.md +++ b/content/docs/addons-test-utils.md @@ -20,8 +20,10 @@ var ReactTestUtils = require('react-dom/test-utils'); // ES5 with npm > Note: > > We recommend using [React Testing Library](https://testing-library.com/react) which is designed to enable and encourage writing tests that use your components as the end users do. -> -> Alternatively, Airbnb has released a testing utility called [Enzyme](https://airbnb.io/enzyme/), which makes it easy to assert, manipulate, and traverse your React Components' output. +> +> For React versions <= 16, the [Enzyme](https://airbnb.io/enzyme/) library makes it easy to assert, manipulate, and traverse your React Components' output. + + - [`act()`](#act) - [`mockComponent()`](#mockcomponent) From abcf0358d43caa0772e599949458df9e6578489a Mon Sep 17 00:00:00 2001 From: Robert Haritonov <1260461+operatino@users.noreply.github.com> Date: Fri, 14 May 2021 22:47:15 +0100 Subject: [PATCH 14/25] Add React Advanced London 2021 - in-person + remote (#3686) --- content/community/conferences.md | 33 ++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/content/community/conferences.md b/content/community/conferences.md index a5889d900..27fc9c0b6 100644 --- a/content/community/conferences.md +++ b/content/community/conferences.md @@ -12,32 +12,37 @@ Do you know of a local React.js conference? Add it here! (Please keep the list c ## Upcoming Conferences {#upcoming-conferences} -### React fwdays’21 {#react-fwdays-2021} -March 27, 2021 - remote event +### render(ATL) 2021 {#render-atlanta-2021} +September 13-15, 2021. Atlanta, GA, USA -[Website](https://fwdays.com/en/event/react-fwdays-2021) - [Twitter](https://twitter.com/fwdays) - [Facebook](https://www.facebook.com/events/1133828147054286) - [LinkedIn](https://www.linkedin.com/events/reactfwdays-21onlineconference6758046347334582273) - [Meetup](https://www.meetup.com/ru-RU/Fwdays/events/275764431/) +[Website](https://renderatl.com) - [Twitter](https://twitter.com/renderATL) - [Instagram](https://www.instagram.com/renderatl/) - [Facebook](https://www.facebook.com/renderatl/) - [LinkedIn](https://www.linkedin.com/company/renderatl) -### React Summit - Remote Edition 2021 {#react-summit-remote-2021} -April 14-16, 2021, 7am PST / 10am EST / 4pm CEST - remote event +### React Advanced 2021 {#react-advanced-2021} +October 22-23, 2021. In-person in London, UK + remote (hybrid event) -[Website](https://remote.reactsummit.com) - [Twitter](https://twitter.com/reactsummit) - [Facebook](https://www.facebook.com/reactamsterdam) - [Videos](https://youtube.com/c/ReactConferences) +[Website](https://reactadvanced.com) - [Twitter](http://twitter.com/reactadvanced) - [Facebook](https://www.facebook.com/ReactAdvanced) - [Videos](https://youtube.com/c/ReactConferences) + +### React India 2021 {#react-india-2021} +November 12-13, 2021 in Mumbai, India + +[Website](https://www.reactindia.io) - [Twitter](https://twitter.com/react_india) - [Facebook](https://www.facebook.com/ReactJSIndia/) - [LinkedIn](https://www.linkedin.com/showcase/14545585) - [YouTube](https://www.youtube.com/channel/UCaFbHCBkPvVv1bWs_jwYt3w/videos) + +## Past Conferences {#past-conferences} ### React Case Study Festival 2021 {#react-case-study-festival-2021} April 27-28, 2021 - remote event [Website](https://link.geekle.us/react/offsite) - [LinkedIn](https://www.linkedin.com/events/reactcasestudyfestival6721300943411015680/) - [Facebook](https://www.facebook.com/events/255715435820203) -### render(ATL) 2021 {#render-atlanta-2021} -September 13-15, 2021. Atlanta, GA, USA - -[Website](https://renderatl.com) - [Twitter](https://twitter.com/renderATL) - [Instagram](https://www.instagram.com/renderatl/) - [Facebook](https://www.facebook.com/renderatl/) - [LinkedIn](https://www.linkedin.com/company/renderatl) +### React Summit - Remote Edition 2021 {#react-summit-remote-2021} +April 14-16, 2021, 7am PST / 10am EST / 4pm CEST - remote event -### React India 2021 {#react-india-2021} -November 12-13, 2021 in Mumbai, India +[Website](https://remote.reactsummit.com) - [Twitter](https://twitter.com/reactsummit) - [Facebook](https://www.facebook.com/reactamsterdam) - [Videos](https://youtube.com/c/ReactConferences) -[Website](https://www.reactindia.io) - [Twitter](https://twitter.com/react_india) - [Facebook](https://www.facebook.com/ReactJSIndia/) - [LinkedIn](https://www.linkedin.com/showcase/14545585) - [YouTube](https://www.youtube.com/channel/UCaFbHCBkPvVv1bWs_jwYt3w/videos) +### React fwdays’21 {#react-fwdays-2021} +March 27, 2021 - remote event -## Past Conferences {#past-conferences} +[Website](https://fwdays.com/en/event/react-fwdays-2021) - [Twitter](https://twitter.com/fwdays) - [Facebook](https://www.facebook.com/events/1133828147054286) - [LinkedIn](https://www.linkedin.com/events/reactfwdays-21onlineconference6758046347334582273) - [Meetup](https://www.meetup.com/ru-RU/Fwdays/events/275764431/) ### React Next 2020 {#react-next-2020} December 1-2, 2020 - remote event From a5e0bf4d8d2725cea3ceaf8e23e14bc7f80e204d Mon Sep 17 00:00:00 2001 From: "Jabir K.H" Date: Wed, 19 May 2021 14:25:15 +0530 Subject: [PATCH 15/25] grammatical typo fix on allowlist (#3689) --- content/blog/2017-09-08-dom-attributes-in-react-16.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/blog/2017-09-08-dom-attributes-in-react-16.md b/content/blog/2017-09-08-dom-attributes-in-react-16.md index 19483fa79..03172bc00 100644 --- a/content/blog/2017-09-08-dom-attributes-in-react-16.md +++ b/content/blog/2017-09-08-dom-attributes-in-react-16.md @@ -32,7 +32,7 @@ React has always provided a JavaScript-centric API to the DOM. Since React compo
``` -This has not changed. However, the way we enforced it in the past forced us to maintain a allowlist of all valid React DOM attributes in the bundle: +This has not changed. However, the way we enforced it in the past forced us to maintain an allowlist of all valid React DOM attributes in the bundle: ```js // ... From e60bca04f3da690256ce019bd8907c2b368589ee Mon Sep 17 00:00:00 2001 From: Asher Oloo <63627538+miosher@users.noreply.github.com> Date: Fri, 21 May 2021 09:55:32 +0300 Subject: [PATCH 16/25] Fixed a minor typo in a comment (#3685) --- content/docs/testing-recipes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/testing-recipes.md b/content/docs/testing-recipes.md index 1fa4a6969..45669d127 100644 --- a/content/docs/testing-recipes.md +++ b/content/docs/testing-recipes.md @@ -393,7 +393,7 @@ it("changes value when clicked", () => { render(, container); }); - // get ahold of the button element, and trigger some clicks on it + // get a hold of the button element, and trigger some clicks on it const button = document.querySelector("[data-testid=toggle]"); expect(button.innerHTML).toBe("Turn on"); From 91cfb4e72c583f0d2a4905ca0bc3adee636c23e4 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Tue, 25 May 2021 14:56:48 +0100 Subject: [PATCH 17/25] Change example to use a
(#3697) --- content/docs/handling-events.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/content/docs/handling-events.md b/content/docs/handling-events.md index bef0178b9..f0b4e6015 100644 --- a/content/docs/handling-events.md +++ b/content/docs/handling-events.md @@ -29,27 +29,27 @@ is slightly different in React: ``` -Another difference is that you cannot return `false` to prevent default behavior in React. You must call `preventDefault` explicitly. For example, with plain HTML, to prevent the default link behavior of opening a new page, you can write: +Another difference is that you cannot return `false` to prevent default behavior in React. You must call `preventDefault` explicitly. For example, with plain HTML, to prevent the default form behavior of submitting, you can write: ```html - - Click me - + + +
``` In React, this could instead be: -```js{2-5,8} -function ActionLink() { - function handleClick(e) { +```js{3} +function Form() { + function handleSubmit(e) { e.preventDefault(); - console.log('The link was clicked.'); + console.log('You clicked submit.'); } return ( - - Click me - +
+ +
); } ``` From f6c2e0690e654c8d9ef8e98efb9ec5923cfa8cbe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 May 2021 20:56:56 +0000 Subject: [PATCH 18/25] Bump browserslist from 4.14.3 to 4.16.6 (#3699) --- yarn.lock | 55 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7a646028e..47b33bb97 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3417,14 +3417,15 @@ browserify-zlib@^0.2.0: pako "~1.0.5" browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.12.2, browserslist@^4.8.5: - version "4.14.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.3.tgz#381f9e7f13794b2eb17e1761b4f118e8ae665a53" - integrity sha512-GcZPC5+YqyPO4SFnz48/B0YaCwS47Q9iPChRGi6t7HhflKBcINzFrJvRfC+jp30sRMKxF+d4EHGs27Z0XP1NaQ== + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: - caniuse-lite "^1.0.30001131" - electron-to-chromium "^1.3.570" - escalade "^3.1.0" - node-releases "^1.1.61" + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" buble-jsx-only@^0.19.8: version "0.19.8" @@ -3726,10 +3727,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001131: - version "1.0.30001135" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001135.tgz#995b1eb94404a3c9a0d7600c113c9bb27f2cd8aa" - integrity sha512-ziNcheTGTHlu9g34EVoHQdIu5g4foc8EsxMGC7Xkokmvw0dqNtX8BS8RgCgFBaAiSp2IdjvBxNdh0ssib28eVQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219: + version "1.0.30001230" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz#8135c57459854b2240b57a4a6786044bdc5a9f71" + integrity sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ== case@^1.6.2: version "1.6.3" @@ -4085,10 +4086,10 @@ color@^3.0.0, color@^3.1.2: color-convert "^1.9.1" color-string "^1.5.2" -colorette@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" - integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== +colorette@^1.2.1, colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== colors@^1.1.2: version "1.4.0" @@ -5335,10 +5336,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.570: - version "1.3.570" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.570.tgz#3f5141cc39b4e3892a276b4889980dabf1d29c7f" - integrity sha512-Y6OCoVQgFQBP5py6A/06+yWxUZHDlNr/gNDGatjH8AZqXl8X0tE4LfjLJsXGz/JmWJz8a6K7bR1k+QzZ+k//fg== +electron-to-chromium@^1.3.723: + version "1.3.739" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz#f07756aa92cabd5a6eec6f491525a64fe62f98b9" + integrity sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A== elliptic@^6.5.3: version "6.5.3" @@ -5548,10 +5549,10 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -escalade@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e" - integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig== +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-goat@^2.0.0: version "2.1.1" @@ -10636,10 +10637,10 @@ node-object-hash@^2.0.0: resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-2.0.0.tgz#9971fcdb7d254f05016bd9ccf508352bee11116b" integrity sha512-VZR0zroAusy1ETZMZiGeLkdu50LGjG5U1KHZqTruqtTyQ2wfWhHG2Ow4nsUbfTFGlaREgNHcCWoM/OzEm6p+NQ== -node-releases@^1.1.61: - version "1.1.61" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e" - integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g== +node-releases@^1.1.71: + version "1.1.72" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" + integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== noms@0.0.0: version "0.0.0" From ec2d0adcb44d6394f4e6282d8bf52f0e25dbfec3 Mon Sep 17 00:00:00 2001 From: CodeChari Date: Fri, 28 May 2021 11:51:10 +0530 Subject: [PATCH 19/25] Updating name of variable to which returned value of setState is assigned (#3701) in CodePen it is 'prevState' and in the tutorial, it is 'state', which creates confusion. --- content/docs/handling-events.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/handling-events.md b/content/docs/handling-events.md index f0b4e6015..5a746ee61 100644 --- a/content/docs/handling-events.md +++ b/content/docs/handling-events.md @@ -71,8 +71,8 @@ class Toggle extends React.Component { } handleClick() { - this.setState(state => ({ - isToggleOn: !state.isToggleOn + this.setState(prevState => ({ + isToggleOn: !prevState.isToggleOn })); } From 6618bcc7348c3e4a16ede1a53049ac4c3afdd216 Mon Sep 17 00:00:00 2001 From: Andrea Tupini Date: Mon, 31 May 2021 17:53:56 +0200 Subject: [PATCH 20/25] Fix broken link to devtools (#3715) --- content/docs/higher-order-components.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/higher-order-components.md b/content/docs/higher-order-components.md index 07dc90c38..08d4b76cc 100644 --- a/content/docs/higher-order-components.md +++ b/content/docs/higher-order-components.md @@ -297,7 +297,7 @@ The `compose` utility function is provided by many third-party libraries includi ## Convention: Wrap the Display Name for Easy Debugging {#convention-wrap-the-display-name-for-easy-debugging} -The container components created by HOCs show up in the [React Developer Tools](https://github.com/facebook/react-devtools) like any other component. To ease debugging, choose a display name that communicates that it's the result of a HOC. +The container components created by HOCs show up in the [React Developer Tools](https://github.com/facebook/react/tree/master/packages/react-devtools) like any other component. To ease debugging, choose a display name that communicates that it's the result of a HOC. The most common technique is to wrap the display name of the wrapped component. So if your higher-order component is named `withSubscription`, and the wrapped component's display name is `CommentList`, use the display name `WithSubscription(CommentList)`: From ff68780a27f96b0e488437832aa56f88e8349667 Mon Sep 17 00:00:00 2001 From: tfrank11 <77943795+tfrank11@users.noreply.github.com> Date: Mon, 31 May 2021 14:26:53 -0400 Subject: [PATCH 21/25] Fixed typo inside concurrent-mode-reference.md (#3716) --- content/docs/concurrent-mode-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/concurrent-mode-reference.md b/content/docs/concurrent-mode-reference.md index e36bb0532..a40ad1b44 100644 --- a/content/docs/concurrent-mode-reference.md +++ b/content/docs/concurrent-mode-reference.md @@ -59,7 +59,7 @@ For more information on Concurrent Mode, check out the [Concurrent Mode document `Suspense` lets your components "wait" for something before they can render, showing a fallback while waiting. -In this example, `ProfileDetails` is waiting for an asynchronous API call to fetch some data. While we wait for `ProfileDetails` and `ProfilePhoto`, we will show the `Loading...` fallback instead. It is important to note that until all children inside `` has loaded, we will continue to show the fallback. +In this example, `ProfileDetails` is waiting for an asynchronous API call to fetch some data. While we wait for `ProfileDetails` and `ProfilePhoto`, we will show the `Loading...` fallback instead. It is important to note that until all children inside `` have loaded, we will continue to show the fallback. `Suspense` takes two props: * **fallback** takes a loading indicator. The fallback is shown until all of the children of the `Suspense` component have finished rendering. From 68e4efcf93b6e589355f6aa3cbc3f3c811c0ad37 Mon Sep 17 00:00:00 2001 From: Luke Ingalls <45518011+lukeingalls@users.noreply.github.com> Date: Mon, 7 Jun 2021 04:18:45 -0600 Subject: [PATCH 22/25] Added missing comma and removed a few redundant words (#3725) --- content/docs/forms.md | 2 +- content/docs/hello-world.md | 2 +- content/docs/lists-and-keys.md | 2 +- content/docs/thinking-in-react.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/docs/forms.md b/content/docs/forms.md index 82a0ab99b..19ff42fe6 100644 --- a/content/docs/forms.md +++ b/content/docs/forms.md @@ -9,7 +9,7 @@ redirect_from: - "docs/forms-zh-CN.html" --- -HTML form elements work a little bit differently from other DOM elements in React, because form elements naturally keep some internal state. For example, this form in plain HTML accepts a single name: +HTML form elements work a bit differently from other DOM elements in React, because form elements naturally keep some internal state. For example, this form in plain HTML accepts a single name: ```html
diff --git a/content/docs/hello-world.md b/content/docs/hello-world.md index 2fff80254..d72454f0b 100644 --- a/content/docs/hello-world.md +++ b/content/docs/hello-world.md @@ -40,7 +40,7 @@ React is a JavaScript library, and so we'll assume you have a basic understandin >Note > ->This guide occasionally uses some of the newer JavaScript syntax in the examples. If you haven't worked with JavaScript in the last few years, [these three points](https://gist.github.com/gaearon/683e676101005de0add59e8bb345340c) should get you most of the way. +>This guide occasionally uses some newer JavaScript syntax in the examples. If you haven't worked with JavaScript in the last few years, [these three points](https://gist.github.com/gaearon/683e676101005de0add59e8bb345340c) should get you most of the way. ## Let's Get Started! {#lets-get-started} diff --git a/content/docs/lists-and-keys.md b/content/docs/lists-and-keys.md index 65f52af19..5bba3dcc8 100644 --- a/content/docs/lists-and-keys.md +++ b/content/docs/lists-and-keys.md @@ -207,7 +207,7 @@ A good rule of thumb is that elements inside the `map()` call need keys. ### Keys Must Only Be Unique Among Siblings {#keys-must-only-be-unique-among-siblings} -Keys used within arrays should be unique among their siblings. However they don't need to be globally unique. We can use the same keys when we produce two different arrays: +Keys used within arrays should be unique among their siblings. However, they don't need to be globally unique. We can use the same keys when we produce two different arrays: ```js{2,5,11,12,19,21} function Blog(props) { diff --git a/content/docs/thinking-in-react.md b/content/docs/thinking-in-react.md index 6e5e7ed94..886187c3d 100644 --- a/content/docs/thinking-in-react.md +++ b/content/docs/thinking-in-react.md @@ -84,7 +84,7 @@ To make your UI interactive, you need to be able to trigger changes to your unde To build your app correctly, you first need to think of the minimal set of mutable state that your app needs. The key here is [DRY: *Don't Repeat Yourself*](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself). Figure out the absolute minimal representation of the state your application needs and compute everything else you need on-demand. For example, if you're building a TODO list, keep an array of the TODO items around; don't keep a separate state variable for the count. Instead, when you want to render the TODO count, take the length of the TODO items array. -Think of all of the pieces of data in our example application. We have: +Think of all the pieces of data in our example application. We have: * The original list of products * The search text the user has entered From 2de5df8594baf185ae3a13106623efbd619a343d Mon Sep 17 00:00:00 2001 From: Soichiro Miki Date: Sun, 13 Jun 2021 11:37:40 +0900 Subject: [PATCH 23/25] Resolve conflicts --- content/blog/2020-10-20-react-v17.md | 6 +--- content/docs/addons-test-utils.md | 12 ++----- content/docs/code-splitting.md | 4 --- content/docs/concurrent-mode-reference.md | 25 -------------- content/docs/forms.md | 6 +--- content/docs/handling-events.md | 6 +--- content/docs/hello-world.md | 9 ----- content/docs/higher-order-components.md | 6 +--- content/docs/lists-and-keys.md | 4 --- content/docs/optimizing-performance.md | 42 +++-------------------- content/docs/reference-react-component.md | 6 +--- content/docs/thinking-in-react.md | 4 --- content/tutorial/tutorial.md | 4 --- 13 files changed, 11 insertions(+), 123 deletions(-) diff --git a/content/blog/2020-10-20-react-v17.md b/content/blog/2020-10-20-react-v17.md index 68b612b50..2b81bef62 100644 --- a/content/blog/2020-10-20-react-v17.md +++ b/content/blog/2020-10-20-react-v17.md @@ -58,11 +58,7 @@ Raect 17 は[新しい JSX トランスフォーム](/blog/2020/09/22/introducin ## React Native {#react-native} -<<<<<<< HEAD -React Native has a separate release schedule. We landed the support for React 17 in React Native 0.64. As always, you can track the release discussions on the React Native Community releases [issue tracker](https://github.com/react-native-community/releases). -======= -React Native のリリーススケジュールは React と異なっています。現在のところ React Native 0.65 において React 17 のサポートが入ることを期待していますが、正確なバージョンについては変わる可能性があります。いつものように、リリースに関する議論は React Native Community のリリースに関する[イシュートラッカ](https://github.com/react-native-community/releases)で追うことができます。 ->>>>>>> origin +React Native のリリーススケジュールは React と異なっています。React 17 へのサポートは React Native 0.64 にて追加されました。いつものように、リリースに関する議論は React Native Community のリリースに関する[イシュートラッカ](https://github.com/react-native-community/releases)で追うことができます。 ## インストール {#installation} diff --git a/content/docs/addons-test-utils.md b/content/docs/addons-test-utils.md index 6d38123eb..04998033b 100644 --- a/content/docs/addons-test-utils.md +++ b/content/docs/addons-test-utils.md @@ -19,17 +19,9 @@ var ReactTestUtils = require('react-dom/test-utils'); // ES5 with npm > 補足: > -<<<<<<< HEAD -> We recommend using [React Testing Library](https://testing-library.com/react) which is designed to enable and encourage writing tests that use your components as the end users do. -> -> For React versions <= 16, the [Enzyme](https://airbnb.io/enzyme/) library makes it easy to assert, manipulate, and traverse your React Components' output. - - -======= -> [`react-testing-library`](https://testing-library.com/react) の使用をおすすめします。これは、エンドユーザがコンポーネントを使用するのと同様の書き方でコンポーネントを使用するテストを書くことを可能にし、かつそれを促進するように設計されています。 +> [`react-testing-library`](https://testing-library.com/react) の使用をおすすめします。これは、エンドユーザがコンポーネントを使用するときと同様の方法でコンポーネントを使用するようなテストを書くことを可能にし、かつそれを促進するように設計されています。 > -> また別の手段として、Airbnb が [Enzyme](http://airbnb.io/enzyme/) と呼ばれるテストユーティリティをリリースしています。Enzyme は React コンポーネントの出力のアサート、操作、そして横断的な処理を簡単にしてくれます。 ->>>>>>> origin +> バージョン 16 以下の React を使用している場合、[Enzyme](http://airbnb.io/enzyme/) ライブラリを使うことで React コンポーネントの出力のアサート、操作、そして横断的な処理を簡単に行えます。 - [`act()`](#act) - [`mockComponent()`](#mockcomponent) diff --git a/content/docs/code-splitting.md b/content/docs/code-splitting.md index 7c2fb01d8..7f83ed243 100644 --- a/content/docs/code-splitting.md +++ b/content/docs/code-splitting.md @@ -42,11 +42,7 @@ console.log(add(16, 26)); // 42 もし [Create React App](https://create-react-app.dev/)、[Next.js](https://nextjs.org/)、[Gatsby](https://www.gatsbyjs.org/) やこれらに類するツールを使用している場合、アプリケーションをバンドルするための Webpack のセットアップが最初から含まれています。 -<<<<<<< HEAD -If you aren't, you'll need to set up bundling yourself. For example, see the [Installation](https://webpack.js.org/guides/installation/) and [Getting Started](https://webpack.js.org/guides/getting-started/) guides on the Webpack docs. -======= そうでない場合は、自分でバンドルを設定する必要があります。設定方法に関しては、Webpack のドキュメントにある [Installation](https://webpack.js.org/guides/installation/) や [Getting Started](https://webpack.js.org/guides/getting-started/) などを参照してみてください。 ->>>>>>> origin ## コード分割 {#code-splitting} diff --git a/content/docs/concurrent-mode-reference.md b/content/docs/concurrent-mode-reference.md index 929da7f8e..79ed1dd4c 100644 --- a/content/docs/concurrent-mode-reference.md +++ b/content/docs/concurrent-mode-reference.md @@ -28,12 +28,7 @@ prev: concurrent-mode-adoption.html - [並列モードの有効化](#concurrent-mode) - [`createRoot`](#createroot) -<<<<<<< HEAD -- [Suspense](#suspense) -======= - - [`createBlockingRoot`](#createblockingroot) - [サスペンス API](#suspense) ->>>>>>> origin - [`Suspense`](#suspensecomponent) - [`SuspenseList`](#suspenselist) - [`useTransition`](#usetransition) @@ -51,23 +46,7 @@ ReactDOM.createRoot(rootNode).render(); 並列モードについての詳細は[並列モードのドキュメント](/docs/concurrent-mode-intro.html)を参照してください。 -<<<<<<< HEAD -## Suspense API {#suspense} -======= -### `createBlockingRoot` {#createblockingroot} - -```js -ReactDOM.createBlockingRoot(rootNode).render() -``` - -`ReactDOM.render(, rootNode)` を置き換えて[ブロッキングモード](/docs/concurrent-mode-adoption.html#migration-step-blocking-mode)を有効化します。 - -並列モードにオプトインすることで React の動作方法について意味上の変更が加わります。これは少数のコンポーネントだけで並列モードを使うということが不可能であるということを意味します。このため、いくつかのアプリケーションでは並列モードに直接移行することができないかもしれません。 - -ブロッキングモードには並列モードの機能の小さなサブセットのみが含まれているので、直接的な移行ができないアプリケーションのための中間的な移行ステップとなることを意図しています。 - ## サスペンス API {#suspense} ->>>>>>> origin ### `Suspense` {#suspensecomponent} @@ -80,11 +59,7 @@ ReactDOM.createBlockingRoot(rootNode).render() `Suspense` により、レンダー可能になる前にコンポーネントが「待機」し、待機中にフォールバックを表示できるようになります。 -<<<<<<< HEAD -In this example, `ProfileDetails` is waiting for an asynchronous API call to fetch some data. While we wait for `ProfileDetails` and `ProfilePhoto`, we will show the `Loading...` fallback instead. It is important to note that until all children inside `` have loaded, we will continue to show the fallback. -======= 上記の例では、`ProfileDetails` は何らかのデータを取得するために非同期 API コールを待機しています。`ProfileDetails` と `ProfilePhoto` を待機している間、`Loading...` というフォールバックを代わりに表示します。`` 内のすべての子要素がロードされるまでは、フォールバックが表示されつづけることに注意することが重要です。 ->>>>>>> origin `Suspense` は 2 つの props を受け取ります: * **fallback** はローディングインジケータを受け取ります。フォールバックは `Suspense` コンポーネントのすべての子要素がレンダーを完了するまで表示されます。 diff --git a/content/docs/forms.md b/content/docs/forms.md index 03545c8a1..bafe2393b 100644 --- a/content/docs/forms.md +++ b/content/docs/forms.md @@ -9,11 +9,7 @@ redirect_from: - "docs/forms-zh-CN.html" --- -<<<<<<< HEAD -HTML form elements work a bit differently from other DOM elements in React, because form elements naturally keep some internal state. For example, this form in plain HTML accepts a single name: -======= -自然な HTML のフォーム要素は内部に何らかの状態を持っていますので、フォーム要素は React において他の DOM 要素とちょっと異なる動作をします。例えば、このプレーン HTML によるフォームは 1 つの名前を受け付けます: ->>>>>>> origin +HTML のフォーム要素は当然のこととして内部に何らかの状態を持っていますので、フォーム要素は React において他の DOM 要素とちょっと異なる動作をします。例えば、このプレーン HTML によるフォームは 1 つの名前を受け付けます: ```html diff --git a/content/docs/handling-events.md b/content/docs/handling-events.md index 22b97cb76..b3acad782 100644 --- a/content/docs/handling-events.md +++ b/content/docs/handling-events.md @@ -29,11 +29,7 @@ React でのイベント処理は DOM 要素のイベントの処理と非常に ``` -<<<<<<< HEAD -Another difference is that you cannot return `false` to prevent default behavior in React. You must call `preventDefault` explicitly. For example, with plain HTML, to prevent the default form behavior of submitting, you can write: -======= -別の違いとして、React では `false` を返してもデフォルトの動作を抑止することができません。明示的に `preventDefault` を呼び出す必要があります。例えば、プレーンな HTML では、「新しいページを開く」というリンクのデフォルト動作を抑止するために次のように書くことができます。 ->>>>>>> origin +別の違いとして、React では `false` を返してもデフォルトの動作を抑止することができません。明示的に `preventDefault` を呼び出す必要があります。例えば、プレーンな HTML では、「フォームをサブミットする」という form 要素のデフォルト動作を抑止するために次のように書くことができます。 ```html diff --git a/content/docs/hello-world.md b/content/docs/hello-world.md index 8df4200e0..c7e1bd9fe 100644 --- a/content/docs/hello-world.md +++ b/content/docs/hello-world.md @@ -40,16 +40,7 @@ React は JavaScript ライブラリなので、JavaScript 言語の基本的な >補足 > -<<<<<<< HEAD ->This guide occasionally uses some newer JavaScript syntax in the examples. If you haven't worked with JavaScript in the last few years, [these three points](https://gist.github.com/gaearon/683e676101005de0add59e8bb345340c) should get you most of the way. - - -## Let's Get Started! {#lets-get-started} - -Keep scrolling down, and you'll find the link to the [next chapter of this guide](/docs/introducing-jsx.html) right before the website footer. -======= >このガイドでは時折比較的新しい JavaScript の構文を例の中で使用しています。ここ数年 JavaScript を使った仕事をしていなかったという場合は、[この 3 点](https://gist.github.com/gaearon/683e676101005de0add59e8bb345340c)を理解すればだいたい理解したことになるでしょう。 ->>>>>>> origin ## 始めましょう! {#lets-get-started} diff --git a/content/docs/higher-order-components.md b/content/docs/higher-order-components.md index a8a81043c..275c68666 100644 --- a/content/docs/higher-order-components.md +++ b/content/docs/higher-order-components.md @@ -298,11 +298,7 @@ const EnhancedComponent = enhance(WrappedComponent) ## 規則:デバッグしやすくするため表示名をラップすること {#convention-wrap-the-display-name-for-easy-debugging} -<<<<<<< HEAD -The container components created by HOCs show up in the [React Developer Tools](https://github.com/facebook/react/tree/master/packages/react-devtools) like any other component. To ease debugging, choose a display name that communicates that it's the result of a HOC. -======= -HOC により作成されたコンテナコンポーネントは他のあらゆるコンポーネントと同様、[React Developer Tools](https://github.com/facebook/react-devtools) に表示されます。デバッグを容易にするため、HOC の結果だと分かるよう表示名を選んでください。 ->>>>>>> origin +HOC により作成されたコンテナコンポーネントは他のあらゆるコンポーネントと同様、[React Developer Tools](https://github.com/facebook/react/tree/master/packages/react-devtools) に表示されます。デバッグを容易にするため、HOC の結果だと分かるよう表示名を選んでください。 最も一般的な手法は、ラップされるコンポーネントの表示名をラップすることです。つまり高階コンポーネントが `withSubscription` と名付けられ、ラップされるコンポーネントの表示名が `CommentList` である場合、`WithSubscription(CommentList)` という表示名を使用しましょう: diff --git a/content/docs/lists-and-keys.md b/content/docs/lists-and-keys.md index ec57c9284..63b64b5f6 100644 --- a/content/docs/lists-and-keys.md +++ b/content/docs/lists-and-keys.md @@ -205,11 +205,7 @@ ReactDOM.render( ### key は兄弟要素の中で一意であればよい {#keys-must-only-be-unique-among-siblings} -<<<<<<< HEAD -Keys used within arrays should be unique among their siblings. However, they don't need to be globally unique. We can use the same keys when we produce two different arrays: -======= 配列内で使われる key はその兄弟要素の中で一意である必要があります。しかしグローバルに一意である必要はありません。2 つの異なる配列を作る場合は、同一の key が使われても構いません: ->>>>>>> origin ```js{2,5,11,12,19,21} function Blog(props) { diff --git a/content/docs/optimizing-performance.md b/content/docs/optimizing-performance.md index 1e0d4184d..afe2cec4e 100644 --- a/content/docs/optimizing-performance.md +++ b/content/docs/optimizing-performance.md @@ -156,37 +156,7 @@ module.exports = { これらが必要なのは本番用ビルドだけであることに留意してください。React の有用な警告文が隠されたり、ビルド速度が大幅に遅くなったりしますので、開発時には `TerserPlugin` を適用しないでください。 -<<<<<<< HEAD -## Profiling Components with the DevTools Profiler {#profiling-components-with-the-devtools-profiler} -======= -## Chrome のパフォーマンスタブでコンポーネントをプロファイルする {#profiling-components-with-the-chrome-performance-tab} - -**開発**モードでは、対応するブラウザのパフォーマンス分析ツールで、コンポーネントのマウント・更新・アンマウントの様子を以下のように視覚化することができます。 - -
React components in Chrome timeline
- -Chrome での操作は以下の通り。 - -1. 一時的に **React DevTools を含むすべての Chrome 拡張機能を無効にする**。無効にしないと、結果が正確でなくなる可能性があります。 - -2. アプリケーションが開発モードで動作していることを確認する。 - -3. Chrome DevTools の[**パフォーマンス**](https://developers.google.com/web/tools/chrome-devtools/evaluate-performance/timeline-tool)タブを開いて **Record(記録)** ボタンを押す。 - -4. プロファイル対象のアクションを実行する。なお、20 秒以上は記録しないでください。さもないと Chrome がハングアップすることがあります。 - -5. 記録を停止する。 - -6. React イベントが **User Timing** ラベルの下にグループ化される。 - -さらなる詳細については、[Ben Schwarz によるこの記事](https://calibreapp.com/blog/react-performance-profiling-optimization)を参照ください。 - -**プロファイル結果の数値は相対的なものであり、コンポーネントは本番環境ではより速くレンダーされる**ことに注意してください。それでも、無関係な UI 部分が誤って更新されているのを見つけたり、どの程度の頻度と深さで UI の更新が発生するのかを知る手助けになるはずです。 - -現時点では、Chrome、Edge、そして IE のみがこの機能をサポートするブラウザですが、私達は標準の [User Timing API](https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API) を採用しているので、より多くのブラウザがサポートしてくれることを期待しています。 - -## DevToolsプロファイラを使用したコンポーネントのプロファイリング {#profiling-components-with-the-devtools-profiler} ->>>>>>> origin +## DevTools プロファイラを使用したコンポーネントのプロファイリング {#profiling-components-with-the-devtools-profiler} `react-dom` 16.5 以降と `react-native` 0.57 以降では、開発モードにおける強化されたプロファイリング機能を React DevTools プロファイラにて提供しています。 このプロファイラの概要はブログ記事 ["Introducing the React Profiler"](/blog/2018/09/10/introducing-the-react-profiler.html) で説明されています。 @@ -203,16 +173,12 @@ React DevTools をまだインストールしていない場合は、以下で > 本番ビルド版 `react-dom` のプロファイリング可能なバンドルとして `react-dom/profiling` が利用可能です。 > このバンドルの使い方の詳細については、[fb.me/react-profiling](https://fb.me/react-profiling) を参照してください。 -<<<<<<< HEAD -> Note +> 捕捉 > -> Before React 17, we use the standard [User Timing API](https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API) to profile components with the chrome performance tab. -> For a more detailed walkthrough, check out [this article by Ben Schwarz](https://calibreapp.com/blog/react-performance-profiling-optimization). +> React 17 以前は、標準の [User Timing API](https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API) を用いて Chrome のパフォーマンスタブでコンポーネントのプロファイリングを行います。 +> これについての概要は [Ben Schwarz によるこの記事](https://calibreapp.com/blog/react-performance-profiling-optimization)を参照してください。 -## Virtualize Long Lists {#virtualize-long-lists} -======= ## 長いリストの仮想化 {#virtualize-long-lists} ->>>>>>> origin アプリケーションが長いデータのリスト(数百〜数千行)をレンダーする場合は、「ウィンドウイング」として知られるテクニックを使うことをおすすめします。このテクニックでは、ある瞬間ごとにはリストの小さな部分集合のみを描画することで、生成する DOM ノードの数およびコンポーネントの再描画にかかる時間を大幅に削減することができます。 diff --git a/content/docs/reference-react-component.md b/content/docs/reference-react-component.md index f79d3fd24..706df9f71 100644 --- a/content/docs/reference-react-component.md +++ b/content/docs/reference-react-component.md @@ -299,11 +299,7 @@ state を派生させると冗長なコードにつながり、コンポーネ getSnapshotBeforeUpdate(prevProps, prevState) ``` -<<<<<<< HEAD -`getSnapshotBeforeUpdate()` is invoked right before the most recently rendered output is committed to e.g. the DOM. It enables your component to capture some information from the DOM (e.g. scroll position) before it is potentially changed. Any value returned by this lifecycle method will be passed as a parameter to `componentDidUpdate()`. -======= -`getSnapshotBeforeUpdate()` は、最後にレンダーされた出力が、たとえば DOM にコミットされる直前に呼び出されます。これはコンポーネントが変更される可能性があるときに、変更される前に DOM からある情報(たとえば、スクロール位置)を取得することを可能にします。このライフサイクルによって返された値はすべて、`componentDidUpdate()` へのパラメータとして渡されます。 ->>>>>>> origin +`getSnapshotBeforeUpdate()` は、最後にレンダーされた出力が DOM などにコミットされる直前に呼び出されます。これはコンポーネントが変更される可能性があるときに、変更される前に DOM から何らかの情報(たとえば、スクロール位置)を取得しておくことを可能にします。このライフサイクルメソッドによって返された値はすべて、`componentDidUpdate()` へのパラメータとして渡されます。 このユースケースは一般的ではありませんが、スクロール位置を特別な方法で処理する必要があるチャットのスレッドのような UI で発生する可能性があります。 diff --git a/content/docs/thinking-in-react.md b/content/docs/thinking-in-react.md index f39b2a904..e8c2191c6 100644 --- a/content/docs/thinking-in-react.md +++ b/content/docs/thinking-in-react.md @@ -84,11 +84,7 @@ UI をインタラクティブなものにするためには元となってい 適切に開発を進めていくにあたり、そのアプリに求められている更新可能な状態の最小構成を、最初に考えておいたほうがよいでしょう。ここで重要なのは、[DRY (don't repeat yourself)](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)の原則です。アプリケーションが必要としている最小限の状態を把握しておき、他に必要なものが出てきたら、そのとき計算すればよいのです。例えば、TODO リストを作る場合、TODO の各項目を配列で保持するだけにし、個数のカウント用に別の state 変数を持たないようにします。その代わりに、TODO の項目数を表示したいのであれば、配列の length を使えばよいのです。 -<<<<<<< HEAD -Think of all the pieces of data in our example application. We have: -======= 今回のサンプルアプリを形作るすべてのデータについて考えてみましょう。次のようなデータがあります。 ->>>>>>> origin * 元となる商品のリスト * ユーザが入力した検索文字列 diff --git a/content/tutorial/tutorial.md b/content/tutorial/tutorial.md index 8888f8321..72c327d97 100644 --- a/content/tutorial/tutorial.md +++ b/content/tutorial/tutorial.md @@ -524,11 +524,7 @@ Square コンポーネントはもう自分で state を管理しないように ### イミュータビリティは何故重要なのか {#why-immutability-is-important} -<<<<<<< HEAD -In the previous code example, we suggested that you use the `.slice()` method to create a copy of the `squares` array to copy instead of modifying the existing array. We'll now discuss immutability and why immutability is important to learn. -======= 上記のコード例において、現在の配列を直接変更する代わりに、`.slice()` メソッドを使って `square` 配列のコピーを作成し、それを変更することをお勧めしました。ここでイミュータビリティ(immutability; 不変性)について解説し、それがなぜ重要なのかについて説明します。 ->>>>>>> origin 一般的に、変化するデータに対しては 2 種類のアプローチがあります。1 番目のアプローチはデータの値を直接いじってデータを*ミューテート(mutate; 書き換え)*することです。2 番目のアプローチは、望む変更を加えた新しいデータのコピーで古いデータを置き換えることです。 From 22356176d90d72d97cc5a24f2417ab177e6aa1df Mon Sep 17 00:00:00 2001 From: Soichiro Miki Date: Tue, 15 Jun 2021 01:12:44 +0000 Subject: [PATCH 24/25] Address suggesion in code review --- content/docs/optimizing-performance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/optimizing-performance.md b/content/docs/optimizing-performance.md index afe2cec4e..046991e7b 100644 --- a/content/docs/optimizing-performance.md +++ b/content/docs/optimizing-performance.md @@ -175,7 +175,7 @@ React DevTools をまだインストールしていない場合は、以下で > 捕捉 > -> React 17 以前は、標準の [User Timing API](https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API) を用いて Chrome のパフォーマンスタブでコンポーネントのプロファイリングを行います。 +> React 17 より前のバージョンでは、標準の [User Timing API](https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API) を用いて Chrome のパフォーマンスタブでコンポーネントのプロファイリングが行われていました。 > これについての概要は [Ben Schwarz によるこの記事](https://calibreapp.com/blog/react-performance-profiling-optimization)を参照してください。 ## 長いリストの仮想化 {#virtualize-long-lists} From 7d0a9732f864ead73e9a59aafc33f7c06eb6b4fb Mon Sep 17 00:00:00 2001 From: Soichiro Miki Date: Tue, 15 Jun 2021 01:16:28 +0000 Subject: [PATCH 25/25] Translate warning --- content/docs/concurrent-mode-adoption.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/concurrent-mode-adoption.md b/content/docs/concurrent-mode-adoption.md index d7d7a996b..8388e711b 100644 --- a/content/docs/concurrent-mode-adoption.md +++ b/content/docs/concurrent-mode-adoption.md @@ -21,9 +21,9 @@ next: concurrent-mode-reference.html > > このドキュメントは興味のある読者やアーリーアダプター向けのものです。**React が初めての方はこれらの機能を気にしないで構いません** -- 今すぐに学ぶ必要はありません。 ->Caution: +>警告: > ->All references below to "blocking mode" and `createBlockingRoot` are outdated and should be ignored. +> 「ブロッキングモード」および `createBlockingRoot` に関する以下の記載はすべて古くなっていますので無視するようにしてください。