@canlooks/ajax
Version:
A private tool
47 lines (46 loc) • 1.72 kB
JavaScript
import { useEffect, useMemo } from 'react';
const instance_abortController = new WeakMap();
/**
* React类组件修饰器
*/
export 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]
};
};
}
export function useService(service, a) {
const abortOnUnmount = typeof a === 'boolean' ? a : a?.abortOnUnmount;
let abortController = useMemo(() => {
return abortOnUnmount ? new AbortController() : void 0;
}, [abortOnUnmount]);
useEffect(() => () => {
abortController?.abort();
}, []);
return useMemo(() => {
return new service({ signal: abortController?.signal });
}, [abortController]);
}