2016-11-07 58 views
0

例Redux的树接触亚当朋友组:终极版:在第一减速器添加值,然后将新创建的值传递给第二减速

{ 
    groups: { 
     1: { 
      name: "Friends" 
      contacts: [1] 
     } 
    } 
    contacts: { 
     1: { 
      name: "Adam" 
     } 
    } 
} 

现在我想创建在朋友组,结果一个新的联系人会是这样的:

{ 
    groups: { 
     1: { 
      name: "Friends" 
      contacts: [1, 2] 
     } 
    } 
    contacts: { 
     1: { 
      name: "Adam" 
     }, 
     2: { 
      name: "Bethany" 
     } 
    } 
} 

目前我正在创建新的联系人ID,然后对两个reducer运行redux操作。然而,这感觉真的很混乱,有没有更好的方式去做到这一点?我当前的代码是下面:

contact.js

import { connect } from 'react-redux'; 

function Contact({ createContact, groupId, newContactId }) { 
    function onContactCreate(name) { 
     createContact(newContactId, groupId, name); 
    } 
    // ... 
} 

const mapStateToProps = (state) => { 
    return { 
     newContactId: state.get('contacts').size + 1 
    }; 
}; 

export function mapDispatchToProps(dispatch) { 
    return { 
     createContact: (newContactId, groupId, name) => dispatch({ 
      type: 'CREATE_CONTACT', 
      newContactId, 
      groupId, 
      name 
     }) 
    }; 
} 

export default connect(mapStateToProps, mapDispatchToProps)(Contact); 

接触reducer.js

import { fromJS } from 'immutable'; 

const initialState = fromJS({}); 

function contactReducer(state = initialState, action) { 
    switch (action.type) { 
     case 'CREATE_CONTACT': { 
      return state 
       .set(action.id, fromJS({ 
        name: action.name 
       })); 
     } 
     default: 
      return state; 
    } 
} 

export default contactReducer; 

基reducer.js

import { fromJS } from 'immutable'; 

const initialState = fromJS({}); 

function groupReducer(state = initialState, action) { 
    switch (action.type) { 
     case 'CREATE_CONTACT': { 
      let id = action.groupId; 
      return state 
       .updateIn([id, 'contacts'], (contacts) => contacts.push(action.id)); 
     } 
     default: 
      return state; 
    } 
} 

export default groupReducer; 

回答

2

在发送操作之前,确实必须创建ID。该ID不应该依赖于当前状态。如果您使用时间旅行或Redux Dev工具编辑历史记录,则相同的操作可能会创建具有不同ID的项目。这将导致后续操作使用不正确的ID。

通常,对象的身份应该绑定到对象,而不是单独创建。

+0

所以我现在这样做的方式是“好”? – joshhunt

+0

是的,你在做的事似乎对我很好。 – DDS

+0

你是否能够进一步解释这一点“一般来说,对象的身份应该绑定到对象而不是单独创建。”?我真的不明白这意味着什么。 – joshhunt