2015-12-15 22 views
0

更新正确嵌套数据这是我现在的目标,我需要更新:如何Redux的

[ 
    { id: q1, 
     answers:[ 
       { id: a1, 
        answered: false 
       }, 
       ... 
       ] 
    }, 
    ... 
] 

我无法弄清楚如何更新此对象,例如回答= true设置。 有没有更好的方法来保存这种对象?我尝试使用React的update插件,但无法正常工作。

回答

1

您可以更新的答案列出这样,在你的减速机:

function update(state, action) { 
    // assuming you are passing an id of the item to be updated via action.itemId 
    let obj = state.whatever_list.filter(item => item.id === action.itemId)[0] 

    //assuming you are passing an id of the answer to be updated via action.answerId 
    //also, assuming action.payload contains {answered: true} 
    let answers = obj.answers.map(answer => answer.id === action.answerId ? 
              Object.assign({}, answer, action.payload) : answer) 
    obj = Object.assign({}, obj, {answers: answers}) 
    return { 
     whatever_list: state.whatever_list.map(item => item.id == action.itemId? Object.assign({}, item, obj) : item) 
    } 
} 

这里是你的行动可能是什么样子:

function updateAnswer(itemId, answerId, payload) { 
    return { 
     type: UPDATE_ANSWER, 
     itemId: itemId, 
     answerId: answerId, 
     payload: payload 
    } 
} 

在您的反应组件类中,假设有一个事件处理程序用于监视是否回答问题:

export default class Whatever extends React.Component { 

    ... 

    // assuming your props contains itemId and answerId 
    handleAnswered = (e) => { 
     this.props.dispatch(updateAnswer(this.props.itemId, this.props.answerId, {answered: true})) 
    } 

    ... 
} 

所以基本上会发生什么情况是这样的:

  1. 你的事件处理程序调用动作和更新的数据传递给它
  2. 当你的动作被调用,其与类型一起返回更新数据参数
  3. 当您的减速器看到类型参数时,将触发相应的处理程序(上述第一段代码)
  4. 减速器将从列表中提取现有数据,用新数据替换旧数据,然后返回一个包含新数据
+0

Perfekt,谢谢! –

0

您可以使用dot-prop-immutable和更新将是简单的列表:

return dotProp.set(state, 'quiz.0.answers.0.answered', true);