@canlooks/ajax
Version:
A private tool
51 lines (50 loc) • 1.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.connect = connect;
exports.useService = useService;
const react_1 = require("react");
const instance_abortController = new WeakMap();
/**
* React类组件修饰器
*/
function connect(connector, a) {
const abortOnUnmount = typeof a === 'boolean' ? a : a?.abortOnUnmount;
return (target) => {
return {
[target.name]: class extends target {
constructor(...a) {
super(...a);
if (abortOnUnmount) {
const abortController = new AbortController();
instance_abortController.set(this, abortController);
for (const k in connector) {
this[k] = new connector[k]({ signal: abortController.signal });
}
}
else {
for (const k in connector) {
this[k] = new connector[k]();
}
}
}
componentWillUnmount() {
instance_abortController.get(this)?.abort();
instance_abortController.delete(this);
super.componentWillUnmount?.();
}
}[target.name]
};
};
}
function useService(service, a) {
const abortOnUnmount = typeof a === 'boolean' ? a : a?.abortOnUnmount;
let abortController = (0, react_1.useMemo)(() => {
return abortOnUnmount ? new AbortController() : void 0;
}, [abortOnUnmount]);
(0, react_1.useEffect)(() => () => {
abortController?.abort();
}, []);
return (0, react_1.useMemo)(() => {
return new service({ signal: abortController?.signal });
}, [abortController]);
}