Если проблема, с которой вы столкнулись, заключается в том, что вы не видите, что вещи перерисовываются после завершения ваших HTTP-запросов, это потому, что вы нарушаете правило React здесь:
// Incorrect
let newState = Object.assign({}, this.state);
newState.categoryList[item.id] = names; // names is a single string containing all genres
this.setState(newState);
Всякий раз, когда вы устанавливаете новое состояние на основе существующего состояния (как в вашем первом блоке кода), вы должны использовать версию обратного вызова setState
и объект состояния, который он передает вам;вы не можете сделать это, как вы сделали выше; документы .
Вы сказали, что categoryList
- это массив.Из вашего описания это звучит как массив разреженный (по крайней мере, на начальном этапе).При установке состояния вы должны сделать копию массива, содержащего изменения, вы не можете напрямую изменить его.Поскольку он кажется разреженным, мы не можем сделать это обычным способом (с расширенной нотацией в литерале), вместо этого мы должны использовать Object.assign
:
// Correct
this.setState(({categoryList}) => ({categoryList: Object.assign([], categoryList, {[item.id]: names})}));
или, возможно, более ясный, многословныйверсия:
this.setState(state => {
const categoryList = Object.assign([], state.categoryList);
categoryList[item.id] = names;
return {categoryList};
});