Denken Sie an den Status der App als Datenbank. Ich schlage vor, Sie diesen Zustand Form zu verwenden:
{
entities: {
// List of normalized posts without any nesting. No matter whether they have all fields or not.
posts: {
'1': {
id: '1',
title: 'Post 1',
},
'2': {
id: '2',
title: 'Post 2',
}
},
},
// Ids of posts, which need to displayed.
posts: ['1', '2'],
// Id of full post.
post: '2',
}
Zunächst einmal haben wir unsere normalizr
Schemas erstellen:
// schemas.js
import { Schema, arrayOf } from 'normalizr';
const POST = new Schema('post');
const POST_ARRAY = arrayOf(POST);
Nach Erfolg Antwort, wir Antwortdaten normalisieren und Versendung der Aktion:
// actions.js/sagas.js
function handlePostsResponse(body) {
dispatch({
type: 'FETCH_POSTS',
payload: normalize(body.result, POST_ARRAY),
});
}
function handleFullPostResponse(body) {
dispatch({
type: 'FETCH_FULL_POST',
payload: normalize(body.result, POST),
});
}
In Reduzierungen müssen wir entities
Reducer erstellen, der alle Aktionen abhören wird und wenn er entities
Schlüssel in Zahlung hat Last, würde diese Einheiten in die App-Status hinzufügen:
// reducers.js
import merge from 'lodash/merge';
function entities(state = {}, action) {
const payload = action.payload;
if (payload && payload.entities) {
return merge({}, state, payload.entities);
}
return state;
}
Auch müssen wir Reduzierungen erstellen entsprechende FETCH_BOARDS
und FETCH_FULL_BOARD
Aktionen zu handhaben:
// Posts reducer will be storing only posts ids.
function posts(state = [], action) {
switch (action.type) {
case 'FETCH_POSTS':
// Post id is stored in `result` variable of normalizr output.
return [...state, action.payload.result];
default:
return state;
}
}
// Post reducer will be storing current post id.
// Further, you can replace `state` variable by object and store `isFetching` and other variables.
function post(state = null, action) {
switch (action.type) {
case 'FETCH_FULL_POST':
return action.payload.id;
default:
return state;
}
}
Ich habe eine Frage: 'fusionieren ({}, state, payload.entities);' den Zustand mutieren? – Daskus
@Daskus Nein, da wir ein leeres Objekt als erstes Argument übergeben, wird die 'merge' Funktion ein neues Objekt zurückgeben. – 1ven
Dies ist bei weitem die beste Antwort, wir gingen genau für diesen Ansatz. Der Schlüssel liegt darin, gute Selektoren und Filter zu schreiben. Empfehlen Sie auch unbedingt Immutable JS ...! – AndrewMcLagan