@pansy/react-mapbox-gl
Version:
🌍 基于 Mapbox GL 封装的 React 组件库
56 lines (55 loc) • 1.59 kB
JavaScript
// 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
};