2

在此处输入图像描述 我正在构建一个基本的可视化系统,可以从控制框切换图层。我layers将各个图层合并为一个。

const [layers, setLayers] = useState([densityLayer, pedestrianLayer]);

我有filterState跟踪控制框中的活动。它包含图层对象作为linkTo

 const [filterState, setFilterState] = useState([
        {
          id: 'densityFilter',
          checked: true,
          description: 'Population density',
          linkedTo: densityLayer
        },
        {
          id: 'pedestrianFilter',      
          checked: true,
          description: 'Pedestrian volume',
          linkedTo: pedestrianLayer
        }
      ]);

并且每次检查的属性filterState被更新时,它都会启动renderLayers() ,它将选择checked属性为true.

  useEffect(()=>{
        renderLayers();
      },[filterState]);

      const renderLayers = () => {
        const newLayers = []; 
        filterState.map(filter => (filter.checked && newLayers.push(filter.linkedTo)));
        setLayers(newLayers);
      }

然后作为图层道具layers传递给组件。DeckGL

   <DeckGL
        initialViewState={viewState}
        controller={true}
        layers={layers}
      >

在我的程序中,关闭图层可以正常工作,但它们不会重新打开。在控制台中,我注意到层之间的生命周期是不同的。我的方法有什么不正确的地方吗?

4

1 回答 1

3

您是否尝试过使用图层的可见属性?如果您要多次且经常切换,deck.gl 建议使用可见层而不是重新创建新层。关于这个线程的一些有用资源:

首先,像您一样创建一个控制框。然后将您从控制框中选择的内容作为道具传递给 DeckGL 组件。

{
    layer1: true, layer2: false, layer3: false, layer4: false,
}

为图层创建状态。

const [activeLayers, setActiveLayers] = useState(layersProps);

当 layersProps 发生变化时使用 useEffect 检查。

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]}
    ...
>
于 2020-05-22T14:35:24.097 回答