UNPKG

@uiw/react-baidu-map-utils

Version:

Baidu Map utils Components for React.

188 lines (183 loc) 6.35 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.useEnableProperties = useEnableProperties; exports.useEventProperties = useEventProperties; exports.usePrevious = usePrevious; exports.useProperties = useProperties; exports.useRenderDom = useRenderDom; exports.useVisiable = useVisiable; var _reactDom = require("react-dom"); var _react = _interopRequireWildcard(require("react")); var _jsxRuntime = require("react/jsx-runtime"); /// <reference types="@uiw/react-baidu-map-types" /> /** * 批量创建多个如下 State,监听并设置值, * 组件属性更改 <Componet enableDragging={true} > * 根据 enableDragging 的 Boolean 值,执行 `enable` 和 `disable` 开头的函数。 * @example * ```js * const [enableDragging, setEnableDragging] = useState(props.enableDragging); * useEffect(() => { * console.log('~~:enableDragging', enableDragging, props.enableDragging, polyline); * setEnableDragging(props.enableDragging) * }, [polyline, enableDragging, props.enableDragging]); * ``` * @param instance * @param props * @param propsName */ function useEnableProperties(instance) { let props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; let propsName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; propsName.forEach(name => { const eName = `enable${name}`; const funName = props[eName] ? `enable${name}` : `disable${name}`; if (instance && props[eName] !== undefined) { instance[funName] && instance[funName](); } }); } /** * 针对 Overlay 类型的组件,有公共的是否显示 对象处理 * 通过参数 `visiable` 来控制执行 `show()` or `hide()` */ function useVisiable(instance) { let props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; const visiable = props.visiable; const [state, setState] = (0, _react.useState)(visiable); (0, _react.useEffect)(() => { if (instance && visiable !== undefined) { if (visiable) { instance.show && instance.show(); } else { instance.hide && instance.hide(); } if (visiable !== state) { setState(visiable); } } }, [instance, state, visiable]); } /** * 批量创建多个如下 State,监听并设置值, * 执行 `set` 开头的函数。 * @param instance * @param props * @param propsName */ function useProperties(instance, props) { let propsName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; propsName.forEach(name => { const eName = `${name.charAt(0).toLowerCase()}${name.slice(1)}`; // eslint-disable-next-line react-hooks/rules-of-hooks const [state, setState] = (0, _react.useState)(props[eName]); // eslint-disable-next-line react-hooks/rules-of-hooks (0, _react.useEffect)(() => { if (instance && instance[`set${name}`] && props[eName] !== undefined) { /** * 坐标点的参数设置,比对, 坐标点的参数设置 */ let data = props[eName]; if (data && data.lng && data.lat) { data = new BMap.Point(data.lng, data.lat); let preData = state; if (preData && preData.lng && preData.lat) { preData = new BMap.Point(preData.lng, preData.lat); if (data.equals(preData)) { return; } } } instance[`set${name}`](data); // 属性发生变化缓存 if (state !== props[eName]) { if (eName === 'bounds') { if (state && props[eName] && !state.equals(props[eName])) { setState(props[eName]); } } else { setState(props[eName]); } } } // eslint-disable-next-line react-hooks/exhaustive-deps }, [instance, props[eName]]); }); } /** * 绑定事件 * @param instance 实例对象 * @param props 传递进来的 props * @param eventName 事件的名字,如,我们使用 `onClick` 事件,最终被转换成,`click` 绑定到实例中,`onDblClick` => `dblclick` * * @example * ```js * useEventProperties<BMap.Marker, UseMarker>(marker!, props, [ * 'Click', 'DblClick', 'MouseDown', 'MouseUp', 'MouseOut', 'MouseOver' * ]); * ``` */ function useEventProperties(instance) { let props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; let eventName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; let type = arguments.length > 3 ? arguments[3] : undefined; eventName.forEach(name => { const eventName = `on${name}`; const eventHandle = props[eventName]; // eslint-disable-next-line react-hooks/rules-of-hooks (0, _react.useEffect)(() => { if (!instance) return; if (eventHandle && name) { let eName = name; if (type === 'CamelCase') { eName = name.replace(name[0], name[0].toLowerCase()); } else { eName = name.toLowerCase(); } try { instance.addEventListener(eName, eventHandle); } catch (error) {} return () => { try { instance.removeEventListener(eName, eventHandle); } catch (error) {} }; } // eslint-disable-next-line react-hooks/exhaustive-deps }, [instance, props[eventName]]); }); } /** * 获取上一轮的 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) { const ref = (0, _react.useRef)(); (0, _react.useEffect)(() => { ref.current = value; }); return ref.current; } function useRenderDom(props) { const container = (0, _react.useRef)(document.createElement('div')); (0, _react.useLayoutEffect)(() => { (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_react.Fragment, { children: props.children }), container.current); }, [props.children]); return { container: container.current }; }