2016-03-07 35 views
0

我目前正在学习Redux,并且遇到了麻烦,我的问题是为什么你需要在没有它们的情况下应用程序工作的操作?他们添加了什么?在Redux中,使用actionCreators有什么好处?

import { createStore } from 'redux' 

// ACTIONS 
const addTodo = (text) => { 
    type: 'ADD_TODO', 
    text 
} 

const toggleTodo = (id) => { 
    type: 'TOGGLE_TODO', 
    id 
} 

// REDUCER 
const todos = (state = [], action) => { 
    switch(action.type) { 
    case 'ADD_TODO': 
     return [ 
     ...state, 
     { 
      id: state.length, 
      text: action.text, 
      complete: false 
     } 
     ] 
    default: 
     return state 
    } 
} 

// STORE 
const store = createStore(todos) 

// TEST 
store.dispatch({ type: 'ADD_TODO', text: 'Test' }) 
console.log(store.getState()) 
+0

您可以在反应组件和商店之间看到_“glue”_动作。 –

+0

你是指动作创造者吗?正如你为什么需要addTodo当讯({类型:“Add_TODO”,文本:“测试”})的作品? –

回答

2

首先,不要ActionCreators操作之间感到困惑,他们是不同的东西。

操作只是用type财产(和其他任何你想添加)对象。

ActionCreators根据提供的逻辑和数据构建动作。 例如,假设一个动作“更新联系人”,那么行动的创建者可能会被建为异步流一个thunk,它会调度网络请求API更新联系人,一旦知道API调用的工作,它调度动作,这可能是这样的:

{ 
    type: "UPDATE_CONTACT", 
    data: { prop: "newValue" } 
} 

使用常量这是更大的代码库进行维护/调试方便。通过使用常量,您的环境将更快地标记拼写错误的操作,因为常量不存在。就像纯粹依赖于对象文字或字符串一样,调试可能会更复杂。

为什么用行动创造者

ActionCreators用于两个主要目的:

便携&可测性as per the redux docs

我还发现他们的动态构建最终的行动数据非常有用。按我上面的例子中,在那里你会张贴接触的情况下,服务器通常会与Location头回应,给你接触,你将需要为未来的新位置(和可能ID)GET或PUT请求。使用actionCreator,我可以将这些新数据绑定到最终操作对象中,然后看起来像这样:

{ 
    type: "CREATE_CONTACT", 
    data: { 
    first_name: "bob", 
    last_name: "builder" 
    id: 7   // -> provided by API, the actionCreator injected it 
    } 
} 
+0

我指的是动作创作者。 –

+0

编辑答案提供有关actionCreators的更多信息 –