2016-11-07 23 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