У меня есть объект (это один массив свойств, и поскольку он является динамическим, я не могу разбить его на несколько свойств), который я сохраняю в редукторе, который выглядит примерно так:
[
{type: list, elements: []}
{type: map, elements: []}
{type: wheelList, elements: []}
{type: chart, elements: []}
{type: dyna, elements: []}
...
]
В одном компоненте я получаю его из хранилища и получаю доступ к нему как:
this.props.allElements
Затем для каждого из них я визуализирую другой компонент (псевдокод):
foreach (el in this.props.allElements) {
if (el == list) {
return <ListComponent elements={el.elements}>
}
if (el == map) {
return <MapComponent elements={el.elements}>
}
...
}
Таким образом, каждый компонент получает только те элементы, которые вам интересны.
Мой вопрос касается производительности и оптимизации.
Является ли мой подход хорошим?
Я испытываю некоторые проблемы с производительностью, поэтому проверяю, может быть, моя организация
здесь неправильна и нуждается в совете, если ее можно улучшить.
У меня есть частые обновления, иногда карта может обновляться каждую секунду.
Поэтому, если я обновляю только элементы карты и передаю ее в действие, чтобы обновить ее, все эти компоненты снова запустит визуализацию или только ту, что смотрит на карту.
UPDATE
Но для обновления элементов map
мне нужно получить целые значения этого элемента object
из store
в action update only map
, а затем передать весь обновленный объект на reducer
.
Так что изменилась только карта, другие нет.
Является ли реакция/сокращение достаточно умным, чтобы обновлять только компонент, данные которого изменены (карта в моем случае).
Действие:
export function getScreenElements() : Action {
return function(dispatch) {
// get data from server here
// and do some calculations here
dispatch({
type: 'ELEMENTS_RECEIVED',
allElements: data
});
Разбавление:
export default function (state:State = initialState, action:Action): State {
if (action.type === 'ELEMENTS_RECEIVED') {
return {
...state,
allElements: action.allElements,
};
В большой части:
const mapStateToProps = state => ({
allElements: state.main.allElements
...
class Main extends Component {
...
componentDidMount() {
// here I actually make a call to get data
}
...
render() {
return (
// Here is the big code
// Loop over props.allElements
// and render it in different way based on data inside each element
)
}
Пример данных:
[
{
"type": "list",
"count": 99,
"elements": [
{
"id": 1,
"name": "test"
},
{
"id": 2,
"name": "test1"
}
]
},
{
"type": "map",
"count": 99,
"elements": [
{
"id": 3,
"name": "test"
},
{
"id": 4,
"name": "test1"
}
]
},
{
"type": "list",
"count": 99,
"elements": [
{
"id": 5,
"name": "test"
},
{
"id": 6,
"name": "test1"
}
]
},
{
"type": "list",
"count": 99,
"elements": [
{
"id": 7,
"name": "test"
},
{
"id": 8,
"name": "test1"
}
]
}
]