diff --git a/docs/api/layer/layer.zh.md b/docs/api/layer/layer.zh.md
index 4ffc060ac6..97275f9017 100644
--- a/docs/api/layer/layer.zh.md
+++ b/docs/api/layer/layer.zh.md
@@ -126,24 +126,22 @@ layer.source(data, {
- cat 枚举
```javascript
-
-layer.scale('name',{
- type: 'cat'
-})
+layer.scale('name', {
+ type: 'cat',
+});
// 设置多个scale
-字段名为 key, value 为scale配置项
+// 字段名为 key, value 为scale配置项
layer.scale({
- name:{
- type: 'cat'
+ name: {
+ type: 'cat',
},
value: {
- type: 'linear'
- }
-})
-
+ type: 'linear',
+ },
+});
```
## 视觉编码方法
diff --git a/docs/api/react/layer.zh.md b/docs/api/react/layer.zh.md
index 956ffaf4f8..3752b6dc1b 100644
--- a/docs/api/react/layer.zh.md
+++ b/docs/api/react/layer.zh.md
@@ -7,7 +7,7 @@ order: 2
| prop name | Type | Default | Description |
| ------------- | ------------------------------ | --------------------------------------------------------- | --------------------------------------- |
-| option | `layer option` | | layer 配置项 |
+| options | `layer options` | | layer 配置项 |
| source | `sourceOption` | | 数据源配置项 |
| color | `attributeOption` | | 颜色通道 |
| shape | `attributeOption` | | 图层形状属性 |
@@ -19,15 +19,17 @@ order: 2
| active | `boolean` `interaction option` | `false` | 图层 hover 高亮 |
| onLayerLoaded | `Function` | | 图层添加完成后回调,用于获取 layer 对象 |
-### layer option
+### layer options
-| prop name | Type | Default | Description |
-| --------- | --------- | ----------------------- | ---------------------------------------- |
-| name | `string` | | 图层名字,可根据名称获取 layer |
-| visible | `boolean` | `true` | 图层是否可见 |
-| zIndex | `number` | 0 | 图层绘制顺序, |
-| minZoom | `number` | 0 | 设置 layer 最小可见等级,小于则不显示 |
-| maxZoom | `number` | 与 map 最大缩放等级一致 | 设置 layerd 的最大可见等级,大于则不显示 |
+| prop name | Type | Default | Description |
+| --------- | --------- | ----------------------- | ------------------------------------------------ |
+| name | `string` | | 图层名字,可根据名称获取 layer |
+| visible | `boolean` | `true` | 图层是否可见 |
+| zIndex | `number` | 0 | 图层绘制顺序, |
+| minZoom | `number` | 0 | 设置 layer 最小可见等级,小于则不显示 |
+| maxZoom | `number` | 与 map 最大缩放等级一致 | 设置 layerd 的最大可见等级,大于则不显示 |
+| aotoFit | `boolean` | `false` | 是否缩放到图层范围 |
+| blend | 'string' | 'normal' | 图层元素混合效果 [详情]('../layer/layer/#blend') |
### attribute Option
diff --git a/examples/react/control/demo/control.tsx b/examples/react/control/demo/control.tsx
new file mode 100644
index 0000000000..17128e868c
--- /dev/null
+++ b/examples/react/control/demo/control.tsx
@@ -0,0 +1,27 @@
+import { AMapScene, Control, LineLayer } from '@antv/l7-react';
+import * as React from 'react';
+import ReactDOM from 'react-dom';
+const MapScene = React.memo(function Map() {
+ return (
+
+
+
+
+ );
+});
+
+ReactDOM.render(, document.getElementById('map'));
diff --git a/examples/react/control/index.en.md b/examples/react/control/index.en.md
new file mode 100644
index 0000000000..bea65a1ecf
--- /dev/null
+++ b/examples/react/control/index.en.md
@@ -0,0 +1,4 @@
+---
+title: Control Component
+order: 0
+---
diff --git a/examples/react/control/index.zh.md b/examples/react/control/index.zh.md
new file mode 100644
index 0000000000..8e352710d8
--- /dev/null
+++ b/examples/react/control/index.zh.md
@@ -0,0 +1,4 @@
+---
+title: Control 组件
+order: 0
+---
diff --git a/examples/react/layer/demo/meta.json b/examples/react/layer/demo/meta.json
new file mode 100644
index 0000000000..649cdde08b
--- /dev/null
+++ b/examples/react/layer/demo/meta.json
@@ -0,0 +1,14 @@
+{
+ "title": {
+ "zh": "Layer 组件",
+ "en": "Layer Component"
+ },
+ "demos": [
+
+ {
+ "filename": "world.jsx",
+ "title": "世界地图",
+ "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*ZiMnSZlmblIAAAAAAAAAAABkARQnAQ"
+ }
+ ]
+}
diff --git a/examples/react/layer/demo/world.jsx b/examples/react/layer/demo/world.jsx
new file mode 100644
index 0000000000..c0c4d4c72f
--- /dev/null
+++ b/examples/react/layer/demo/world.jsx
@@ -0,0 +1,83 @@
+import { AMapScene, LineLayer, MapboxScene, PolygonLayer } from '@antv/l7-react';
+import * as React from 'react';
+import ReactDOM from 'react-dom';
+
+const World = React.memo(function Map() {
+ const [ data, setData ] = React.useState();
+ React.useEffect(() => {
+ const fetchData = async () => {
+ const response = await fetch(
+ 'https://gw.alipayobjects.com/os/basement_prod/68dc6756-627b-4e9e-a5ba-e834f6ba48f8.json'
+ );
+ const data = await response.json();
+ setData(data);
+ };
+ fetchData();
+ }, []);
+ return (
+
+ {data && [
+ ,
+
+ ]}
+
+ );
+});
+
+ReactDOM.render(, document.getElementById('map'));
diff --git a/examples/react/layer/index.en.md b/examples/react/layer/index.en.md
new file mode 100644
index 0000000000..10ec6ccf53
--- /dev/null
+++ b/examples/react/layer/index.en.md
@@ -0,0 +1,4 @@
+---
+title: Layer Component
+order: 0
+---
diff --git a/examples/react/layer/index.zh.md b/examples/react/layer/index.zh.md
new file mode 100644
index 0000000000..abf5d8dc21
--- /dev/null
+++ b/examples/react/layer/index.zh.md
@@ -0,0 +1,4 @@
+---
+title: Layer 组件
+order: 0
+---
diff --git a/examples/react/scene/demo/amap.jsx b/examples/react/scene/demo/amap.jsx
new file mode 100644
index 0000000000..e8e2cb805a
--- /dev/null
+++ b/examples/react/scene/demo/amap.jsx
@@ -0,0 +1,25 @@
+import { AMapScene, LineLayer } from '@antv/l7-react';
+import * as React from 'react';
+import ReactDOM from 'react-dom';
+const MapScene = React.memo(function Map() {
+ return (
+
+ );
+});
+
+ReactDOM.render(, document.getElementById('map'));
+
diff --git a/examples/react/scene/demo/mapbox.jsx b/examples/react/scene/demo/mapbox.jsx
new file mode 100644
index 0000000000..fba6d844be
--- /dev/null
+++ b/examples/react/scene/demo/mapbox.jsx
@@ -0,0 +1,24 @@
+import { MapboxScene } from '@antv/l7-react';
+import * as React from 'react';
+import ReactDOM from 'react-dom';
+const MapScene = React.memo(function Map() {
+ return (
+
+ );
+});
+ReactDOM.render(, document.getElementById('map'));
+
diff --git a/examples/react/scene/demo/meta.json b/examples/react/scene/demo/meta.json
new file mode 100644
index 0000000000..edcdca68e5
--- /dev/null
+++ b/examples/react/scene/demo/meta.json
@@ -0,0 +1,19 @@
+{
+ "title": {
+ "zh": "Scene 组件",
+ "en": "Scene Component"
+ },
+ "demos": [
+
+ {
+ "filename": "amap.jsx",
+ "title": "高德地图",
+ "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*ZiMnSZlmblIAAAAAAAAAAABkARQnAQ"
+ },
+ {
+ "filename": "Mapbox.jsx",
+ "title": "Mapbox 地图",
+ "screenshot": "https://gw.alipayobjects.com/mdn/antv_site/afts/img/A*ZiMnSZlmblIAAAAAAAAAAABkARQnAQ"
+ }
+ ]
+}
diff --git a/examples/react/scene/index.en.md b/examples/react/scene/index.en.md
new file mode 100644
index 0000000000..35186e11ba
--- /dev/null
+++ b/examples/react/scene/index.en.md
@@ -0,0 +1,4 @@
+---
+title: Scene Component
+order: 0
+---
diff --git a/examples/react/scene/index.zh.md b/examples/react/scene/index.zh.md
new file mode 100644
index 0000000000..67355df55e
--- /dev/null
+++ b/examples/react/scene/index.zh.md
@@ -0,0 +1,4 @@
+---
+title: Scene 组件
+order: 0
+---
diff --git a/gatsby-browser.js b/gatsby-browser.js
index 487778f8c1..c3ebe92abb 100644
--- a/gatsby-browser.js
+++ b/gatsby-browser.js
@@ -5,3 +5,6 @@ window.geotiff = require('geotiff/dist/geotiff.bundle.min.js');
window.g2 = require('@antv/g2');
window.l7 = require('@antv/l7');
window.l7Maps = require('@antv/l7-maps');
+window.l7React = require('@antv/l7-react');
+window.react = require('react');
+window.reactDom = require('react-dom');
diff --git a/gatsby-config.js b/gatsby-config.js
index ef5fa53c84..ec050798cb 100644
--- a/gatsby-config.js
+++ b/gatsby-config.js
@@ -216,6 +216,14 @@ module.exports = {
en: 'Raster Layer'
}
},
+ {
+ slug: 'react',
+ icon: 'map',
+ title: {
+ zh: 'React 组件',
+ en: 'React Demo'
+ }
+ },
{
slug: 'tutorial',
icon: 'map',
diff --git a/packages/component/src/control/zoom.ts b/packages/component/src/control/zoom.ts
index b96155d618..abe8549633 100644
--- a/packages/component/src/control/zoom.ts
+++ b/packages/component/src/control/zoom.ts
@@ -93,7 +93,7 @@ export default class Zoom extends Control {
) {
const link = DOM.create('a', className, container) as HTMLLinkElement;
link.innerHTML = html;
- link.href = '#';
+ link.href = 'javascript:void(0)';
link.addEventListener('click', fn);
return link;
}
diff --git a/packages/layers/src/plugins/LayerStylePlugin.ts b/packages/layers/src/plugins/LayerStylePlugin.ts
index 45e38793aa..d91d42571c 100644
--- a/packages/layers/src/plugins/LayerStylePlugin.ts
+++ b/packages/layers/src/plugins/LayerStylePlugin.ts
@@ -13,7 +13,9 @@ export default class LayerStylePlugin implements ILayerPlugin {
layer.updateLayerConfig({});
const { autoFit } = layer.getLayerConfig();
if (autoFit) {
- layer.fitBounds();
+ setTimeout(() => {
+ layer.fitBounds();
+ }, 100);
}
});
}
diff --git a/packages/react/package.json b/packages/react/package.json
index 7a4cc08bfc..5629cc3f05 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -27,7 +27,9 @@
"@antv/l7": "^2.0.34",
"@antv/l7-maps": "^2.0.34",
"@babel/runtime": "^7.7.7",
- "load-styles": "^2.0.0",
+ "load-styles": "^2.0.0"
+ },
+ "peerDependencies": {
"react": "^16.8.6",
"react-dom": "^16.10.2"
},
diff --git a/packages/react/src/component/AMapScene.tsx b/packages/react/src/component/AMapScene.tsx
index 6a753e07e3..b1576dc949 100644
--- a/packages/react/src/component/AMapScene.tsx
+++ b/packages/react/src/component/AMapScene.tsx
@@ -1,7 +1,7 @@
import { IMapConfig, ISceneConfig, Scene } from '@antv/l7';
// @ts-ignore
// tslint:disable-next-line:no-submodule-imports
-import GaodeMap from '@antv/l7-maps/lib/amap';
+import { GaodeMap } from '@antv/l7-maps';
import React, { createElement, createRef, useEffect, useState } from 'react';
import { SceneContext } from './SceneContext';
interface IMapSceneConig {
diff --git a/packages/react/src/component/Control.tsx b/packages/react/src/component/Control.tsx
index 776e402a12..b47480034c 100644
--- a/packages/react/src/component/Control.tsx
+++ b/packages/react/src/component/Control.tsx
@@ -1,9 +1,9 @@
-import { IControl, Logo, PositionType, Scale, Scene, Zoom } from '@antv/l7';
+import { IControl, Logo, PositionName, Scale, Scene, Zoom } from '@antv/l7';
import React, { useEffect, useState } from 'react';
import { useSceneValue } from './SceneContext';
interface IControlProps {
type: 'scale' | 'zoom' | 'logo';
- position: PositionType;
+ position: PositionName;
[key: string]: any;
}
export default React.memo(function MapControl(props: IControlProps) {
@@ -15,17 +15,17 @@ export default React.memo(function MapControl(props: IControlProps) {
switch (type) {
case 'scale':
ctr = new Scale({
- position,
+ position: position || 'bottomright',
});
break;
case 'zoom':
ctr = new Zoom({
- position,
+ position: position || 'topright',
});
break;
case 'logo':
ctr = new Logo({
- position,
+ position: position || 'bottomleft',
});
}
setControl(ctr);
diff --git a/packages/react/src/component/LayerAttribute/Layer.tsx b/packages/react/src/component/LayerAttribute/Layer.tsx
index ce31428cb6..a34fb3b80c 100644
--- a/packages/react/src/component/LayerAttribute/Layer.tsx
+++ b/packages/react/src/component/LayerAttribute/Layer.tsx
@@ -103,6 +103,12 @@ export default function BaseLayer(type: string, props: ILayerProps) {
}
}, [options?.blend]);
+ // useEffect(() => {
+ // if (layer && layer.inited && options && options.autoFit === true) {
+ // layer.fitBounds();
+ // }
+ // }, [options?.autoFit]);
+
return layer !== null && layer !== undefined ? (
diff --git a/packages/react/src/component/MapboxScene.tsx b/packages/react/src/component/MapboxScene.tsx
index e42c79f3a9..5b2fa184b5 100644
--- a/packages/react/src/component/MapboxScene.tsx
+++ b/packages/react/src/component/MapboxScene.tsx
@@ -1,7 +1,7 @@
import { IMapConfig, ISceneConfig, Scene, Zoom } from '@antv/l7';
// @ts-ignore
// tslint:disable-next-line:no-submodule-imports
-import Mapbox from '@antv/l7-maps/lib/mapbox';
+import { Mapbox } from '@antv/l7-maps';
import React, { createElement, createRef, useEffect, useState } from 'react';
import { SceneContext } from './SceneContext';
interface IMapSceneConig {