## action
定義:
Action 是把數據從應用(譯者注:這里之所以不叫 view 是因為這些數據有可能是服務器響應,用戶輸入或其它非 view 的數據 )傳到 `store` 的有效載荷。它是 `store` 數據的唯一來源。一般來說你會通過 `store.dispatch()` 將 `action` 傳到 `store`。
添加新的todo任務的`action`是這樣的:
~~~
// 動作的常量名字
const ADD_TODO = 'ADD_TODO'
// 一個Action 對象
{
type: ADD_TODO, // 對應常量名字
text: 'Build my first Redux App' // 除了 type 字段外,action 對象的結構完全由你自己決定。
}
~~~
上面是一個Action對象,描述動作的對象,還有一個概念叫Action創建函數,兩者不同,別混淆。
先來寫`action`創建函數。通過`action`創建函數,就可以創建一個`action`~
`src/redux/actions/counter.js`
~~~
/* action */
export const INCREMENT = "counter/INCREMENT" // 只要保證reducer判斷和這里定義的保持一致就可以。
export const DECREMENT = "counter/DECREMENT" // 這里可以隨便定義。
export const RESET = "counter/RESET" // 例如 a / b / c
export const ADD_TODO = "ADD_TODO"
export function increment() {
// 創建一個Action(下同),除了 type 字段外,action 對象的結構完全由你自己決定。
return { type: INCREMENT }
}
export function decrement() {
return { type: DECREMENT }
}
export function reset() {
return { type: RESET }
}
export function addTodo(text) {
return {
type: ADD_TODO,
text
}
}
~~~
通常在[傳統的 Flux](http://facebook.github.io/flux)開發中,在調用`action`創建函數時,需要手動觸發一個`dispatch`,像這樣:
~~~
function addTodoWithDispatch(text) {
const action = {
type: ADD_TODO,
text
}
dispatch(action)
}
~~~
不同的是,Redux 中只需把 `action` 創建函數返回的`action`對象傳給 `dispatch()` 方法即可發起一次 `dispatch` 過程:
~~~
dispatch(increment())
dispatch(addTodo(text))
~~~
或者創建一個 被綁定的 action 創建函數 來自動 dispatch:
~~~
const boundIncrement = () => dispatch(increment())
const boundAddTodo = text => dispatch(addTodo(text))
// 然后需要調用它們:
boundIncrement()
boundAddTodo(text)
~~~