@tarojs/plugin-framework-react 4.0.0-beta.87 → 4.0.0-beta.88

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/runtime.js CHANGED
@@ -1,10 +1,16 @@
1
1
  import { EMPTY_OBJ, isFunction, isArray, hooks, ensure, isUndefined } from '@tarojs/shared';
2
2
  import { Current, getPageInstance, injectPageInstance, incrementId, document, perf, PAGE_INIT, getPath, window, CONTEXT_ACTIONS, safeExecute, removePageInstance, ON_READY, requestAnimationFrame, eventCenter, getOnReadyEventKey, ON_SHOW, getOnShowEventKey, ON_HIDE, getOnHideEventKey, eventHandler, addLeadingSlash } from '@tarojs/runtime';
3
+ import * as Solid from 'solid-js';
4
+ import { createContext, createMemo, useContext, createRenderEffect, onCleanup } from 'solid-js';
5
+ import * as SolidReconciler from '@tarojs/plugin-framework-react/dist/reconciler';
3
6
 
4
7
  const reactMeta = {
5
8
  PageContext: EMPTY_OBJ,
6
9
  R: EMPTY_OBJ,
7
10
  };
11
+ const solidMeta = {
12
+ PageContext: createContext(''),
13
+ };
8
14
 
9
15
  const HOOKS_APP_ID = 'taro-app';
10
16
  function isClassComponent(R, component) {
@@ -44,49 +50,87 @@ function setRouterParams(options) {
44
50
 
45
51
  const createTaroHook = (lifecycle) => {
46
52
  return (fn) => {
47
- const { R: React, PageContext } = reactMeta;
48
- const id = React.useContext(PageContext) || HOOKS_APP_ID;
49
- const instRef = React.useRef();
50
- // hold fn ref and keep up to date
51
- const fnRef = React.useRef(fn);
52
- if (fnRef.current !== fn)
53
- fnRef.current = fn;
54
- React.useLayoutEffect(() => {
55
- let inst = instRef.current = getPageInstance(id);
56
- let first = false;
57
- if (!inst) {
58
- first = true;
59
- instRef.current = Object.create(null);
60
- inst = instRef.current;
61
- }
62
- // callback is immutable but inner function is up to date
63
- const callback = (...args) => fnRef.current(...args);
64
- if (isFunction(inst[lifecycle])) {
65
- (inst[lifecycle]) = [inst[lifecycle], callback];
66
- }
67
- else {
68
- (inst[lifecycle]) = [
69
- ...((inst[lifecycle]) || []),
70
- callback
71
- ];
72
- }
73
- if (first) {
74
- injectPageInstance(inst, id);
75
- }
76
- return () => {
77
- const inst = instRef.current;
78
- if (!inst)
79
- return;
80
- const list = inst[lifecycle];
81
- if (list === callback) {
82
- (inst[lifecycle]) = undefined;
53
+ if (process.env.FRAMEWORK !== 'solid') {
54
+ const { R: React, PageContext } = reactMeta;
55
+ const id = React.useContext(PageContext) || HOOKS_APP_ID;
56
+ const instRef = React.useRef();
57
+ // hold fn ref and keep up to date
58
+ const fnRef = React.useRef(fn);
59
+ if (fnRef.current !== fn)
60
+ fnRef.current = fn;
61
+ React.useLayoutEffect(() => {
62
+ let inst = instRef.current = getPageInstance(id);
63
+ let first = false;
64
+ if (!inst) {
65
+ first = true;
66
+ instRef.current = Object.create(null);
67
+ inst = instRef.current;
83
68
  }
84
- else if (isArray(list)) {
85
- (inst[lifecycle]) = list.filter(item => item !== callback);
69
+ // callback is immutable but inner function is up to date
70
+ const callback = (...args) => fnRef.current(...args);
71
+ if (isFunction(inst[lifecycle])) {
72
+ (inst[lifecycle]) = [inst[lifecycle], callback];
86
73
  }
87
- instRef.current = undefined;
88
- };
89
- }, []);
74
+ else {
75
+ (inst[lifecycle]) = [
76
+ ...((inst[lifecycle]) || []),
77
+ callback
78
+ ];
79
+ }
80
+ if (first) {
81
+ injectPageInstance(inst, id);
82
+ }
83
+ return () => {
84
+ const inst = instRef.current;
85
+ if (!inst)
86
+ return;
87
+ const list = inst[lifecycle];
88
+ if (list === callback) {
89
+ (inst[lifecycle]) = undefined;
90
+ }
91
+ else if (isArray(list)) {
92
+ (inst[lifecycle]) = list.filter(item => item !== callback);
93
+ }
94
+ instRef.current = undefined;
95
+ };
96
+ }, []);
97
+ }
98
+ else {
99
+ const context = useContext(solidMeta.PageContext);
100
+ const id = context || HOOKS_APP_ID;
101
+ createRenderEffect(() => {
102
+ let inst = getPageInstance(id);
103
+ let first = false;
104
+ if (!inst) {
105
+ first = true;
106
+ inst = Object.create({
107
+ id: id,
108
+ type: 'page',
109
+ });
110
+ }
111
+ if (isFunction(inst[lifecycle])) {
112
+ inst[lifecycle] = [inst[lifecycle], fn];
113
+ }
114
+ else {
115
+ inst[lifecycle] = [
116
+ ...((inst[lifecycle]) || []),
117
+ fn
118
+ ];
119
+ }
120
+ if (first) {
121
+ injectPageInstance(inst, id);
122
+ }
123
+ onCleanup(() => {
124
+ const list = inst[lifecycle];
125
+ if (list === fn) {
126
+ (inst[lifecycle]) = undefined;
127
+ }
128
+ else if (isArray(list)) {
129
+ (inst[lifecycle]) = list.filter(item => item !== fn);
130
+ }
131
+ });
132
+ });
133
+ }
90
134
  };
91
135
  };
92
136
  /** LifeCycle */
@@ -115,37 +159,42 @@ const useTitleClick = createTaroHook('onTitleClick');
115
159
  /** Router */
116
160
  const useReady = createTaroHook('onReady');
117
161
  const useRouter = (dynamic = false) => {
118
- const React = reactMeta.R;
119
- return dynamic ? Current.router : React.useMemo(() => Current.router, []);
162
+ if (process.env.FRAMEWORK !== 'solid') {
163
+ const React = reactMeta.R;
164
+ return dynamic ? Current.router : React.useMemo(() => Current.router, []);
165
+ }
166
+ else {
167
+ return dynamic ? Current.router : createMemo(() => Current.router);
168
+ }
120
169
  };
121
170
  const useTabItemTap = createTaroHook('onTabItemTap');
122
171
  const useScope = () => undefined;
123
172
 
124
173
  var taroHooks = /*#__PURE__*/Object.freeze({
125
- __proto__: null,
126
- useAddToFavorites: useAddToFavorites,
127
- useDidHide: useDidHide,
128
- useDidShow: useDidShow,
129
- useError: useError,
130
- useLaunch: useLaunch,
131
- useLoad: useLoad,
132
- useOptionMenuClick: useOptionMenuClick,
133
- usePageNotFound: usePageNotFound,
134
- usePageScroll: usePageScroll,
135
- usePullDownRefresh: usePullDownRefresh,
136
- usePullIntercept: usePullIntercept,
137
- useReachBottom: useReachBottom,
138
- useReady: useReady,
139
- useResize: useResize,
140
- useRouter: useRouter,
141
- useSaveExitState: useSaveExitState,
142
- useScope: useScope,
143
- useShareAppMessage: useShareAppMessage,
144
- useShareTimeline: useShareTimeline,
145
- useTabItemTap: useTabItemTap,
146
- useTitleClick: useTitleClick,
147
- useUnhandledRejection: useUnhandledRejection,
148
- useUnload: useUnload
174
+ __proto__: null,
175
+ useAddToFavorites: useAddToFavorites,
176
+ useDidHide: useDidHide,
177
+ useDidShow: useDidShow,
178
+ useError: useError,
179
+ useLaunch: useLaunch,
180
+ useLoad: useLoad,
181
+ useOptionMenuClick: useOptionMenuClick,
182
+ usePageNotFound: usePageNotFound,
183
+ usePageScroll: usePageScroll,
184
+ usePullDownRefresh: usePullDownRefresh,
185
+ usePullIntercept: usePullIntercept,
186
+ useReachBottom: useReachBottom,
187
+ useReady: useReady,
188
+ useResize: useResize,
189
+ useRouter: useRouter,
190
+ useSaveExitState: useSaveExitState,
191
+ useScope: useScope,
192
+ useShareAppMessage: useShareAppMessage,
193
+ useShareTimeline: useShareTimeline,
194
+ useTabItemTap: useTabItemTap,
195
+ useTitleClick: useTitleClick,
196
+ useUnhandledRejection: useUnhandledRejection,
197
+ useUnload: useUnload
149
198
  });
150
199
 
151
200
  let h$1;
@@ -164,7 +213,12 @@ function setReconciler(ReactDOM) {
164
213
  });
165
214
  });
166
215
  hooks.tap('batchedEventUpdates', function (cb) {
167
- ReactDOM === null || ReactDOM === void 0 ? void 0 : ReactDOM.unstable_batchedUpdates(cb);
216
+ if (process.env.FRAMEWORK !== 'solid') {
217
+ ReactDOM === null || ReactDOM === void 0 ? void 0 : ReactDOM.unstable_batchedUpdates(cb);
218
+ }
219
+ else {
220
+ Solid.batch(cb);
221
+ }
168
222
  });
169
223
  hooks.tap('mergePageInstance', function (prev, next) {
170
224
  if (!prev || !next)
@@ -179,7 +233,8 @@ function setReconciler(ReactDOM) {
179
233
  next[item] = nextList.concat(prevList);
180
234
  });
181
235
  });
182
- if (process.env.TARO_PLATFORM === 'web') {
236
+ // TODO 使用 solid 时,暂不支持以下事件
237
+ if (process.env.TARO_PLATFORM === 'web' && process.env.FRAMEWORK !== 'solid') {
183
238
  hooks.tap('createPullDownComponent', (el, _, R, customWrapper) => {
184
239
  const isReactComponent = isClassComponent(R, el);
185
240
  return R.forwardRef((props, ref) => {
@@ -281,12 +336,7 @@ function createReactApp(App, react, dom, config) {
281
336
  return appInstanceRef.current;
282
337
  }
283
338
  function waitAppWrapper(cb) {
284
- /**
285
- * 当同个事件触发多次时,waitAppWrapper 会出现同步和异步任务的执行顺序问题,
286
- * 导致某些场景下 onShow 会优于 onLaunch 执行
287
- */
288
- appWrapperPromise.then(() => cb());
289
- // appWrapper ? cb() : appWrapperPromise.then(() => cb())
339
+ appWrapper ? cb() : appWrapperPromise.then(() => cb());
290
340
  }
291
341
  function renderReactRoot() {
292
342
  var _a, _b;
@@ -359,12 +409,7 @@ function createReactApp(App, react, dom, config) {
359
409
  }
360
410
  },
361
411
  unmount(id, cb) {
362
- if (appWrapper) {
363
- appWrapper.unmount(id, cb);
364
- }
365
- else {
366
- appWrapperPromise.then(appWrapper => appWrapper.unmount(id, cb));
367
- }
412
+ appWrapper.unmount(id, cb);
368
413
  }
369
414
  }, {
370
415
  config: setDefaultDescriptor({
@@ -493,6 +538,161 @@ function createReactApp(App, react, dom, config) {
493
538
  Current.app = appObj;
494
539
  return appObj;
495
540
  }
541
+ function createSolidApp(App, config) {
542
+ setReconciler();
543
+ const appRef = {
544
+ mount: () => { },
545
+ unmount: () => { },
546
+ };
547
+ function getAppInstance() {
548
+ return appRef;
549
+ }
550
+ function AppWrapper() {
551
+ const [pages, setPages] = Solid.createSignal([]);
552
+ appRef.mount = (component, id) => {
553
+ setPages((old) => {
554
+ return [...old, { id, component }];
555
+ });
556
+ };
557
+ appRef.unmount = (id) => {
558
+ setPages(pages().filter((item) => {
559
+ return item.id !== id;
560
+ }));
561
+ };
562
+ return SolidReconciler.createComponent(App, {
563
+ ref: appRef,
564
+ children: SolidReconciler.createComponent(Solid.For, {
565
+ get each() {
566
+ return pages();
567
+ },
568
+ children: ({ id, component }) => {
569
+ const children = () => SolidReconciler.createComponent(solidMeta.PageContext.Provider, {
570
+ value: id,
571
+ children: () => {
572
+ injectPageInstance({ id: id, type: 'page' }, id);
573
+ return SolidReconciler.createComponent(component, {
574
+ tid: id,
575
+ });
576
+ },
577
+ });
578
+ const root = process.env.TARO_PLATFORM === 'web'
579
+ ? document.createElement('div')
580
+ : SolidReconciler.createElement('root');
581
+ if (process.env.TARO_PLATFORM === 'web') {
582
+ root.setAttribute('id', id);
583
+ root.classList.add('taro_page');
584
+ }
585
+ else {
586
+ SolidReconciler.setProp(root, 'id', id);
587
+ }
588
+ SolidReconciler.insert(root, children);
589
+ return root;
590
+ },
591
+ }),
592
+ });
593
+ }
594
+ function renderSolidRoot() {
595
+ let appId = 'app';
596
+ if (process.env.TARO_PLATFORM === 'web') {
597
+ appId = (config === null || config === void 0 ? void 0 : config.appId) || appId;
598
+ }
599
+ const container = document.getElementById(appId);
600
+ SolidReconciler.render(AppWrapper, container);
601
+ }
602
+ if (process.env.TARO_PLATFORM !== 'web') {
603
+ renderSolidRoot();
604
+ }
605
+ const [ONLAUNCH, ONSHOW, ONHIDE] = hooks.call('getMiniLifecycleImpl').app;
606
+ const appObj = Object.create({
607
+ mount(component, id, cb) {
608
+ const appInstance = getAppInstance();
609
+ appInstance === null || appInstance === void 0 ? void 0 : appInstance.mount(component, id);
610
+ Solid.batch((...args) => {
611
+ perf.stop(PAGE_INIT);
612
+ return cb(...args);
613
+ });
614
+ },
615
+ unmount(id, cb) {
616
+ const appInstance = getAppInstance();
617
+ appInstance === null || appInstance === void 0 ? void 0 : appInstance.unmount(id);
618
+ Solid.batch(cb);
619
+ },
620
+ }, {
621
+ config: setDefaultDescriptor({
622
+ configurable: true,
623
+ value: config,
624
+ }),
625
+ [ONLAUNCH]: setDefaultDescriptor({
626
+ value(options) {
627
+ setRouterParams(options);
628
+ if (process.env.TARO_PLATFORM === 'web') {
629
+ renderSolidRoot();
630
+ }
631
+ const onLaunch = () => {
632
+ var _a;
633
+ const app = getAppInstance();
634
+ if (app) {
635
+ // 把 App Class 上挂载的额外属性同步到全局 app 对象中
636
+ if (app.taroGlobalData) {
637
+ const globalData = app.taroGlobalData;
638
+ const keys = Object.keys(globalData);
639
+ const descriptors = Object.getOwnPropertyDescriptors(globalData);
640
+ keys.forEach(key => {
641
+ Object.defineProperty(this, key, {
642
+ configurable: true,
643
+ enumerable: true,
644
+ get() {
645
+ return globalData[key];
646
+ },
647
+ set(value) {
648
+ globalData[key] = value;
649
+ }
650
+ });
651
+ });
652
+ Object.defineProperties(this, descriptors);
653
+ }
654
+ (_a = app.onCreate) === null || _a === void 0 ? void 0 : _a.call(app);
655
+ }
656
+ };
657
+ onLaunch();
658
+ triggerAppHook('onLaunch', options);
659
+ },
660
+ }),
661
+ [ONSHOW]: setDefaultDescriptor({
662
+ value(options) {
663
+ setRouterParams(options);
664
+ triggerAppHook('onShow', options);
665
+ },
666
+ }),
667
+ [ONHIDE]: setDefaultDescriptor({
668
+ value() {
669
+ triggerAppHook('onHide');
670
+ },
671
+ }),
672
+ onError: setDefaultDescriptor({
673
+ value(error) {
674
+ triggerAppHook('onError', error);
675
+ },
676
+ }),
677
+ onPageNotFound: setDefaultDescriptor({
678
+ value(res) {
679
+ triggerAppHook('onPageNotFound', res);
680
+ },
681
+ }),
682
+ });
683
+ function triggerAppHook(lifecycle, ...option) {
684
+ const instance = getPageInstance(HOOKS_APP_ID);
685
+ if (instance) {
686
+ const app = getAppInstance();
687
+ const func = hooks.call('getLifecycle', instance, lifecycle);
688
+ if (Array.isArray(func)) {
689
+ func.forEach((cb) => cb.apply(app, option));
690
+ }
691
+ }
692
+ }
693
+ Current.app = appObj;
694
+ return appObj;
695
+ }
496
696
 
497
697
  const getNativeCompId = incrementId();
498
698
  let h;
@@ -962,5 +1162,5 @@ if (process.env.FRAMEWORK === 'preact' && process.env.TARO_PLATFORM === 'mini')
962
1162
  // })
963
1163
  }
964
1164
 
965
- export { connectReactPage, createH5NativeComponentConfig, createNativeComponentConfig, createNativePageConfig, createReactApp, setReconciler, useAddToFavorites, useDidHide, useDidShow, useError, useLaunch, useLoad, useOptionMenuClick, usePageNotFound, usePageScroll, usePullDownRefresh, usePullIntercept, useReachBottom, useReady, useResize, useRouter, useSaveExitState, useScope, useShareAppMessage, useShareTimeline, useTabItemTap, useTitleClick, useUnhandledRejection, useUnload };
1165
+ export { connectReactPage, createH5NativeComponentConfig, createNativeComponentConfig, createNativePageConfig, createReactApp, createSolidApp, setReconciler, useAddToFavorites, useDidHide, useDidShow, useError, useLaunch, useLoad, useOptionMenuClick, usePageNotFound, usePageScroll, usePullDownRefresh, usePullIntercept, useReachBottom, useReady, useResize, useRouter, useSaveExitState, useScope, useShareAppMessage, useShareTimeline, useTabItemTap, useTitleClick, useUnhandledRejection, useUnload };
966
1166
  //# sourceMappingURL=runtime.js.map