Redux Basics (1): Actions 翻訳

# **はじめに**
- [Redux Basics (1): Actions 翻訳](http://qiita.com/uramonk/items/28316e20ad6fb7968993)
- [Redux Basics (2): Reducers 翻訳](http://qiita.com/uramonk/items/3bce34db8cfd0587a63b)
- [Redux Basics (3): Store 翻訳](http://qiita.com/uramonk/items/a6cfa3fa7f7c6827c2b1)
- [Redux Basics (4): Data Flow 翻訳](http://qiita.com/uramonk/items/2e8d89ba0829fe657025)
- [Redux Basics (5): Usage with React 翻訳](http://qiita.com/uramonk/items/b4712620690711466b07)

Reduxの勉強のため、公式サイトのBasicsのActionsを翻訳します。翻訳で間違いがあると思いますがそこはご了承ください。
翻訳は下記ページの10/31時点のものとなります。
http://redux.js.org/docs/basics/
http://redux.js.org/docs/basics/Actions.html

_翻訳ここから_

# **Basics**
reducerやミドルウェア、storeの増強構造について話す幻想に惑わされないでください。Reduxは信じられないほどシンプルです。もしあなたがこれまでにFluxアプリケーションを構築したことがあるならば、あなたは完全に熟知しているでしょう。もしFluxになじみがなければ、これは非常に簡単です！

このガイドでは、シンプルなToDoリストの構築の過程を通って歩きます。

- [Actions](http://redux.js.org/docs/basics/Actions.html)
- [Reducers](http://redux.js.org/docs/basics/Reducers.html)
- [Store](http://redux.js.org/docs/basics/Store.html)
- [Data Flow](http://redux.js.org/docs/basics/DataFlow.html)
- [Usage with React](http://redux.js.org/docs/basics/UsageWithReact.html)
- [Example: Todo List](http://redux.js.org/docs/basics/ExampleTodoList.html)

# **Actions**
最初に、いくつかのActionを定義しましょう。

**Action**は、あなたのアプリケーションからstoreデータを送信する情報のペイロードです。これらはただのstoreのための情報のソースです。`store.dispatch()`を使うことでstoreにそれらを送信します。

```js
const ADD_TODO = 'ADD_TODO'
```

```js
{
  type: ADD_TODO,
  text: 'Build my first Redux app'
}
```

Actionは単純なJavaScriptのオブジェクトです。Actionは行われる行動の種類を示す`type`プロパティを持たなければなりません。種類は一般的にstringの定数で定義されるべきです。あなたのアプリが一旦大きくなると、分割されたモジュールの中へそれらを移動したいでしょう。

```js
import { ADD_TODO, REMOVE_TODO } from '../actionTypes'
```

> **注記**
> 分割したファイルのなかでAction Typeの定数を定義してはなりませんし、定義さえしてはなりません。小さなプロジェクトでは、Action Typeのために文字列リテラルをただ使うのは簡単です。しかしながら、大きなコードベースの中ではっきりと定数を宣言することはくらかの恩恵があります。あなたのコードベースをきれいに保ちつづけるために、より多くの実践的なtipsを[Reducing Boilerplate](http://redux.js.org/docs/recipes/ReducingBoilerplate.html)で読んでください。

`type`以外に、Actionオブジェクトの構造は本当にあなた次第です。もし興味があれば、どのよにActionが構築されるかのおすすめとして[Flux Standard Action](https://github.com/acdlite/flux-standard-action)をチェックしてください。

我々は完了したとしてTodoにユーザーの印をつけるのを表すために一つのAction Typeを追加します。我々は`index`によって特定のTodoを参照します、なぜなら我々は配列にそれらを保存しているからです。実際のアプリでは、何か新しいものが作られたときいつでもユニークなIDを生成するのが賢明です。

```js
{
  type: TOGGLE_TODO,
  index: 5
}
```

できるだけ各Ationで小さなデータになるように渡すのは良いアイデアです。例えば、全てのTodoオブジェクトよりも`index`を渡すのが良いです。

最後に、我々は現在の見えているTodoを変えるための一つのAction Typeを追加します。

```js
{
  type: SET_VISIBILITY_FILTER,
  filter: SHOW_COMPLETED
}
```

# **Action Creators**
**Action creators**はこの通り、Actionを作成する関数です。"action"と"action creator"の用語を混ぜ合わせるのは簡単ですが、適切な用語を使うのがあなたにはベストです。

ReduxのAction Creatorはただ単にActionを返します:

```js
function addTodo(text) {
  return {
    type: ADD_TODO,
    text
  }
}
```

これはテストするのに継続可能で簡単にします。

[伝統的なFlux](http://facebook.github.io/flux)では、Action Creatorはしばしば起動されたときにdispatchの引き金となります。

```js
function addTodoWithDispatch(text) {
  const action = {
    type: ADD_TODO,
    text
  }
  dispatch(action)
}
```

Reduxではこの場合はありません。

代わりに、実際にdispatchを開始するために、`dispatch()`関数へ結果を渡します:

```js
dispatch(addTodo(text))
dispatch(completeTodo(index))
```

あるいは、あなたは自動的にdispatchする**結合されたAction Creator**を作ることもできます。

```js
const boundAddTodo = (text) => dispatch(addTodo(text))
const boundCompleteTodo = (index) => dispatch(completeTodo(index))
```

それらを直接呼び出すことができます。

```js
boundAddTodo(text)
boundCompleteTodo(index)
```

`dispatch()`関数は`store.dispatch()`でstoreから直接アクセスされますが、react-reduxの`connect()`のようなヘルパーを使うことでアクセスする可能性が高いです。あなたは`dispatch()`関数へ多くのAction Creatorを自動的に結びつけるために`bindActionCreators()`を使うことができます。

Action Creatorはまた非同期で副作用を持つこともできます。あなたは、どのようにAJAXの応答を取扱い、非同期な制御の流れへAction Creatorを構成するかを学ぶために、[advanced tutorial](http://redux.js.org/docs/advanced/)のなかで[async actions](http://redux.js.org/docs/advanced/AsyncActions.html)を読むことができます。発展的なチュートリアルと非同期Actionのために不可欠である重要なコンセプトをカバーする基礎のチュートリアルが終わっていないのでasync actionsへ前へスキップしないでください。

# **ソースコード**

### **```actions.js```**

```js
/*
 * action types
 */

export const ADD_TODO = 'ADD_TODO'
export const TOGGLE_TODO = 'TOGGLE_TODO'
export const SET_VISIBILITY_FILTER = 'SET_VISIBILITY_FILTER'

/*
 * other constants
 */

export const VisibilityFilters = {
  SHOW_ALL: 'SHOW_ALL',
  SHOW_COMPLETED: 'SHOW_COMPLETED',
  SHOW_ACTIVE: 'SHOW_ACTIVE'
}

/*
 * action creators
 */

export function addTodo(text) {
  return { type: ADD_TODO, text }
}

export function toggleTodo(index) {
  return { type: TOGGLE_TODO, index }
}

export function setVisibilityFilter(filter) {
  return { type: SET_VISIBILITY_FILTER, filter }
}
```

# **次のステップ**
あなたがこれらのActionを送るときに、どのようにstateが更新されるかを特定するために[いくつかのReducerを定義](http://redux.js.org/docs/basics/Reducers.html)しましょう。

_翻訳ここまで_

# **おわりに**
要約すると下記のとおりかと思います。

- Action
 - Actionは行動の種類をもつ単純なJavaScriptオブジェクト
 - Stringで定義されるtypeプロパティを必ず持つ
- Action Creator
 - Actionを作成する関数
 - Fluxではdispatch()を実行するがReduxでは実行しない

次は、[Redux Basics (2): Reducers 翻訳](http://qiita.com/uramonk/items/3bce34db8cfd0587a63b)です。