123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
- if (ar || !(i in from)) {
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
- ar[i] = from[i];
- }
- }
- return to.concat(ar || Array.prototype.slice.call(from));
- };
- import { useEffect, createContext, useContext, useRef, useCallback, } from './r.js';
- import { instanceKeyPropNames } from './utils.js';
- import { checkIfPlatformIsLoadCorrectly, } from './platform.js';
- //@ts-expect-error
- function generateEventHookName(eventName) {
- return "use".concat(eventName[0].toUpperCase()).concat(eventName.slice(1));
- }
- export var reactContext = createContext(null);
- // --------------------------
- function useAppxContext() {
- var appxInstanceContext = useContext(reactContext);
- if (!appxInstanceContext) {
- throw new Error('请不要在组件内调用 hooks');
- }
- return appxInstanceContext;
- }
- function useEventCall(name, handler, disableMultiImpl) {
- var realHandler = useStableCallback(handler);
- var appxInstanceContext = useAppxContext();
- if (appxInstanceContext.ifServerRender) {
- // 虚拟渲染时,注册空实现
- appxInstanceContext.handlersController.addHandler(name, {}, function () { }, false);
- }
- useEffect(function () {
- var off = appxInstanceContext.handlersController.addHandler(name, appxInstanceContext.instance,
- //@ts-expect-error
- function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- return realHandler.apply(undefined, args);
- }, disableMultiImpl);
- return off;
- }, []);
- }
- export function useStableCallback(callback) {
- var fnRef = useRef();
- fnRef.current = callback;
- var memoFn = useCallback((function () {
- var _a;
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- return (_a = fnRef.current) === null || _a === void 0 ? void 0 : _a.call.apply(_a, __spreadArray([fnRef], args, false));
- }), []);
- return memoFn;
- }
- // 注册和更新 handler,注意只能更新第一次注册过的 handler 实现,不允许变更数量和 key
- export function useEvent(name, handler,
- /**
- *
- */
- depsOrOptions) {
- var appxInstanceContext = useAppxContext();
- var platformConfig = appxInstanceContext.platformConfig, instance = appxInstanceContext.instance;
- var pageEvents = platformConfig.pageEvents, componentEvents = platformConfig.componentEvents, blockedProperty = platformConfig.blockedProperty;
- if (pageEvents.indexOf(name) >= 0 || componentEvents.indexOf(name) >= 0) {
- throw new Error("\u5C0F\u7A0B\u5E8F ".concat(name, " \u662F\u751F\u547D\u5468\u671F\u76F8\u5173\u7684\u4FDD\u7559\u65B9\u6CD5\uFF0C\u4E0D\u5141\u8BB8\u4F7F\u7528\u6B64\u79CD\u65B9\u6CD5\u6CE8\u518C\uFF0C\u8BF7\u4F7F\u7528\u5BF9\u5E94\u7684 hooks: ").concat(generateEventHookName(name)));
- }
- else if (blockedProperty.indexOf(name) >= 0) {
- throw new Error("\u4E0D\u5141\u8BB8\u6CE8\u518C\u540D\u4E3A ".concat(name, " \u7684\u4E8B\u4EF6\u5904\u7406\u51FD\u6570\uFF0C\u8FD9\u662F\u5C0F\u7A0B\u5E8F\u7684\u4FDD\u7559\u5C5E\u6027\uFF0C\u8BF7\u6362\u4E00\u4E2A\u540D\u79F0"));
- }
- if (Array.isArray(depsOrOptions)) {
- console.warn("useEventCall ".concat(name, ": hooks \u7684 deps \u5DF2\u5E9F\u5F03\uFF0C\u65E0\u9700\u586B\u5199\u3002"));
- }
- var putMethodOnData = !Array.isArray(depsOrOptions) &&
- (depsOrOptions === null || depsOrOptions === void 0 ? void 0 : depsOrOptions.handleResult) &&
- !platformConfig.supportHandleEventResult;
- // 对于同一个 name ,此变量永久不变,所以可以用 if else 写 hooks
- if (putMethodOnData) {
- var stableHandler_1 = useStableCallback(handler);
- useEffect(function () {
- var _a;
- if (instance.properties &&
- typeof instance.properties[name] !== 'undefined') {
- throw new Error("\u4E8B\u4EF6 ".concat(name, " \u6CE8\u518C\u5931\u8D25\uFF0C\u5728 handleResult \u5F00\u542F\u540E\uFF0C\u4E8B\u4EF6\u4E0D\u80FD\u540C\u65F6\u5728 properties \u4E0E useEvent \u4E2D\u5B9A\u4E49\u3002"));
- }
- instance.setData((_a = {},
- _a[name] = stableHandler_1,
- _a));
- }, []);
- }
- else {
- useEventCall(name, handler, true);
- }
- }
- export function getLifeCycleHooks(eventName, disableMultiImpl, specifyPlatform) {
- if (disableMultiImpl === void 0) { disableMultiImpl = false; }
- return function (handler,
- /**
- * @deprecated 无需填写依赖
- */
- deps) {
- var appxInstanceContext = useAppxContext();
- if (specifyPlatform) {
- var platformConfig = appxInstanceContext.platformConfig;
- checkIfPlatformIsLoadCorrectly(platformConfig, specifyPlatform);
- }
- useEventCall(eventName, handler, disableMultiImpl);
- };
- }
- export function useSyncMiniData(data) {
- if (data === void 0) { data = {}; }
- var appxInstanceContext = useAppxContext();
- // const propKeys = appxInstanceContext
- if (!appxInstanceContext.instance) {
- throw new Error('cannot get appx instance, failed to set data');
- }
- var lastDataRef = useRef();
- if (appxInstanceContext.ifServerRender) {
- appxInstanceContext.instance.setData(data);
- }
- var debugLog = appxInstanceContext.debugLog || function () { };
- if (typeof data !== 'object')
- throw new Error("\u51FD\u6570\u8FD4\u56DE\u7684\u6570\u636E\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61\uFF0C\u6536\u5230\u4E86 ".concat(typeof data));
- // 这里是一个每次都要跑的 passive effect
- var instance = appxInstanceContext.instance;
- var propNames = instance[instanceKeyPropNames] || []; // 微信的 data 里包含了 props,要手动踢掉
- var pendingData = {};
- var previousData = instance.data || {};
- // 比对一下,只 set 不同的部分
- for (var key in data) {
- if (!Object.prototype.hasOwnProperty.call(data, key))
- continue;
- //@ts-expect-error
- if (typeof data[key] === 'function')
- throw new Error("".concat(key, " - \u4E0D\u5141\u8BB8\u4F20\u5165\u51FD\u6570\u7C7B\u578B\u7684\u6570\u636E")); // 暂不支持,有需求再说
- //@ts-expect-error
- if (!previousData[key] || previousData[key] !== data[key]) {
- //@ts-expect-error
- pendingData[key] = data[key];
- }
- if (typeof previousData[key] === 'function') {
- throw new Error("".concat(key, " - \u7981\u6B62\u4FEE\u6539 data \u4E0A\u5DF2\u7ECF\u5B58\u5728\u7684\u51FD\u6570"));
- }
- }
- // 如果之前同步过 data,但是这次没有传入,就把之前的值设置成 null
- // 这里用的是 lastDataRef 而不是 previousData,是因为 previousData 里可能有用户通过 this.data[key] 直接修改的值
- if (lastDataRef.current) {
- // 缺少某些 key,就设置成 null
- for (var _i = 0, _a = Object.keys(lastDataRef.current); _i < _a.length; _i++) {
- var key = _a[_i];
- if (propNames.indexOf(key) >= 0)
- continue;
- if (!Object.prototype.hasOwnProperty.call(data, key)) {
- //@ts-expect-error
- pendingData[key] = null;
- }
- }
- }
- if (Object.keys(pendingData).length > 0) {
- debugLog('calling setData', pendingData);
- instance.setData(pendingData);
- }
- lastDataRef.current = data;
- }
- function useMiniInstance() {
- var appxInstanceContext = useAppxContext();
- return appxInstanceContext.instance;
- }
- export var usePage = useMiniInstance;
- export var useComponent = useMiniInstance;
|