UNPKG

@pansy/react-mapbox-gl

Version:

🌍 基于 Mapbox GL 封装的 React 组件库

56 lines (55 loc) 1.59 kB
// src/hooks/usePropsReactive.ts import { isFunction, isEqual, useDeepCompareEffect, useUnmount, usePrevious } from "@rcuse/core"; import { toCapitalString } from "../utils/toCapitalString"; function usePropsReactive(props, ins, { setterMap = {}, converterMap = {} } = {}) { const prevProps = usePrevious(props); useDeepCompareEffect(() => { if (ins) { reactivePropChange(props, true); } }, [props]); useUnmount(() => { if (ins && "remove" in ins) { ins.remove(); } }); const onInstanceCreated = () => { reactivePropChange(props, false); }; const reactivePropChange = (nextProps, shouldDetectChange = true) => { if (!ins) return; try { Object.keys(nextProps).forEach((key) => { if (isFunction(props[key]) && /^on[A-Z]/.test(key)) return; let willReactive = true; if (shouldDetectChange) { willReactive = !isEqual(nextProps[key], prevProps == null ? void 0 : prevProps[key]); } if (!willReactive) return; let setterParam = nextProps[key]; if (key in converterMap) { setterParam = converterMap[key](nextProps[key]); } if (key in setterMap) { setterMap[key](setterParam, ins); } else { const trySetterName = `set${toCapitalString(key)}`; if (trySetterName in ins) { ins[trySetterName](setterParam); } } }); } catch (error) { console.error(error); } }; return { onInstanceCreated }; } export { usePropsReactive };