А вы пробовали использовать свойство visible для слоев? Если вы собираетесь переключаться несколько раз и часто, deck.gl предлагает использовать видимый вместо воссозданного нового слоя. Некоторые полезные ресурсы по этой теме:
Сначала создайте блок управления, как вы это делали. Затем передайте компоненту DeckGL в качестве свойств то, что вы выбрали в блоке управления.
{
layer1: true, layer2: false, layer3: false, layer4: false,
}
Создайте состояние для слоев.
const [activeLayers, setActiveLayers] = useState(layersProps);
Проверяйте с помощью useEffect, когда что-то изменяется в LayersProps.
useEffect(() => {
const layers = {
layer1: false,
layer2: false,
layer3: false,
layer4: false,
};
if (typeMap === 'layer1') {
layers.layer1 = true;
} else if (typeMap === 'layer2') {
layers.layer2 = true;
}
...
setActiveLayers(layers);
}, [layerProps]);
Или вы можете создать состояние
const [activeLayers, setActiveLayers] = useState({
layer1: true, layer2: false,
});
И передать в качестве реквизита только то, что вы выбрали из блока управления, и проверить наличие изменений.
useEffect(() => {
const layers = {
layer1: false,
layer2: false,
};
if (typeMap === 'layer1') {
layers.layer1 = true;
} else if (typeMap === 'layer2') {
layers.layer2 = true;
}
...
setActiveLayers(layers);
}, [inputLayerSelected]);
Если вы предпочитаете также можно разделить каждый слой на одно состояние (так что у вас есть примитивное значение).
Наконец, вы можете создать свой слой
const layer1 = new ScatterplotLayer({
id: 'scatter',
data: data,
....
visible: activeLayers.layer1, OR
visible: layer1
});
и визуализировать
<DeckGL
layers={[layer1, layer2, layer3, layer4]}
...
>