UNPKG

@canlooks/ajax

Version:
51 lines (50 loc) 1.87 kB
"use strict"; 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]); }