Skip to content

Commit a2873e3

Browse files
committed
Translate "Scaling Up with Reducer and Context"
1 parent 1a03eea commit a2873e3

File tree

2 files changed

+56
-56
lines changed

2 files changed

+56
-56
lines changed

src/content/learn/scaling-up-with-reducer-and-context.md

+55-55
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
---
2-
title: Scaling Up with Reducer and Context
2+
title: リデューサとコンテクストでスケールアップ
33
---
44

55
<Intro>
66

7-
Reducers let you consolidate a component's state update logic. Context lets you pass information deep down to other components. You can combine reducers and context together to manage state of a complex screen.
7+
リデューサを使えば、コンポーネントの state 更新ロジックを集約することができます。コンテクストを使えば、他のコンポーネントに深く情報を渡すことができます。そしてリデューサとコンテクストを組み合わせることで、複雑な画面の state 管理ができるようになります。
88

99
</Intro>
1010

1111
<YouWillLearn>
1212

13-
* How to combine a reducer with context
14-
* How to avoid passing state and dispatch through props
15-
* How to keep context and state logic in a separate file
13+
* リデューサとコンテクストを組み合わせる方法
14+
* state とディスパッチ関数を props を介して渡すことを避ける方法
15+
* コンテクストと state ロジックを別のファイルに保持する方法
1616

1717
</YouWillLearn>
1818

19-
## Combining a reducer with context {/*combining-a-reducer-with-context*/}
19+
## リデューサとコンテクストの組み合わせ {/*combining-a-reducer-with-context*/}
2020

21-
In this example from [the introduction to reducers](/learn/extracting-state-logic-into-a-reducer), the state is managed by a reducer. The reducer function contains all of the state update logic and is declared at the bottom of this file:
21+
[リデューサの導入記事](/learn/extracting-state-logic-into-a-reducer)で紹介した以下の例では、state はリデューサによって管理されています。リデューサ関数はファイルの下部で宣言されており、そこに state の更新ロジックがすべて含まれています。
2222

2323
<Sandpack>
2424

@@ -207,9 +207,9 @@ ul, li { margin: 0; padding: 0; }
207207

208208
</Sandpack>
209209

210-
A reducer helps keep the event handlers short and concise. However, as your app grows, you might run into another difficulty. **Currently, the `tasks` state and the `dispatch` function are only available in the top-level `TaskApp` component.** To let other components read the list of tasks or change it, you have to explicitly [pass down](/learn/passing-props-to-a-component) the current state and the event handlers that change it as props.
210+
リデューサを使うことで、イベントハンドラを短く簡潔に保てます。しかしアプリが大きくなるにつれ、別の困難が発生することがあります。**現在 `tasks` state `dispatch` 関数は、トップレベルの `TaskApp` コンポーネントでしか使えません**。他のコンポーネントがタスクリストの読み込みや変更をできるようにするには、現在の state や変更用のイベントハンドラを props として明示的に[下に渡していく](/learn/passing-props-to-a-component)必要があります。
211211

212-
For example, `TaskApp` passes a list of tasks and the event handlers to `TaskList`:
212+
例えば `TaskApp` はタスクリストとイベントハンドラを `TaskList` に渡していますし:
213213

214214
```js
215215
<TaskList
@@ -219,7 +219,7 @@ For example, `TaskApp` passes a list of tasks and the event handlers to `TaskLis
219219
/>
220220
```
221221

222-
And `TaskList` passes the event handlers to `Task`:
222+
`TaskList` もイベントハンドラを `Task` に渡しています:
223223

224224
```js
225225
<Task
@@ -229,30 +229,30 @@ And `TaskList` passes the event handlers to `Task`:
229229
/>
230230
```
231231

232-
In a small example like this, this works well, but if you have tens or hundreds of components in the middle, passing down all state and functions can be quite frustrating!
232+
このような小さなサンプルではこれはうまく機能しますが、間に数十、数百といったコンポーネントがある場合、すべての state や関数をこのように渡していくのは非常に面倒です!
233233

234-
This is why, as an alternative to passing them through props, you might want to put both the `tasks` state and the `dispatch` function [into context.](/learn/passing-data-deeply-with-context) **This way, any component below `TaskApp` in the tree can read the tasks and dispatch actions without the repetitive "prop drilling".**
234+
というわけで、`tasks` state `dispatch` 関数は、props 経由で渡すのではなく、[コンテクストに入れる](/learn/passing-data-deeply-with-context)方が望ましい場合があります。**こうすることで `TaskApp` ツリーの下部にある任意のコンポーネントが、"props の穴掘り作業 (prop drilling)" を繰り返さずともタスクのリストを読み取り、アクションをディスパッチすることができるようになります**
235235

236-
Here is how you can combine a reducer with context:
236+
以下がリデューサをコンテクストと組み合わせる方法です。
237237

238-
1. **Create** the context.
239-
2. **Put** state and dispatch into context.
240-
3. **Use** context anywhere in the tree.
238+
1. コンテクストを**作成する**
239+
2. state dispatch をコンテクストに**入れる**
240+
3. ツリー内の任意の場所でコンテクストを**使用する**
241241

242-
### Step 1: Create the context {/*step-1-create-the-context*/}
242+
### ステップ 1:コンテクストを作成する {/*step-1-create-the-context*/}
243243

244-
The `useReducer` Hook returns the current `tasks` and the `dispatch` function that lets you update them:
244+
`useReducer` フックは、現在の `tasks` と、それを更新するための `dispatch` 関数を返します。
245245

246246
```js
247247
const [tasks, dispatch] = useReducer(tasksReducer, initialTasks);
248248
```
249249

250-
To pass them down the tree, you will [create](/learn/passing-data-deeply-with-context#step-2-use-the-context) two separate contexts:
250+
これらをツリーに渡すために、2 つの異なる[コンテクストを作成](/learn/passing-data-deeply-with-context#step-2-use-the-context)しましょう。
251251

252-
- `TasksContext` provides the current list of tasks.
253-
- `TasksDispatchContext` provides the function that lets components dispatch actions.
252+
- `TasksContext` は、現在のタスクのリストを提供 (provide) する。
253+
- `TasksDispatchContext` は、コンポーネントがアクションをディスパッチするための関数を提供する。
254254

255-
Export them from a separate file so that you can later import them from other files:
255+
別のファイルを作ってエクスポートすることで、これらを他のファイルからインポートできるようにします。
256256

257257
<Sandpack>
258258

@@ -448,11 +448,11 @@ ul, li { margin: 0; padding: 0; }
448448

449449
</Sandpack>
450450

451-
Here, you're passing `null` as the default value to both contexts. The actual values will be provided by the `TaskApp` component.
451+
ここでは、両方のコンテクストにデフォルト値として `null` を渡しています。実際の値は `TaskApp` コンポーネントが提供します。
452452

453-
### Step 2: Put state and dispatch into context {/*step-2-put-state-and-dispatch-into-context*/}
453+
### ステップ 2:state dispatch をコンテクストに入れる {/*step-2-put-state-and-dispatch-into-context*/}
454454

455-
Now you can import both contexts in your `TaskApp` component. Take the `tasks` and `dispatch` returned by `useReducer()` and [provide them](/learn/passing-data-deeply-with-context#step-3-provide-the-context) to the entire tree below:
455+
`TaskApp` コンポーネントで両方のコンテクストをインポートできます。`useReducer()` の返り値として `tasks` `dispatch` を取得し、それらを下位のツリー全体に[提供します](/learn/passing-data-deeply-with-context#step-3-provide-the-context)
456456

457457
```js {4,7-8}
458458
import { TasksContext, TasksDispatchContext } from './TasksContext.js';
@@ -470,7 +470,7 @@ export default function TaskApp() {
470470
}
471471
```
472472

473-
For now, you pass the information both via props and in context:
473+
今のところ、プロパティ経由とコンテクスト経由の両方で情報を渡しています。
474474

475475
<Sandpack>
476476

@@ -669,11 +669,11 @@ ul, li { margin: 0; padding: 0; }
669669

670670
</Sandpack>
671671

672-
In the next step, you will remove prop passing.
672+
次のステップで、props による受け渡しを削除します。
673673

674-
### Step 3: Use context anywhere in the tree {/*step-3-use-context-anywhere-in-the-tree*/}
674+
### ステップ 3:ツリー内の任意の場所でコンテクストを使う {/*step-3-use-context-anywhere-in-the-tree*/}
675675

676-
Now you don't need to pass the list of tasks or the event handlers down the tree:
676+
現在すでに、タスクのリストやイベントハンドラを props 経由でツリーに渡す必要はなくなっています。
677677

678678
```js {4-5}
679679
<TasksContext.Provider value={tasks}>
@@ -685,15 +685,15 @@ Now you don't need to pass the list of tasks or the event handlers down the tree
685685
</TasksContext.Provider>
686686
```
687687

688-
Instead, any component that needs the task list can read it from the `TaskContext`:
688+
タスクのリストを必要とするコンポーネントは、代わりに `TaskContext` から読み込むことができます。
689689

690690
```js {2}
691691
export default function TaskList() {
692692
const tasks = useContext(TasksContext);
693693
// ...
694694
```
695695
696-
To update the task list, any component can read the `dispatch` function from context and call it:
696+
タスクリストを更新したい場合は、任意のコンポーネントがコンテクストから `dispatch` 関数を読み取り、それを呼び出します。
697697
698698
```js {3,9-13}
699699
export default function AddTask() {
@@ -713,7 +713,7 @@ export default function AddTask() {
713713
// ...
714714
```
715715
716-
**The `TaskApp` component does not pass any event handlers down, and the `TaskList` does not pass any event handlers to the `Task` component either.** Each component reads the context that it needs:
716+
**`TaskApp` コンポーネントはイベントハンドラを一切下に渡しておらず、`TaskList` `Task` コンポーネントに一切イベントハンドラを渡していません**。各コンポーネントが必要なコンテクストを読み込みます。
717717
718718
<Sandpack>
719719
@@ -897,11 +897,11 @@ ul, li { margin: 0; padding: 0; }
897897
898898
</Sandpack>
899899
900-
**The state still "lives" in the top-level `TaskApp` component, managed with `useReducer`.** But its `tasks` and `dispatch` are now available to every component below in the tree by importing and using these contexts.
900+
**state は引き続きトップレベルの `TaskApp` コンポーネントに「存在」しており、`useReducer` で管理されています**。しかし今や、`tasks` `dispatch` は、コンテクストをインポートして使うという形で、下位のツリー全体で利用可能になっているのです。
901901
902-
## Moving all wiring into a single file {/*moving-all-wiring-into-a-single-file*/}
902+
## すべての繋ぎ込みコードを 1 つのファイルに移動 {/*moving-all-wiring-into-a-single-file*/}
903903
904-
You don't have to do this, but you could further declutter the components by moving both reducer and context into a single file. Currently, `TasksContext.js` contains only two context declarations:
904+
必ずしも必要な作業ではありませんが、リデューサとコンテクストの両方を 1 つのファイルに移動することで、コンポーネントをさらに整理することもできます。現在 `TasksContext.js` には 2 つのコンテクスト宣言のみが含まれています。
905905
906906
```js
907907
import { createContext } from 'react';
@@ -910,11 +910,11 @@ export const TasksContext = createContext(null);
910910
export const TasksDispatchContext = createContext(null);
911911
```
912912
913-
This file is about to get crowded! You'll move the reducer into that same file. Then you'll declare a new `TasksProvider` component in the same file. This component will tie all the pieces together:
913+
このファイルの中身を増やしていきましょう! リデューサを同じファイルに移動します。次に、同ファイルで新しく `TasksProvider` というコンポーネントを宣言します。このコンポーネントは、すべての要素を繋ぎ合わせるためのものです。
914914
915-
1. It will manage the state with a reducer.
916-
2. It will provide both contexts to components below.
917-
3. It will [take `children` as a prop](/learn/passing-props-to-a-component#passing-jsx-as-children) so you can pass JSX to it.
915+
1. リデューサを使って state を管理する。
916+
2. 下位のコンポーネントに両方のコンテクストを提供する。
917+
3. JSX を渡すことができるように、[`children` prop として受け取る](/learn/passing-props-to-a-component#passing-jsx-as-children)ようにする。
918918
919919
```js
920920
export function TasksProvider({ children }) {
@@ -930,7 +930,7 @@ export function TasksProvider({ children }) {
930930
}
931931
```
932932
933-
**This removes all the complexity and wiring from your `TaskApp` component:**
933+
**これにより `TaskApp` コンポーネントから、あらゆる複雑性と繋ぎ込みコードが消え去ります**。
934934
935935
<Sandpack>
936936
@@ -1121,7 +1121,7 @@ ul, li { margin: 0; padding: 0; }
11211121
11221122
</Sandpack>
11231123
1124-
You can also export functions that _use_ the context from `TasksContext.js`:
1124+
さらに、`TasksContext.js` から、コンテクストを*使用する*ための以下のような関数をエクスポートすることもできます。
11251125
11261126
```js
11271127
export function useTasks() {
@@ -1133,14 +1133,14 @@ export function useTasksDispatch() {
11331133
}
11341134
```
11351135
1136-
When a component needs to read context, it can do it through these functions:
1136+
コンポーネントがコンテクストを読む必要がある場合、これらの関数を使うことができます。
11371137
11381138
```js
11391139
const tasks = useTasks();
11401140
const dispatch = useTasksDispatch();
11411141
```
11421142
1143-
This doesn't change the behavior in any way, but it lets you later split these contexts further or add some logic to these functions. **Now all of the context and reducer wiring is in `TasksContext.js`. This keeps the components clean and uncluttered, focused on what they display rather than where they get the data:**
1143+
動作は何ら変わりませんが、後でこれらのコンテクストをさらに分割したり、これらの関数にいくつかのロジックを追加したりすることができます。**これで、すべてのコンテクストやリデューサの繋ぎ込みコードが `TasksContext.js` にあることになります。これにより、コンポーネントはクリーンで整頓された状態に保たれ、どこからデータを取得するのかではなく何を表示するのかに集中できるようになります**。
11441144
11451145
<Sandpack>
11461146
@@ -1340,27 +1340,27 @@ ul, li { margin: 0; padding: 0; }
13401340
13411341
</Sandpack>
13421342
1343-
You can think of `TasksProvider` as a part of the screen that knows how to deal with tasks, `useTasks` as a way to read them, and `useTasksDispatch` as a way to update them from any component below in the tree.
1343+
`TasksProvider` はタスクの処理方法を知っている画面要素の一部であり、`useTasks` はツリー内の任意のコンポーネントからタスクを読み出す方法であり、`useTasksDispatch` はそれを更新する方法である、というように考えることができます。
13441344
13451345
<Note>
13461346
1347-
Functions like `useTasks` and `useTasksDispatch` are called *[Custom Hooks.](/learn/reusing-logic-with-custom-hooks)* Your function is considered a custom Hook if its name starts with `use`. This lets you use other Hooks, like `useContext`, inside it.
1347+
`useTasks` `useTasksDispatch` のような関数は、[*カスタムフック*](/learn/reusing-logic-with-custom-hooks)と呼ばれます。関数名が `use` で始まる場合、その関数はカスタムフックと見なされます。これにより `useContext` のような他のフックを内部で使用できます。
13481348
13491349
</Note>
13501350
1351-
As your app grows, you may have many context-reducer pairs like this. This is a powerful way to scale your app and [lift state up](/learn/sharing-state-between-components) without too much work whenever you want to access the data deep in the tree.
1351+
アプリが成長するにつれ、このようなコンテクストとリデューサのペアをたくさん作ることになるかもしれません。この強力な手法により、ツリーの深くでデータにアクセスしたい場合でも、あまり手間をかけずにアプリをスケールさせ、[state をリフトアップ](/learn/sharing-state-between-components)することが可能です。
13521352
13531353
<Recap>
13541354
1355-
- You can combine reducer with context to let any component read and update state above it.
1356-
- To provide state and the dispatch function to components below:
1357-
1. Create two contexts (for state and for dispatch functions).
1358-
2. Provide both contexts from the component that uses the reducer.
1359-
3. Use either context from components that need to read them.
1360-
- You can further declutter the components by moving all wiring into one file.
1361-
- You can export a component like `TasksProvider` that provides context.
1362-
- You can also export custom Hooks like `useTasks` and `useTasksDispatch` to read it.
1363-
- You can have many context-reducer pairs like this in your app.
1355+
- リデューサとコンテクストを組み合わせることで、任意のコンポーネントが上位の state を読み取り、更新できるようになる。
1356+
- 下位のコンポーネントに state とディスパッチ関数を提供するには以下の手順に従う。
1357+
1. state 用とディスパッチ関数用の 2 つのコンテクストを作成する。
1358+
2. リデューサを使うコンポーネントから両方のコンテクストを提供する。
1359+
3. それらを読む必要があるコンポーネントからコンテクストを使用する。
1360+
- すべての繋ぎ込みコードを 1 つのファイルに移動することで、コンポーネントをさらに整理することができる。
1361+
- コンテクストを提供する `TasksProvider` のようなコンポーネントをエクスポートする。
1362+
- コンテクストから情報を読むためのカスタムフックである `useTasks` `useTasksDispatch` をエクスポートすることもできる。
1363+
- アプリ内で、このようなコンテクストとリデューサのペアを多く作ることができる。
13641364
13651365
</Recap>
13661366

src/sidebarLearn.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@
150150
"path": "/learn/passing-data-deeply-with-context"
151151
},
152152
{
153-
"title": "Scaling Up with Reducer and Context",
153+
"title": "リデューサとコンテクストでスケールアップ",
154154
"path": "/learn/scaling-up-with-reducer-and-context"
155155
}
156156
]

0 commit comments

Comments
 (0)