immutable.js confused when use get() method

97 Views Asked by At

I'm using the immutable.js and redux in project, and I found an quite strange issue.

here is the code used in selector:

{
  dealDetail   : dealDetails.get(id.toString()).toJS(),
  dealTrackLog : dealTrackLogs.get(id).toJS()
}

First, the id is Number, in detail, I must pass string of id, and in trackLogs, on the contrary, it must be Number, otherwise will cause error, "cannot read property toJS() of undefined"

and I think the problem maybe in reducer, here is the code:

// dealDetailReducer
// const initialStateOfDealDetail = fromJS({})
let details = {}
action.data.details.map((detail) => {
  details[detail.id] = detail
})
return state.merge(fromJS(details))

 ...

// dealTrackLogsReducer
// initialStateOfDealTrackLogs = fromJS({})
if (state.get(action.data.id)) {
  // has id in state, update
  return state.withMutations(s =>
    s.update(
      action.data.id, 
      trackLog => trackLog.merge(fromJS(action.data.trackLogs))
     ) 
   )
}
// no id in state, just set, id : data 
return state.set(action.data.id, fromJS(action.data)

so, I'm hard to understand why and when to pass a Number/String ?

1

There are 1 best solutions below

0
On

First line

 let details = {}

You are using regular object for details state. Objects coerce to string keys. The second case you are using immutablejs operation that preserve the key type.