@uiw/react-amap-utils
Version:
基于 React 封装的高德地图组件。AMap Component Based On React.
188 lines (183 loc) • 6.53 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
Object.defineProperty(exports, "__esModule", {
value: true
});
var _exportNames = {
useSetStatus: true,
useVisiable: true,
usePrevious: true,
useEventProperties: true,
useSettingProperties: true
};
exports.useEventProperties = useEventProperties;
exports.usePrevious = usePrevious;
exports.useSetStatus = useSetStatus;
exports.useSettingProperties = useSettingProperties;
exports.useVisiable = useVisiable;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = require("react");
var _usePortal = require("./usePortal");
Object.keys(_usePortal).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
if (key in exports && exports[key] === _usePortal[key]) return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function get() {
return _usePortal[key];
}
});
});
/// <reference types="@uiw/react-amap-types" />
/**
* 对实例有 setStatus 更改状态的处理
* @param instance
* @param props
* @param propsName
*/
function useSetStatus(instance) {
var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var propsName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
propsName.forEach(function (name) {
var eName = name;
// eslint-disable-next-line react-hooks/rules-of-hooks
var _useState = (0, _react.useState)(props[eName]),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
state = _useState2[0],
setState = _useState2[1];
// eslint-disable-next-line react-hooks/rules-of-hooks
(0, _react.useEffect)(function () {
if (instance && props[eName] !== undefined) {
if (props[eName] !== state) {
// map.setStatus({
// dragEnable: true,
// keyboardEnable: true,
// doubleClickZoom: true,
// zoomEnable: true,
// rotateEnable: true
// });
var status = instance.getStatus();
instance.setStatus((0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, status), {}, (0, _defineProperty2["default"])({}, eName, props[eName])));
setState(props[eName]);
}
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [instance, props[eName]]);
});
}
/**
* 针对 Overlay 类型的组件,有公共的是否显示 对象处理
* 通过参数 `visiable` 来控制执行 `show()` or `hide()`
*/
function useVisiable(instance, visible) {
var _useState3 = (0, _react.useState)(visible),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
state = _useState4[0],
setState = _useState4[1];
(0, _react.useEffect)(function () {
if (instance && visible !== undefined) {
if (visible) {
instance.show && instance.show();
} else {
instance.hide && instance.hide();
}
if (visible !== state) {
setState(visible);
}
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [instance, visible]);
}
/**
* 获取上一轮的 props 或 state
* How to get the previous props or state?
* https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state
* @example
* ```js
* function Counter() {
* const [count, setCount] = useState(0);
* const prevCount = usePrevious(count);
* return <h1>Now: {count}, before: {prevCount}</h1>;
* }
* ```
*/
function usePrevious(value) {
var ref = (0, _react.useRef)();
(0, _react.useEffect)(function () {
ref.current = value;
});
return ref.current;
}
/**
* 绑定事件
* @param instance 实例对象
* @param props 传递进来的 props
* @param eventName 事件的名字,如,我们使用 `onClick` 事件,最终被转换成,`click` 绑定到实例中,`onDblClick` => `dblclick`
*
* @example
* ```js
* useEventProperties<BMap.Marker, UseMarker>(marker!, props, [
* 'onMouseMove', 'onZoomChange', 'onMapMove', 'onMouseWheel', 'onZoomStart'
* ]);
* ```
*/
function useEventProperties(instance) {
var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var eventName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
var type = arguments.length > 3 ? arguments[3] : undefined;
eventName.forEach(function (name) {
var eventName = name;
var eventHandle = props[eventName];
// eslint-disable-next-line react-hooks/rules-of-hooks
(0, _react.useEffect)(function () {
if (!instance) return;
var eName = name.toLocaleLowerCase().replace(/^on/, '');
if (eventHandle && eName) {
instance.on(eName, eventHandle);
}
return function () {
if (eName && eventHandle) {
instance.off(eName, eventHandle);
}
};
}, [instance, eventHandle]);
});
}
/**
* 属性受控
* @param instance 实例对象
* @param props 属性值
* @param propsName 多个属性设置的名称
* @example
* ```ts
* useSettingProperties<AMap.Polyline, UsePolyline>(polyline!, props, [
* 'Path'
* ]);
* ```
*/
function useSettingProperties() {
var instance = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var propsName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
propsName.forEach(function (name) {
var eName = "set".concat(name);
var vName = "".concat(name.charAt(0).toLowerCase()).concat(name.slice(1));
var eventHandle = props[vName];
var _useState5 = (0, _react.useState)(eventHandle),
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
state = _useState6[0],
setState = _useState6[1];
// eslint-disable-next-line react-hooks/rules-of-hooks
(0, _react.useEffect)(function () {
if (instance && eventHandle !== undefined) {
if (eventHandle !== state && instance[eName] && typeof instance[eName] === 'function') {
instance[eName](eventHandle);
setState(eventHandle);
}
}
}, [instance, eventHandle]);
});
}