UNPKG

@vue-widget/hooks

Version:

hooks from react to vue

68 lines (67 loc) 3.21 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useUrlState = void 0; var _tslib = require("tslib"); var _qs = _interopRequireDefault(require("qs")); var _useMemo = require("../useMemo"); var _useMemoizedFn = require("../useMemoizedFn"); var _vue = require("vue"); var _isDev = _interopRequireDefault(require("../utils/isDev")); var _isBrowser = _interopRequireDefault(require("../utils/isBrowser")); var _rins = null; var baseParseConfig = {}; var baseStringifyConfig = {}; var w = typeof window !== "undefined" ? window : null; var globalQuery = (0, _vue.ref)(getQuery()); function getQuery() { return ((w === null || w === void 0 ? void 0 : w.location.search) || "").replace(/^\?/, ""); } var useUrlState = exports.useUrlState = function useUrlState(initialState, options) { if (_isDev["default"] && !_isBrowser["default"]) { console.error("useUrlState expected to used in browser"); } var _a = options || {}, _b = _a.navigateMode, navigateMode = _b === void 0 ? "push" : _b, parseOptions = _a.parseOptions, stringifyOptions = _a.stringifyOptions; var mergedParseOptions = (0, _tslib.__assign)((0, _tslib.__assign)({}, baseParseConfig), parseOptions); var mergedStringifyOptions = (0, _tslib.__assign)((0, _tslib.__assign)({}, baseStringifyConfig), stringifyOptions); var initialStateRef = (0, _vue.ref)(typeof initialState === "function" ? initialState() : initialState || {}); var _route = _rins === null || _rins === void 0 ? void 0 : _rins.useRoute(); var _router = _rins === null || _rins === void 0 ? void 0 : _rins.useRouter(); var queryFromUrl = (0, _useMemo.useMemo)(function () { var query = getQuery(); if (_rins) query = _qs["default"].stringify(_route === null || _route === void 0 ? void 0 : _route.query, mergedStringifyOptions); return _qs["default"].parse(query, mergedParseOptions); }, [globalQuery, function () { return _route === null || _route === void 0 ? void 0 : _route.query; }]); var targetQuery = (0, _useMemo.useMemo)(function () { return (0, _tslib.__assign)((0, _tslib.__assign)({}, initialStateRef.value), queryFromUrl.value); }, [queryFromUrl]); var setState = function setState(s) { var newQuery = typeof s === "function" ? s(targetQuery.value) : s; var urlObj = new URL((w === null || w === void 0 ? void 0 : w.location.href) || ""); var mergedParams = (0, _tslib.__assign)((0, _tslib.__assign)({}, queryFromUrl.value), newQuery); var queryString = _qs["default"].stringify(mergedParams, mergedStringifyOptions) || ""; urlObj.search = queryString; globalQuery.value = queryString; // 替换当前窗口的URL if (_rins) { _router[navigateMode === "replace" ? "replace" : "push"]({ path: _route.path, query: mergedParams }); } else if (w) { w.history[navigateMode === "replace" ? "replaceState" : "pushState"](w.history.state, document.title, urlObj.toString()); } }; return [targetQuery, (0, _useMemoizedFn.useMemoizedFn)(setState)]; }; useUrlState.use = function (regist) { return _rins = regist; };