D P*_*ark 5 javascript data-visualization ecmascript-6 reactjs deck.gl
我正在构建一个基本的可视化系统,可以从控制框切换图层。我将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
}
]);
Run Code Online (Sandbox Code Playgroud)
每次检查属性filterState更新时,它都会启动renderLayers()
,选择checked属性为的相应图层true。
useEffect(()=>{
renderLayers();
},[filterState]);
const renderLayers = () => {
const newLayers = [];
filterState.map(filter => (filter.checked && newLayers.push(filter.linkedTo)));
setLayers(newLayers);
}
Run Code Online (Sandbox Code Playgroud)
然后作为图层道具layers传递给组件。DeckGL
<DeckGL
initialViewState={viewState}
controller={true}
layers={layers}
>
Run Code Online (Sandbox Code Playgroud)
在我的程序中,关闭图层效果很好,但它们不会重新打开。在控制台中,我注意到层之间的生命周期是不同的。我的做法有什么不正确的地方吗?
您是否尝试过使用图层的可见属性?如果您要多次且频繁地切换,deck.gl 建议使用可见层而不是重新创建新层。关于此线程的一些有用资源:
首先,像您一样创建一个控制框。然后将您从控制框中选择的内容作为道具传递给 DeckGL 组件。
{
layer1: true, layer2: false, layer3: false, layer4: false,
}
Run Code Online (Sandbox Code Playgroud)
为图层创建状态。
const [activeLayers, setActiveLayers] = useState(layersProps);
Run Code Online (Sandbox Code Playgroud)
当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]);
Run Code Online (Sandbox Code Playgroud)
或者你可以创建一个状态
const [activeLayers, setActiveLayers] = useState({
layer1: true, layer2: false,
});
Run Code Online (Sandbox Code Playgroud)
仅将您从控制框中选择的内容作为道具传递并检查更改。
useEffect(() => {
const layers = {
layer1: false,
layer2: false,
};
if (typeMap === 'layer1') {
layers.layer1 = true;
} else if (typeMap === 'layer2') {
layers.layer2 = true;
}
...
setActiveLayers(layers);
}, [inputLayerSelected]);
Run Code Online (Sandbox Code Playgroud)
如果您愿意,您还可以将每一层拆分为一个状态(这样您就有一个原始值)。
最后,您可以创建图层
const layer1 = new ScatterplotLayer({
id: 'scatter',
data: data,
....
visible: activeLayers.layer1, OR
visible: layer1
});
Run Code Online (Sandbox Code Playgroud)
并渲染
<DeckGL
layers={[layer1, layer2, layer3, layer4]}
...
>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3678 次 |
| 最近记录: |