UNPKG

@canlooks/ajax

Version:
47 lines (46 loc) 1.72 kB
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]); }