2017-07-06 67 views
1

我很困惑,因为我在这里不返回状态,只有action.payload(代码片段):这个减速器是否符合Redux规则?

case HISTORY_SELECTED: 
    return action.payload; 

所有这些减速代码:

import { HISTORY_SELECTED } from '../actions/index'; 

export default function (state = null, action) { 
    switch (action.type) { 
    case HISTORY_SELECTED: 
     return action.payload; 
    default: 
     return state; 
    } 
} 

编辑:添加3更多的情况下。

如果我以正确的方式理解答案,那么案例2,案例3和案例4都可以,是吗?

CASE 2(reducer_note_selected.js)

import { NOTE_SELECTED, DEL_NOTE_SUCCESS } from '../actions/actions'; 

export default function (state = null, action) { 
    switch (action.type) { 
    case NOTE_SELECTED: 
     return action.payload; 
    case DEL_NOTE_SUCCESS: 
     return null; 
    default: 
     return state; 
    } 
} 

CASE 3(reducer_notes_status_fetch.js - 我在这里只返回字符串)

import { 
FETCH_ALL_NOTES_STARTED, 
FETCH_ALL_NOTES_ERROR, 
FETCH_ALL_NOTES_SUCCESS 
} from '../actions/actions'; 

    export default function (state = {}, action) { 
     switch (action.type) { 
     case FETCH_ALL_NOTES_STARTED: 
      return 'fetching_started'; 
     case FETCH_ALL_NOTES_ERROR: 
      return 'error'; 
     case FETCH_ALL_NOTES_SUCCESS: 
      return 'fetch_all_notes_success'; 
     default: 
      return state; 
     } 
    } 

CASE 4(reducer_notes_general .js)

import _ from 'lodash'; 
import { FETCH_ALL_NOTES_SUCCESS, DEL_NOTE_SUCCESS } from '../actions/actions'; 

export default function (state = {}, action) { 
    switch (action.type) { 
    case FETCH_ALL_NOTES_SUCCESS: 
     return _.mapKeys(action.payload.data, '_id'); 
    case DEL_NOTE_SUCCESS: 
     return _.omit(state, action.payload); 
    default: 
     return state; 
    } 
} 
+2

是的,但“下一个状态”可以简单地是来自操作的数据。 – markerikson

+0

所以我可以像我一样做吗?或者它又是规则?我非常困惑我到底能在减速器中返回什么。 –

+0

是的,你可以,根据我的答案。减速器返回的“新状态”可以基于旧状态,基于行动的数据,甚至可以从头开始计算。 – markerikson

回答

3

是的,这个减速器在概念上是绝对好的。这仅仅意味着你想用action.payload的内容替换现有的状态。这里有一个类似的例子来说明这个原则:

function todosReducer(todos = [], action) { 
    switch(action.type) { 
     case LOAD_TODOS: { 
      return action.payload.loadedTodos;    
     } 
     default: return state; 
    } 
} 

因此,在这种情况下,“新状态”的减速器返回从动作中的数据,而不是这是基于计算出的东西旧州。

唯一需要注意的是,如果您的动作创建者从Redux状态中抓取了一个现有值并将其包含在动作中,那么您可能不会实际改变任何动作。我帮助调试了像a recent SO question about a reducer "updating while just returning state"那样的问题。

+0

非常感谢您的回答!所以我可以做那样的事情?这也可以,我说得对吗? **将此代码移至主要问题** –

3

我不同意@hindmost,你用你的有效载荷值替换状态。这就是反应 - 还原链的工作原理。希望这会为你解决问题。

  • 反应 - 有人点击一个按钮(任何事件),生病发送到 行动。
  • 行动 - 明白了。我会派遣的行动,使减速机可以 更新状态
  • 减速机 - 我得到了目前的状态和新的行动。我做一个新的 状态的副本,并将其传递

  • 存储 - 我看到reducer更新状态。虐待确保所有 连接组件都知道更改

  • React-Redux - 获得新数据。虐待确定我是否应该更新 对这些变化作出反应。如果没有必要,我不想更新UI 。

  • 反应 - 从商店中获得我的道具中的新数据。Ill更新 UI以反映更改。