I'm a newbie in redux and es6 syntax. I make my app with official redux tutorial, and with this example.
There is JS snippet below. My point - to define REQUEST_POST_BODY and RECEIVE_POST_BODY cases in posts reducer. Main difficult - to find and update right object in store.
I try to use code from example:
return Object.assign({}, state, {
[action.subreddit]: posts(state[action.subreddit], action)
})
But it used simple array of posts. It's not needed to find right post by id.
Here my code:
const initialState = {
items: [{id:3, title: '1984', isFetching:false}, {id:6, title: 'Mouse', isFetching:false}]
}
// Reducer for posts store
export default function posts(state = initialState, action) {
switch (action.type) {
case REQUEST_POST_BODY:
// here I need to set post.isFetching => true
case RECEIVE_POST_BODY:
// here I need to set post.isFetching => false and post.body => action.body
default:
return state;
}
}
function requestPostBody(id) {
return {
type: REQUEST_POST_BODY,
id
};
}
function receivePostBody(id, body_from_server) {
return {
type: RECEIVE_POST_BODY,
id,
body: body_from_server
};
}
dispatch(requestPostBody(3));
dispatch(receivePostBody(3, {id:3, body: 'blablabla'}));
If I understand correctly, you are having trouble getting the specific post you want.
First of all, Having your reducer also update the array and the object in it, makes it hard to read and maintain. I suggest you watch this short video explaining about reducer composition with arrays. You can simplify your code by using the technique described there.
In your case, you would a
posts
reducer and apost
reducer, whileposts
reducer calls thepost
reducer.As for finding the right object to work on, Dan Prince's suggestion makes it easier. Having an object map instead of an array would make it easier for you. Relevant code snippet from Dan's answer:
With Arrays
If you'd prefer to stick with arrays, then you can write a reducer that just tackles single
post
objects.Your root reducer would become:
We're just running our new reducer over each post in the list, to return an updated array of posts. In this case, the unique id will ensure that only one item will be changed.
With Objects
If each item has a unique string/number id, then you can flip your array around and use an
object
instead.Then you can simplify your reducer.
If you're happy to experiment with some ES7 syntax too, you can enable the Object spread operator with Babel and rewrite the calls to
Object.assign
.If you're not so keen on using the spread syntax, then it's still possible to make
Object.assign
a bit more palatable.