@taro-hooks/use-request
Version:
useRequest hook for Taro
104 lines (103 loc) • 4.82 kB
JavaScript
;
var _excluded = ["manual"];
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
Object.defineProperty(exports, "__esModule", {
value: true
});
var tslib_1 = require("tslib");
var ahooks_1 = require("@taro-hooks/ahooks");
var core_1 = require("@taro-hooks/core");
var shared_1 = require("@taro-hooks/shared");
var Fetch_1 = tslib_1.__importDefault(require("./Fetch"));
function useRequestImplement(service, options, plugins) {
if (options === void 0) {
options = {};
}
if (plugins === void 0) {
plugins = [];
}
var _options = options,
_options$manual = _options.manual,
manual = _options$manual === void 0 ? false : _options$manual,
rest = _objectWithoutPropertiesLoose(_options, _excluded);
var fetchOptions = _extends({
manual: manual
}, rest);
var serviceRef = (0, ahooks_1.useLatest)(service);
var update = (0, ahooks_1.useUpdate)();
var fetchInstance = (0, core_1.useMemo)(function () {
var initState = plugins.map(function (p) {
return p == null ? void 0 : p.onInit == null ? void 0 : p.onInit(fetchOptions);
}).filter(Boolean);
var fetch = new Fetch_1["default"](
// @ts-ignore
serviceRef, fetchOptions, update, Object.assign.apply(Object, [{}].concat(initState)));
return fetch;
}, []);
// react can not call hooks in other hooks. we use env to fix it
if (shared_1.FRAMEWORK === 'react') {
fetchInstance.options = fetchOptions;
// run all plugins hooks
fetchInstance.pluginImpls = plugins.map(function (p) {
return p(fetchInstance, fetchOptions);
});
} else if (shared_1.FRAMEWORK === 'vue') {
// TODO: maybe find a better way to hold reactive
// @ts-ignore
fetchInstance.value.options = fetchOptions;
// run all plugins hooks
// @ts-ignore
fetchInstance.value.pluginImpls = plugins.map(function (p) {
return (
// @ts-ignore
p(fetchInstance.value, fetchOptions)
);
});
}
(0, ahooks_1.useMount)(function () {
if (!manual) {
// useCachePlugin can set fetchInstance.state.params from cache when init
var instance = (0, shared_1.escapeState)(fetchInstance);
var params = instance.state.params || options.defaultParams || [];
// @ts-ignore
instance.run.apply(instance, params);
}
});
(0, ahooks_1.useUnmount)(function () {
var _ref;
(_ref = (0, shared_1.escapeState)(fetchInstance)) == null ? void 0 : _ref.cancel == null ? void 0 : _ref.cancel();
});
// due to vue reactive, need reduce single for useMemo
// ugly
var vueRefResult = (0, core_1.useMemo)(function () {
return {
loading: (0, shared_1.escapeState)(fetchInstance).state.loading,
data: (0, shared_1.escapeState)(fetchInstance).state.data,
error: (0, shared_1.escapeState)(fetchInstance).state.error,
params: (0, shared_1.escapeState)(fetchInstance).state.params || [],
cancel: (0, shared_1.escapeState)(fetchInstance).cancel.bind((0, shared_1.escapeState)(fetchInstance)),
refresh: (0, shared_1.escapeState)(fetchInstance).refresh.bind((0, shared_1.escapeState)(fetchInstance)),
refreshAsync: (0, shared_1.escapeState)(fetchInstance).refreshAsync.bind((0, shared_1.escapeState)(fetchInstance)),
run: (0, shared_1.escapeState)(fetchInstance).run.bind((0, shared_1.escapeState)(fetchInstance)),
runAsync: (0, shared_1.escapeState)(fetchInstance).runAsync.bind((0, shared_1.escapeState)(fetchInstance)),
mutate: (0, shared_1.escapeState)(fetchInstance).mutate.bind((0, shared_1.escapeState)(fetchInstance))
};
}, [fetchInstance]);
if (shared_1.FRAMEWORK === 'vue') {
return vueRefResult;
}
return {
loading: fetchInstance.state.loading,
data: fetchInstance.state.data,
error: fetchInstance.state.error,
params: fetchInstance.state.params || [],
cancel: (0, ahooks_1.useMemoizedFn)(fetchInstance.cancel.bind(fetchInstance)),
refresh: (0, ahooks_1.useMemoizedFn)(fetchInstance.refresh.bind(fetchInstance)),
refreshAsync: (0, ahooks_1.useMemoizedFn)(fetchInstance.refreshAsync.bind(fetchInstance)),
run: (0, ahooks_1.useMemoizedFn)(fetchInstance.run.bind(fetchInstance)),
runAsync: (0, ahooks_1.useMemoizedFn)(fetchInstance.runAsync.bind(fetchInstance)),
mutate: (0, ahooks_1.useMemoizedFn)(fetchInstance.mutate.bind(fetchInstance))
};
}
exports["default"] = useRequestImplement;