Прежде всего, поблагодарите за чтение моего вопроса и попробуйте помочь мне и извиниться за мой английский.
Я пытаюсь создать метод в Redux с использованием React, который изменяет видимость слоя.
Моя проблема в том, что изменение видимости идеально, но когда все слои не видны, и попробуйте изменить их на видимые, их свойство before не определено, кроме последнего, который изменяется.
Я собираюсь объяснитьмне лучше с примером.
mapLayers это массив, который содержит 3 слоя:
- [2] Layer3
- 1 Layer2
- [0] Layer1
CASE 1:
Если я скрываю Layer1
, его свойство before не определено, и теперь я показываю Layer1
и теперь его свойство before является идентификатором Layer2
.
МОЯ ПРОБЛЕМА:
- [2] Layer3
- 1 Layer2
- [0] Layer1
3 Слои не видны, поэтому:
- Измените
Layer2
на видимый -> до= undefined - Изменить
Layer3
на видимый -> до этого = undefined - Изменить
Layer1
на видимый -> до = id Layer2
Но при измененииLayer3
до видимого (на шаге 2), до того, как должно быть неопределено, а позже, когда видимость chage от Layer2
.. до Layer3
должна быть Layer2
id.
Важно знать, что яЯ использую response-mapbox-gl, и мне нужно свойство before для перемещения и hido / show layer.
before : string Передайте идентификатор слоя, он отобразит текущий слойперед слоем, определенным идентификатором.
https://github.com/alex3165/react-mapbox-gl/blob/master/docs/API.md
Вот мой код:
static changeLayerVisibility(layer) {
let mapLayers = [... AxisStore.getStore().getState().map.mapGLlayers];
const ids = mapLayers.map(l => l.id);
const index = ids.indexOf(layer.id);
const newVisibility = (layer.layout.visibility === 'visible') ? 'none' : 'visible';
let nextVisibleLayer = mapLayers.find((layerObj, idx) => idx > index && layerObj.layout.visibility === 'visible');
let updateLayout = Object.assign({}, mapLayers[index], {
layout: Object.assign({}, mapLayers[index].layout, { visibility: newVisibility }),
paint: Object.assign({}, mapLayers[index].paint),
before: newVisibility === 'visible' && nextVisibleLayer ? nextVisibleLayer.id: undefined
});
mapLayers.splice(index, 1, updateLayout);
return (dispatch) => {
dispatch({
type: MapTypeConstants.SET_MAP_LAYERS,
payload: mapLayers
});
};
}