Хотя можно использовать оператор распространения, существует множество других способов достижения того же результата, даже не требуя будущего компилятора JS для нестандартизированной функции. Вот некоторые другие варианты в произвольном порядке.
Если вы уверены, что ваше состояние не будет расти, тогда вы можете просто вернуть все новое состояние в виде литерала.
return {
notificationBar: {
open: true
}
}
Однако, это не часто будет уместно, потому что маловероятно, что ваше состояние будет таким простым.
Redux предоставляет вам полезный метод для объединения нескольких редукторов, которые работают с различными частями объекта состояния. В этом случае вы бы создали редуктор notificationBar
, который обрабатывал бы только этот объект.
createStore(combineReducers({
notificationBar: function(state=initialNBarState, action) {
switch (action.type) {
case actions.LAYOUT_NOTIFICATIONBAR_OPEN:
return Object.assign({}, state, { open: true });
}
});
Это избавляет вас от необходимости беспокоиться о верхнем уровне свойств, так что вы можете избежать вложенных вызовов в Object.assign
.
Если ваше состояние может быть логически разбито на четко определенные разделы, то это, вероятно, самый идиоматический способ решения этой проблемы.
Вы можете использовать библиотеку постоянных структур данных для создания структур данных, которые можно изменить для возврата копии.
Мори - это результат компиляции структур данных и функционального API Clojure в JS.
import { hashMap, updateIn } from 'mori';
const initialState = hashMap(
"notificationBar", hashMap(
"open", false
)
);
// ...
return updateIn(state, ['notificationBar', 'open'], true);
ImmutableJS - это более императивный подход к переносу семантики попыток с отображением хэш-массивов из постоянных структур данных Clojure в Javascript.
import { Map } from 'immutable';
const initialState = Map({
notificationBar: Map({
open: true
});
});
// ...
return state.setIn(['notificationBar', 'open'], true);
Object.assign
Вы можете создать более дружественную версию Object.assign
для написания более кратких версий кода выше. Фактически, оно может быть почти таким же кратким, как оператор ...
.
function $set(...objects) {
return Object.assign({}, ...objects);
}
return $set(state, {
notificationBar: $set(state.notificationBar, {
open: true,
})
});
Существует ряд библиотек, которые также предлагают помощники неизменяемости для внесения изменений в обычные изменяемые объекты.
React уже давно имеет встроенный набор помощников неизменяемости. Они используют синтаксис, аналогичный запросам MongoDB.
import update from 'react-addons-update';
return update(state, {
notificationBar: {
open: { $set: true }
}
});
Эта библиотека позволяет использовать знакомые пути точек для указания обновлений (вложенных) свойств.
import dotProp from 'dot-prop-immutable';
return dotProp.set(state, 'notificationBar.open', true);
Эта библиотека является оберткой вокруг react-addons-update
и предоставляет более функциональный синтаксис для обновления (вложенных) свойств.
Вместо того, чтобы передавать новое значение, вы передаете функцию, которая принимает старое значение и возвращает новое.
import updateIn from 'update-in';
return updateIn(state, ['notificationBar', 'open'], () => true);
Для обновления свойств эта библиотека похожа на нечто среднее между dot-prop-immutable
и update-in
.
import path from 'immutable-path';
return path.map(state, 'notificationBar.open', () => true);
Дизайн звездообразной схемы всегда определяется бизнес-потребностями клиента . Какие вопросы задаются? Насколько подробными должны быть ответы?
В вашем примере интересными вопросами могут быть «Количество договоров по филиалам или LoanManager» или «Управляемая сумма ссуд по филиалам или LoanManager». В этом случае Branch
и LoanManager
станут вашими измерениями , а Count (LoanContract)
и Sum (LoanContract.amount)
будет вашим мерами . Обычным дополнительным параметром является время, обычно неделя
или квартал
.
Схема ответов на эти вопросы может выглядеть следующим образом:
DimBranch ( branchNo )
DimLoanManager ( empNo )
DimQuarter ( year, qNo ) -- qNo in (1,2,3,4)
DimWeek ( year, weekNo ) -- weekNo in (0..53), depending on business rules
Measures ( branchNo, empNo, year, qNo, weekNo, numContracts, sumLoans )
Для бизнес-вопросов, которые вы уже задали в своем вопрос,