尝试使用 openlayers、Golden Layout、reactjs。但是 openlayers 地图只显示在黄金布局的 1 window 中,而不显示在其他布局中
Trying to work with openlayers, Golden Layout, reactjs. But openlayers map only show in 1 window of golden-layout not in other
尝试使用 openlayers、reactjs 和 golden-layout。
黄金布局配置是一行,里面有两个 "react-components"。
Openlayers 确实在一个 "react-component" 黄金布局中渲染地图,但在其他 "react-component".
中渲染地图
这是我正在尝试的代码。
import Map from 'ol/Map';
import View from 'ol/View';
import TileLayer from 'ol/layer/Tile';
import XYZ from 'ol/source/XYZ';
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
// import TestComponent from './App';
import GoldenLayout from "golden-layout";
import * as serviceWorker from './serviceWorker';
import "golden-layout/src/css/goldenlayout-base.css";
import "golden-layout/src/css/goldenlayout-dark-theme.css";
import "ol/ol.css";
window.React = React;
window.ReactDOM = ReactDOM;
var map = new Map({
layers: [
new TileLayer({
source: new XYZ({
url: 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'
})
})
],
view: new View({
center: [0, 0],
zoom: 2
})
});
class TestComponent extends React.Component{
componentDidMount() {
map.setTarget("map")
}
render() {
return (<div id="map"></div>)
}
}
var myLayout = new GoldenLayout({
content: [
{
type: 'row',
content:[
{
type:'react-component',
component: 'test-component',
},
{
type:'react-component',
component: 'test-component',
}
]
}
]
});
myLayout.registerComponent( 'test-component', TestComponent);
myLayout.init();
这是结果。
openlayers with reactjs and golden-layout
您需要更改第二张地图的id。
首先,id
属性的值在整个应用程序中应该是 唯一的 (好吧,至少在您当前显示给的输出中是唯一的用户)。你的两个地图都指向同一个 div 元素 id="map"
(可能是他们找到的第一个)。
因此,您的第一张地图可能会将 div 定位为 id="map1"
,而第二张地图组件应将 div 定位为 id="map2"
。
所以你应该尝试将地图 id
作为你的两个组件的道具并设置 目标 id 和 div id in render()
方法基于此 属性
如果我的回答对您有帮助,请告诉我!
需要两个 openlayers 地图实例以及具有唯一性的元素 id
。
如果只使用一个地图实例,那么更改它的目标元素将不会在两个元素中呈现地图。
因此需要两个具有唯一元素的地图实例 id
。
此外,golden-layout 在它的 layout/reat-component 中呈现提供的 react 组件,这意味着您需要在 reactjs 组件生命周期的 componentDidMount()
函数中设置 id
。
componentDidMount
这是有效的代码。
import Map1 from 'ol/Map';
import Map2 from 'ol/Map';
import View from 'ol/View';
import TileLayer from 'ol/layer/Tile';
import XYZ from 'ol/source/XYZ';
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
// import TestComponent from './App';
import GoldenLayout from "golden-layout";
import * as serviceWorker from './serviceWorker';
import "golden-layout/src/css/goldenlayout-base.css";
import "golden-layout/src/css/goldenlayout-dark-theme.css";
import "ol/ol.css";
window.React = React;
window.ReactDOM = ReactDOM;
var map1 = new Map1({
layers: [
new TileLayer({
source: new XYZ({
url: 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'
})
})
],
view: new View({
center: [0, 0],
zoom: 2
})
});
var map2 = new Map2({
layers: [
new TileLayer({
source: new XYZ({
url: 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'
})
})
],
view: new View({
center: [0, 0],
zoom: 2
})
});
class TestComponent extends React.Component{
constructor(){
super()
this.myref = React.createRef()
}
componentDidMount() {
this.myref.current.setAttribute("id",this.props.id)
this.props.map.setTarget(this.props.id)
}
render() {
return (
<div ref={this.myref}></div>
)
}
}
var myLayout = new GoldenLayout({
content: [
{
type: 'row',
content:[
{
type:'react-component',
component: 'test-component',
props:{id:"map1",map:map1}
},
{
type:'react-component',
component: 'test-component',
props:{id:"map2",map:map2}
}
]
}
]
});
myLayout.registerComponent( 'test-component', TestComponent);
myLayout.init();
尝试使用 openlayers、reactjs 和 golden-layout。 黄金布局配置是一行,里面有两个 "react-components"。 Openlayers 确实在一个 "react-component" 黄金布局中渲染地图,但在其他 "react-component".
中渲染地图这是我正在尝试的代码。
import Map from 'ol/Map';
import View from 'ol/View';
import TileLayer from 'ol/layer/Tile';
import XYZ from 'ol/source/XYZ';
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
// import TestComponent from './App';
import GoldenLayout from "golden-layout";
import * as serviceWorker from './serviceWorker';
import "golden-layout/src/css/goldenlayout-base.css";
import "golden-layout/src/css/goldenlayout-dark-theme.css";
import "ol/ol.css";
window.React = React;
window.ReactDOM = ReactDOM;
var map = new Map({
layers: [
new TileLayer({
source: new XYZ({
url: 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'
})
})
],
view: new View({
center: [0, 0],
zoom: 2
})
});
class TestComponent extends React.Component{
componentDidMount() {
map.setTarget("map")
}
render() {
return (<div id="map"></div>)
}
}
var myLayout = new GoldenLayout({
content: [
{
type: 'row',
content:[
{
type:'react-component',
component: 'test-component',
},
{
type:'react-component',
component: 'test-component',
}
]
}
]
});
myLayout.registerComponent( 'test-component', TestComponent);
myLayout.init();
这是结果。 openlayers with reactjs and golden-layout
您需要更改第二张地图的id。
首先,id
属性的值在整个应用程序中应该是 唯一的 (好吧,至少在您当前显示给的输出中是唯一的用户)。你的两个地图都指向同一个 div 元素 id="map"
(可能是他们找到的第一个)。
因此,您的第一张地图可能会将 div 定位为 id="map1"
,而第二张地图组件应将 div 定位为 id="map2"
。
所以你应该尝试将地图 id
作为你的两个组件的道具并设置 目标 id 和 div id in render()
方法基于此 属性
如果我的回答对您有帮助,请告诉我!
需要两个 openlayers 地图实例以及具有唯一性的元素 id
。
如果只使用一个地图实例,那么更改它的目标元素将不会在两个元素中呈现地图。
因此需要两个具有唯一元素的地图实例 id
。
此外,golden-layout 在它的 layout/reat-component 中呈现提供的 react 组件,这意味着您需要在 reactjs 组件生命周期的 componentDidMount()
函数中设置 id
。
componentDidMount
这是有效的代码。
import Map1 from 'ol/Map';
import Map2 from 'ol/Map';
import View from 'ol/View';
import TileLayer from 'ol/layer/Tile';
import XYZ from 'ol/source/XYZ';
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
// import TestComponent from './App';
import GoldenLayout from "golden-layout";
import * as serviceWorker from './serviceWorker';
import "golden-layout/src/css/goldenlayout-base.css";
import "golden-layout/src/css/goldenlayout-dark-theme.css";
import "ol/ol.css";
window.React = React;
window.ReactDOM = ReactDOM;
var map1 = new Map1({
layers: [
new TileLayer({
source: new XYZ({
url: 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'
})
})
],
view: new View({
center: [0, 0],
zoom: 2
})
});
var map2 = new Map2({
layers: [
new TileLayer({
source: new XYZ({
url: 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'
})
})
],
view: new View({
center: [0, 0],
zoom: 2
})
});
class TestComponent extends React.Component{
constructor(){
super()
this.myref = React.createRef()
}
componentDidMount() {
this.myref.current.setAttribute("id",this.props.id)
this.props.map.setTarget(this.props.id)
}
render() {
return (
<div ref={this.myref}></div>
)
}
}
var myLayout = new GoldenLayout({
content: [
{
type: 'row',
content:[
{
type:'react-component',
component: 'test-component',
props:{id:"map1",map:map1}
},
{
type:'react-component',
component: 'test-component',
props:{id:"map2",map:map2}
}
]
}
]
});
myLayout.registerComponent( 'test-component', TestComponent);
myLayout.init();