@mpxjs/webpack-plugin 2.10.17 → 2.10.18-beta.2
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/lib/config.js +60 -0
- package/lib/file-loader.js +4 -1
- package/lib/global.d.ts +231 -0
- package/lib/index.js +70 -73
- package/lib/init.js +3 -0
- package/lib/json-compiler/index.js +13 -4
- package/lib/loader.js +4 -0
- package/lib/platform/json/wx/index.js +6 -0
- package/lib/platform/style/wx/index.js +102 -72
- package/lib/platform/template/wx/component-config/ad.js +5 -0
- package/lib/platform/template/wx/component-config/button.js +10 -3
- package/lib/platform/template/wx/component-config/camera.js +25 -3
- package/lib/platform/template/wx/component-config/canvas.js +8 -1
- package/lib/platform/template/wx/component-config/cover-image.js +7 -2
- package/lib/platform/template/wx/component-config/cover-view.js +3 -1
- package/lib/platform/template/wx/component-config/form.js +27 -2
- package/lib/platform/template/wx/component-config/image.js +5 -0
- package/lib/platform/template/wx/component-config/input.js +10 -0
- package/lib/platform/template/wx/component-config/label.js +10 -2
- package/lib/platform/template/wx/component-config/map.js +11 -0
- package/lib/platform/template/wx/component-config/movable-area.js +4 -1
- package/lib/platform/template/wx/component-config/movable-view.js +17 -2
- package/lib/platform/template/wx/component-config/navigator.js +26 -0
- package/lib/platform/template/wx/component-config/picker-view.js +12 -0
- package/lib/platform/template/wx/component-config/picker.js +3 -1
- package/lib/platform/template/wx/component-config/progress.js +11 -1
- package/lib/platform/template/wx/component-config/rich-text.js +5 -0
- package/lib/platform/template/wx/component-config/scroll-view.js +12 -1
- package/lib/platform/template/wx/component-config/slider.js +8 -0
- package/lib/platform/template/wx/component-config/swiper-item.js +5 -2
- package/lib/platform/template/wx/component-config/swiper.js +10 -0
- package/lib/platform/template/wx/component-config/text.js +5 -0
- package/lib/platform/template/wx/component-config/textarea.js +19 -2
- package/lib/platform/template/wx/component-config/unsupported.js +10 -1
- package/lib/platform/template/wx/component-config/video.js +10 -0
- package/lib/platform/template/wx/index.js +21 -1
- package/lib/react/LoadAsyncChunkModule.js +1 -1
- package/lib/react/processStyles.js +21 -9
- package/lib/react/script-helper.js +2 -2
- package/lib/react/style-helper.js +76 -13
- package/lib/resolver/AddModePlugin.js +17 -7
- package/lib/resolver/ExtendComponentsPlugin.js +60 -0
- package/lib/runtime/components/ali/mpx-section-list.mpx +566 -0
- package/lib/runtime/components/ali/mpx-sticky-header.mpx +212 -0
- package/lib/runtime/components/ali/mpx-sticky-section.mpx +17 -0
- package/lib/runtime/components/react/animationHooks/index.ts +75 -0
- package/lib/runtime/components/react/animationHooks/useAnimationAPIHooks.ts +197 -0
- package/lib/runtime/components/react/animationHooks/useTransitionHooks.ts +301 -0
- package/lib/runtime/components/react/animationHooks/utils.ts +197 -0
- package/lib/runtime/components/react/context.ts +12 -3
- package/lib/runtime/components/react/dist/animationHooks/index.d.ts +15 -0
- package/lib/runtime/components/react/dist/animationHooks/index.js +67 -0
- package/lib/runtime/components/react/dist/animationHooks/useAnimationAPIHooks.d.ts +3 -0
- package/lib/runtime/components/react/dist/animationHooks/useAnimationAPIHooks.js +181 -0
- package/lib/runtime/components/react/dist/animationHooks/useTransitionHooks.d.ts +3 -0
- package/lib/runtime/components/react/dist/animationHooks/useTransitionHooks.js +279 -0
- package/lib/runtime/components/react/dist/animationHooks/utils.d.ts +109 -0
- package/lib/runtime/components/react/dist/animationHooks/utils.js +151 -0
- package/lib/runtime/components/react/dist/context.d.ts +10 -3
- package/lib/runtime/components/react/dist/context.js +1 -2
- package/lib/runtime/components/react/dist/event.config.d.ts +0 -1
- package/lib/runtime/components/react/dist/getInnerListeners.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-async-suspense.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-async-suspense.jsx +3 -1
- package/lib/runtime/components/react/dist/mpx-button.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-camera.d.ts +31 -0
- package/lib/runtime/components/react/dist/mpx-camera.jsx +236 -0
- package/lib/runtime/components/react/dist/mpx-canvas/Bus.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/CanvasGradient.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/CanvasRenderingContext2D.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/Image.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/ImageData.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/constructorsRegistry.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/html.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/index.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/utils.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-checkbox-group.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-checkbox.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-form.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-icon/index.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-image.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-image.jsx +2 -2
- package/lib/runtime/components/react/dist/mpx-inline-text.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-input.d.ts +2 -1
- package/lib/runtime/components/react/dist/mpx-input.jsx +66 -50
- package/lib/runtime/components/react/dist/mpx-keyboard-avoiding-view.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-keyboard-avoiding-view.jsx +35 -6
- package/lib/runtime/components/react/dist/mpx-label.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-movable-area.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-movable-view.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-nav.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-navigator.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/date.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/dateData.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/index.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/multiSelector.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/region.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/regionData.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/selector.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/time.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/type.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view/index.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view/pickerVIewContext.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view-column/index.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewColumnItem.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewColumnItemLite.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewFaces.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewIndicator.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewMask.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-popup/index.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-popup/popupBase.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-portal/index.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-portal/portal-host.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-portal/portal-manager.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-portal/portal-manager.jsx +2 -2
- package/lib/runtime/components/react/dist/mpx-progress.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-radio-group.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-radio.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-rich-text/html.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-rich-text/index.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-root-portal.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-scroll-view.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-scroll-view.jsx +84 -78
- package/lib/runtime/components/react/dist/mpx-section-list.d.ts +48 -0
- package/lib/runtime/components/react/dist/mpx-section-list.jsx +292 -0
- package/lib/runtime/components/react/dist/mpx-simple-text.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-simple-view.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-slider.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-sticky-header.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-sticky-header.jsx +20 -20
- package/lib/runtime/components/react/dist/mpx-sticky-section.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-swiper-item.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-swiper.d.ts +11 -1
- package/lib/runtime/components/react/dist/mpx-swiper.jsx +136 -83
- package/lib/runtime/components/react/dist/mpx-switch.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-text.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-textarea.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-textarea.jsx +1 -0
- package/lib/runtime/components/react/dist/mpx-video.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-view.d.ts +3 -3
- package/lib/runtime/components/react/dist/mpx-view.jsx +22 -8
- package/lib/runtime/components/react/dist/mpx-web-view.d.ts +0 -1
- package/lib/runtime/components/react/dist/mpx-web-view.jsx +1 -1
- package/lib/runtime/components/react/dist/parser.d.ts +0 -1
- package/lib/runtime/components/react/dist/useNodesRef.d.ts +0 -1
- package/lib/runtime/components/react/dist/utils.d.ts +10 -9
- package/lib/runtime/components/react/dist/utils.jsx +47 -24
- package/lib/runtime/components/react/mpx-async-suspense.tsx +3 -1
- package/lib/runtime/components/react/mpx-camera.tsx +327 -0
- package/lib/runtime/components/react/mpx-image.tsx +2 -2
- package/lib/runtime/components/react/mpx-input.tsx +77 -54
- package/lib/runtime/components/react/mpx-keyboard-avoiding-view.tsx +35 -6
- package/lib/runtime/components/react/mpx-portal/portal-manager.tsx +2 -2
- package/lib/runtime/components/react/mpx-scroll-view.tsx +110 -114
- package/lib/runtime/components/react/mpx-section-list.tsx +439 -0
- package/lib/runtime/components/react/mpx-sticky-header.tsx +24 -24
- package/lib/runtime/components/react/mpx-swiper.tsx +156 -81
- package/lib/runtime/components/react/mpx-textarea.tsx +1 -0
- package/lib/runtime/components/react/mpx-view.tsx +27 -12
- package/lib/runtime/components/react/mpx-web-view.tsx +1 -1
- package/lib/runtime/components/react/tsconfig.json +26 -0
- package/lib/runtime/components/react/types/global.d.ts +1 -0
- package/lib/runtime/components/react/utils.tsx +51 -27
- package/lib/runtime/components/web/mpx-scroll-view.vue +5 -2
- package/lib/runtime/components/web/mpx-section-list.vue +551 -0
- package/lib/runtime/components/wx/mpx-section-list-default/list-footer.mpx +26 -0
- package/lib/runtime/components/wx/mpx-section-list-default/list-header.mpx +26 -0
- package/lib/runtime/components/wx/mpx-section-list-default/list-item.mpx +26 -0
- package/lib/runtime/components/wx/mpx-section-list-default/section-header.mpx +26 -0
- package/lib/runtime/components/wx/mpx-section-list.mpx +209 -0
- package/lib/runtime/components/wx/mpx-sticky-header.mpx +40 -0
- package/lib/runtime/components/wx/mpx-sticky-section.mpx +31 -0
- package/lib/runtime/optionProcessor.js +5 -0
- package/lib/runtime/optionProcessorReact.js +7 -0
- package/lib/runtime/stringify.wxs +2 -2
- package/lib/script-setup-compiler/index.js +1 -2
- package/lib/style-compiler/strip-conditional.js +244 -0
- package/lib/template-compiler/compiler.js +9 -8
- package/lib/utils/const.js +29 -0
- package/lib/utils/dom-tag-config.js +1 -1
- package/lib/utils/string.js +25 -1
- package/lib/wxss/loader.js +4 -1
- package/lib/wxss/utils.js +7 -2
- package/package.json +7 -14
- package/LICENSE +0 -433
- package/lib/runtime/components/react/dist/context.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/event.config.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/getInnerListeners.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-async-suspense.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-button.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/Bus.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/CanvasGradient.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/CanvasRenderingContext2D.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/Image.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/ImageData.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/constructorsRegistry.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/html.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/index.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-canvas/utils.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-checkbox-group.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-checkbox.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-form.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-icon/index.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-image.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-inline-text.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-input.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-keyboard-avoiding-view.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-label.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-movable-area.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-movable-view.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-nav.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-navigator.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/date.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/dateData.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/index.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/multiSelector.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/region.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/regionData.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/selector.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/time.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker/type.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view/index.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view/pickerVIewContext.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view-column/index.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewColumnItem.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewColumnItemLite.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewFaces.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewIndicator.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-picker-view-column/pickerViewMask.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-popup/index.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-popup/popupBase.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-portal/index.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-portal/portal-host.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-portal/portal-manager.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-progress.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-radio-group.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-radio.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-rich-text/html.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-rich-text/index.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-root-portal.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-scroll-view.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-simple-text.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-simple-view.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-slider.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-sticky-header.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-sticky-section.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-swiper-item.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-swiper.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-switch.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-text.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-textarea.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-video.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-view.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/mpx-web-view.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/parser.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/useAnimationHooks.d.ts +0 -33
- package/lib/runtime/components/react/dist/useAnimationHooks.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/useAnimationHooks.js +0 -289
- package/lib/runtime/components/react/dist/useNodesRef.d.ts.map +0 -1
- package/lib/runtime/components/react/dist/utils.d.ts.map +0 -1
- package/lib/runtime/components/react/useAnimationHooks.ts +0 -320
- package/lib/style-compiler/strip-conditional-loader.js +0 -289
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* ✔ selection-start
|
|
19
19
|
* ✔ selection-end
|
|
20
20
|
* ✔ adjust-position
|
|
21
|
-
*
|
|
21
|
+
* ✔ hold-keyboard
|
|
22
22
|
* ✘ safe-password-cert-path
|
|
23
23
|
* ✘ safe-password-length
|
|
24
24
|
* ✘ safe-password-time-stamp
|
|
@@ -54,7 +54,7 @@ import {
|
|
|
54
54
|
NativeTouchEvent
|
|
55
55
|
} from 'react-native'
|
|
56
56
|
import { warn } from '@mpxjs/utils'
|
|
57
|
-
import { useUpdateEffect, useTransformStyle, useLayout, extendObject,
|
|
57
|
+
import { useUpdateEffect, useTransformStyle, useLayout, extendObject, isAndroid } from './utils'
|
|
58
58
|
import useInnerProps, { getCustomEvent } from './getInnerListeners'
|
|
59
59
|
import useNodesRef, { HandlerRef } from './useNodesRef'
|
|
60
60
|
import { FormContext, FormFieldValue, KeyboardAvoidContext } from './context'
|
|
@@ -95,13 +95,16 @@ export interface InputProps {
|
|
|
95
95
|
'selection-start'?: number
|
|
96
96
|
'selection-end'?: number
|
|
97
97
|
'placeholder-style'?: { color?: string }
|
|
98
|
-
'enable-offset'?: boolean
|
|
98
|
+
'enable-offset'?: boolean
|
|
99
99
|
'enable-var'?: boolean
|
|
100
100
|
'external-var-context'?: Record<string, any>
|
|
101
101
|
'parent-font-size'?: number
|
|
102
102
|
'parent-width'?: number
|
|
103
103
|
'parent-height'?: number
|
|
104
|
-
|
|
104
|
+
// 只有 RN 环境读取
|
|
105
|
+
'keyboard-type'?: string
|
|
106
|
+
'adjust-position': boolean
|
|
107
|
+
'hold-keyboard'?: boolean
|
|
105
108
|
bindinput?: (evt: NativeSyntheticEvent<TextInputTextInputEventData> | unknown) => void
|
|
106
109
|
bindfocus?: (evt: NativeSyntheticEvent<TextInputFocusEventData> | unknown) => void
|
|
107
110
|
bindblur?: (evt: NativeSyntheticEvent<TextInputFocusEventData> | unknown) => void
|
|
@@ -118,11 +121,11 @@ export interface PrivateInputProps {
|
|
|
118
121
|
|
|
119
122
|
type FinalInputProps = InputProps & PrivateInputProps
|
|
120
123
|
|
|
121
|
-
const
|
|
122
|
-
text: '
|
|
124
|
+
const inputModeMap: Record<Type, string> = {
|
|
125
|
+
text: 'text',
|
|
123
126
|
number: 'numeric',
|
|
124
|
-
idcard: '
|
|
125
|
-
digit:
|
|
127
|
+
idcard: 'text',
|
|
128
|
+
digit: 'decimal'
|
|
126
129
|
}
|
|
127
130
|
|
|
128
131
|
const Input = forwardRef<HandlerRef<TextInput, FinalInputProps>, FinalInputProps>((props: FinalInputProps, ref): JSX.Element => {
|
|
@@ -150,6 +153,8 @@ const Input = forwardRef<HandlerRef<TextInput, FinalInputProps>, FinalInputProps
|
|
|
150
153
|
'parent-width': parentWidth,
|
|
151
154
|
'parent-height': parentHeight,
|
|
152
155
|
'adjust-position': adjustPosition = true,
|
|
156
|
+
'keyboard-type': originalKeyboardType,
|
|
157
|
+
'hold-keyboard': holdKeyboard = false,
|
|
153
158
|
bindinput,
|
|
154
159
|
bindfocus,
|
|
155
160
|
bindblur,
|
|
@@ -182,9 +187,11 @@ const Input = forwardRef<HandlerRef<TextInput, FinalInputProps>, FinalInputProps
|
|
|
182
187
|
return ''
|
|
183
188
|
}
|
|
184
189
|
|
|
185
|
-
const keyboardType = keyboardTypeMap[type]
|
|
186
190
|
const defaultValue = parseValue(value)
|
|
191
|
+
// 微信小程序的 input 永远是单行,textAlignVertical 固定为 auto
|
|
192
|
+
// multiline 为 true 时表示是 textarea 组件复用此逻辑
|
|
187
193
|
const textAlignVertical = multiline ? 'top' : 'auto'
|
|
194
|
+
const isAutoFocus = !!autoFocus || !!focus
|
|
188
195
|
|
|
189
196
|
const tmpValue = useRef<string>(defaultValue)
|
|
190
197
|
const cursorIndex = useRef<number>(0)
|
|
@@ -193,13 +200,10 @@ const Input = forwardRef<HandlerRef<TextInput, FinalInputProps>, FinalInputProps
|
|
|
193
200
|
const [inputValue, setInputValue] = useState(defaultValue)
|
|
194
201
|
const [contentHeight, setContentHeight] = useState(0)
|
|
195
202
|
const [selection, setSelection] = useState({ start: -1, end: tmpValue.current.length })
|
|
196
|
-
|
|
197
203
|
const styleObj = extendObject(
|
|
198
204
|
{ padding: 0, backgroundColor: '#fff' },
|
|
199
205
|
style,
|
|
200
|
-
multiline && autoHeight
|
|
201
|
-
? { height: 'auto', minHeight: Math.max((style as any)?.minHeight || 35, contentHeight) }
|
|
202
|
-
: {}
|
|
206
|
+
multiline && autoHeight ? { height: 'auto' } : {}
|
|
203
207
|
)
|
|
204
208
|
|
|
205
209
|
const {
|
|
@@ -281,12 +285,13 @@ const Input = forwardRef<HandlerRef<TextInput, FinalInputProps>, FinalInputProps
|
|
|
281
285
|
|
|
282
286
|
const setKeyboardAvoidContext = () => {
|
|
283
287
|
if (keyboardAvoid) {
|
|
284
|
-
keyboardAvoid.current = { cursorSpacing, ref: nodeRef, adjustPosition }
|
|
288
|
+
keyboardAvoid.current = { cursorSpacing, ref: nodeRef, adjustPosition, holdKeyboard, readyToShow: true }
|
|
285
289
|
}
|
|
286
290
|
}
|
|
287
291
|
|
|
288
292
|
const onTouchStart = () => {
|
|
289
|
-
//
|
|
293
|
+
// 手动聚焦时初始化 keyboardAvoid 上下文
|
|
294
|
+
// auto-focus/focus 不会触发而是在 useEffect 中初始化
|
|
290
295
|
setKeyboardAvoidContext()
|
|
291
296
|
}
|
|
292
297
|
|
|
@@ -295,42 +300,49 @@ const Input = forwardRef<HandlerRef<TextInput, FinalInputProps>, FinalInputProps
|
|
|
295
300
|
}
|
|
296
301
|
|
|
297
302
|
const onFocus = (evt: NativeSyntheticEvent<TextInputFocusEventData>) => {
|
|
298
|
-
|
|
303
|
+
if (!keyboardAvoid?.current) {
|
|
304
|
+
// Android:从一个正聚焦状态 input,聚焦到另一个新的 input 时,正常会触发如下时序:
|
|
305
|
+
// 新的 Input `onTouchStart` -> 旧输入框键盘 `keyboardDidHide` -> 新的 Input `onFocus`
|
|
306
|
+
// 导致这里的 keyboardAvoid.current 为 null,所以需要判空重新初始化。
|
|
307
|
+
setKeyboardAvoidContext()
|
|
308
|
+
}
|
|
299
309
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
{
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
height: keyboardAvoid?.current?.keyboardHeight
|
|
310
|
-
},
|
|
311
|
-
layoutRef
|
|
310
|
+
const focusAction = () => {
|
|
311
|
+
bindfocus?.(
|
|
312
|
+
getCustomEvent(
|
|
313
|
+
'focus',
|
|
314
|
+
evt,
|
|
315
|
+
{
|
|
316
|
+
detail: {
|
|
317
|
+
value: tmpValue.current || '',
|
|
318
|
+
height: keyboardAvoid?.current?.keyboardHeight
|
|
312
319
|
},
|
|
313
|
-
|
|
314
|
-
|
|
320
|
+
layoutRef
|
|
321
|
+
},
|
|
322
|
+
props
|
|
315
323
|
)
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
324
|
+
)
|
|
325
|
+
if (keyboardAvoid?.current?.onKeyboardShow) {
|
|
326
|
+
keyboardAvoid.current.onKeyboardShow = undefined
|
|
319
327
|
}
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
evt.persist()
|
|
328
|
-
keyboardAvoid.current.onKeyboardShow = focusAction
|
|
329
|
-
}
|
|
330
|
-
} else {
|
|
331
|
-
// 无 keyboardAvoiding,直接执行 focus 回调
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
if (keyboardAvoid?.current) {
|
|
331
|
+
// 有 keyboardAvoiding
|
|
332
|
+
if (keyboardAvoid.current.keyboardHeight) {
|
|
333
|
+
// 仅以下场景触发顺序:先 keyboardWillShow 获取高度 -> 后 onFocus,可以立即执行
|
|
334
|
+
// - iOS + 手动点击聚焦
|
|
332
335
|
focusAction()
|
|
336
|
+
} else {
|
|
337
|
+
// 其他场景触发顺序:先 onFocus -> 后 keyboardWillShow 获取高度 -> 执行回调
|
|
338
|
+
// - iOS + auto-focus/focus=true 自动聚焦
|
|
339
|
+
// - Android 手动点击聚焦/自动聚焦 都一样
|
|
340
|
+
evt.persist()
|
|
341
|
+
keyboardAvoid.current.onKeyboardShow = focusAction
|
|
333
342
|
}
|
|
343
|
+
} else {
|
|
344
|
+
// 兜底:无 keyboardAvoiding 直接执行 focus 回调
|
|
345
|
+
focusAction()
|
|
334
346
|
}
|
|
335
347
|
}
|
|
336
348
|
|
|
@@ -440,19 +452,28 @@ const Input = forwardRef<HandlerRef<TextInput, FinalInputProps>, FinalInputProps
|
|
|
440
452
|
}, [])
|
|
441
453
|
|
|
442
454
|
useEffect(() => {
|
|
443
|
-
if (
|
|
455
|
+
if (isAutoFocus) {
|
|
456
|
+
// auto-focus/focus=true 初始化 keyboardAvoidContext
|
|
444
457
|
setKeyboardAvoidContext()
|
|
445
458
|
}
|
|
446
|
-
}, [
|
|
459
|
+
}, [isAutoFocus])
|
|
447
460
|
|
|
448
461
|
useUpdateEffect(() => {
|
|
449
462
|
if (!nodeRef?.current) {
|
|
450
463
|
return
|
|
451
464
|
}
|
|
452
|
-
|
|
465
|
+
// RN autoFocus 属性仅在初次渲染时生效
|
|
466
|
+
// 后续更新需要手动调用 focus/blur 方法,和微信小程序对齐
|
|
467
|
+
isAutoFocus
|
|
453
468
|
? (nodeRef.current as TextInput)?.focus()
|
|
454
469
|
: (nodeRef.current as TextInput)?.blur()
|
|
455
|
-
}, [
|
|
470
|
+
}, [isAutoFocus])
|
|
471
|
+
|
|
472
|
+
// 使用 multiline 来修复光标位置问题
|
|
473
|
+
// React Native 的 TextInput 在 textAlign center + placeholder 时光标会跑到右边
|
|
474
|
+
// 这个问题只在 Android 上出现
|
|
475
|
+
// 参考:https://github.com/facebook/react-native/issues/28794 (Android only)
|
|
476
|
+
const needMultilineFix = isAndroid && !multiline
|
|
456
477
|
|
|
457
478
|
const innerProps = useInnerProps(
|
|
458
479
|
extendObject(
|
|
@@ -463,20 +484,21 @@ const Input = forwardRef<HandlerRef<TextInput, FinalInputProps>, FinalInputProps
|
|
|
463
484
|
ref: nodeRef,
|
|
464
485
|
style: extendObject({}, normalStyle, layoutStyle),
|
|
465
486
|
allowFontScaling,
|
|
466
|
-
|
|
487
|
+
inputMode: originalKeyboardType ? undefined : inputModeMap[type],
|
|
488
|
+
keyboardType: originalKeyboardType,
|
|
467
489
|
secureTextEntry: !!password,
|
|
468
490
|
defaultValue: defaultValue,
|
|
469
491
|
value: inputValue,
|
|
470
492
|
maxLength: maxlength === -1 ? undefined : maxlength,
|
|
471
493
|
editable: !disabled,
|
|
472
|
-
autoFocus:
|
|
494
|
+
autoFocus: isAutoFocus,
|
|
473
495
|
selection: selectionStart > -1 || typeof cursor === 'number' ? selection : undefined,
|
|
474
496
|
selectionColor: cursorColor,
|
|
475
|
-
blurOnSubmit:
|
|
497
|
+
blurOnSubmit: multiline ? confirmType !== 'return' : !confirmHold,
|
|
476
498
|
underlineColorAndroid: 'rgba(0,0,0,0)',
|
|
477
499
|
textAlignVertical: textAlignVertical,
|
|
478
500
|
placeholderTextColor: placeholderStyle?.color,
|
|
479
|
-
multiline:
|
|
501
|
+
multiline: multiline || needMultilineFix,
|
|
480
502
|
onTouchStart,
|
|
481
503
|
onTouchEnd,
|
|
482
504
|
onFocus,
|
|
@@ -484,8 +506,9 @@ const Input = forwardRef<HandlerRef<TextInput, FinalInputProps>, FinalInputProps
|
|
|
484
506
|
onChange,
|
|
485
507
|
onSelectionChange,
|
|
486
508
|
onContentSizeChange,
|
|
487
|
-
onSubmitEditing: bindconfirm &&
|
|
509
|
+
onSubmitEditing: bindconfirm && onSubmitEditing
|
|
488
510
|
},
|
|
511
|
+
needMultilineFix ? { numberOfLines: 1 } : {},
|
|
489
512
|
!!multiline && confirmType === 'return' ? {} : { enterKeyHint: confirmType }
|
|
490
513
|
),
|
|
491
514
|
[
|
|
@@ -23,10 +23,13 @@ const KeyboardAvoidingView = ({ children, style, contentContainerStyle }: Keyboa
|
|
|
23
23
|
// 比如机型 iPhone 11 Pro,可能会导致显隐动画冲突
|
|
24
24
|
// 因此增加状态标记 + cancelAnimation 来优化
|
|
25
25
|
const isShow = useRef<boolean>(false)
|
|
26
|
+
const keybaordHandleTimerRef = useRef<NodeJS.Timeout | null>(null)
|
|
26
27
|
|
|
27
28
|
const animatedStyle = useAnimatedStyle(() => ({
|
|
28
|
-
// translate/position top
|
|
29
|
-
|
|
29
|
+
// translate/position top+ overflow hidden 在 android 上时因为键盘顶起让页面高度变小,同时元素位置上移
|
|
30
|
+
// 此时最底部的区域是超出了页面高度的,hidden生效就被隐藏掉,因此需要 android 配置聚焦时禁用高度缩小
|
|
31
|
+
// margin-top 因为在 react-native 上和 flex 1 同时存在时,负值只会让容器高度整体变高,不会让元素上移
|
|
32
|
+
transform: [{ translateY: -offset.value }],
|
|
30
33
|
flexBasis: basic.value as DimensionValue
|
|
31
34
|
}))
|
|
32
35
|
|
|
@@ -39,11 +42,20 @@ const KeyboardAvoidingView = ({ children, style, contentContainerStyle }: Keyboa
|
|
|
39
42
|
|
|
40
43
|
if (keyboardAvoid?.current) {
|
|
41
44
|
const inputRef = keyboardAvoid.current.ref?.current
|
|
42
|
-
if (inputRef && inputRef.isFocused()) {
|
|
45
|
+
if (inputRef && inputRef.isFocused() && !keyboardAvoid.current.readyToShow) {
|
|
43
46
|
// 修复 Android 点击键盘收起按钮时当前 input 没触发失焦的问题
|
|
47
|
+
// keyboardAvoid.current.readyToShow = true 表示聚焦到了新的输入框,不需要手动触发失焦
|
|
44
48
|
inputRef.blur()
|
|
45
49
|
}
|
|
46
|
-
keyboardAvoid.current
|
|
50
|
+
if (!keyboardAvoid.current.onKeyboardShow) {
|
|
51
|
+
// 修复部分 Android 机型可能时序问题:当从 input 已聚焦状态,聚焦到另一个 input 时,可能时序:
|
|
52
|
+
// - 新的 Input `onTouchStart` -> 新的 Input `onFocus` -> 旧输入框键盘 `keyboardDidHide` -> 新输入框键盘 `keyboardDidShow`
|
|
53
|
+
// - 此时 keyboardAvoid.current 如果清空 null,会导致新输入框键盘 `keyboardDidShow` 回调 keybaordAvoding 执行失败。
|
|
54
|
+
// 修复方案:
|
|
55
|
+
// 如果出现时序问题,那么新的 Input `onFocus` 会更早执行,那么 `keyboardAvoid.current.onKeyboardShow` 存在,
|
|
56
|
+
// 那么不应该重置为 null,反之,说明时正常情况,应当重置为 null。
|
|
57
|
+
keyboardAvoid.current = null
|
|
58
|
+
}
|
|
47
59
|
}
|
|
48
60
|
|
|
49
61
|
cancelAnimation(offset)
|
|
@@ -53,6 +65,9 @@ const KeyboardAvoidingView = ({ children, style, contentContainerStyle }: Keyboa
|
|
|
53
65
|
|
|
54
66
|
const onTouchEnd = ({ nativeEvent }: NativeSyntheticEvent<NativeTouchEvent & { origin?: string }>) => {
|
|
55
67
|
if (nativeEvent.origin !== 'input') {
|
|
68
|
+
if (keyboardAvoid?.current?.holdKeyboard) {
|
|
69
|
+
return
|
|
70
|
+
}
|
|
56
71
|
Keyboard.isVisible() && Keyboard.dismiss()
|
|
57
72
|
}
|
|
58
73
|
}
|
|
@@ -61,7 +76,11 @@ const KeyboardAvoidingView = ({ children, style, contentContainerStyle }: Keyboa
|
|
|
61
76
|
let subscriptions: EmitterSubscription[] = []
|
|
62
77
|
|
|
63
78
|
function keybaordAvoding(evt: any) {
|
|
64
|
-
if (
|
|
79
|
+
if (keyboardAvoid?.current?.readyToShow) {
|
|
80
|
+
// 重置标记位
|
|
81
|
+
keyboardAvoid.current.readyToShow = false
|
|
82
|
+
}
|
|
83
|
+
if (!keyboardAvoid?.current) {
|
|
65
84
|
return
|
|
66
85
|
}
|
|
67
86
|
|
|
@@ -106,13 +125,23 @@ const KeyboardAvoidingView = ({ children, style, contentContainerStyle }: Keyboa
|
|
|
106
125
|
}
|
|
107
126
|
|
|
108
127
|
if (isIOS) {
|
|
109
|
-
subscriptions = [
|
|
128
|
+
subscriptions = [
|
|
129
|
+
Keyboard.addListener('keyboardWillShow', (evt: any) => {
|
|
130
|
+
if (keybaordHandleTimerRef.current) {
|
|
131
|
+
clearTimeout(keybaordHandleTimerRef.current)
|
|
132
|
+
}
|
|
133
|
+
// iphone 在input聚焦时长按滑动后会导致 show 事件先于 focus 事件发生,因此等一下,等 focus 先触发拿到 input,避免键盘出现但input没顶上去
|
|
134
|
+
keybaordHandleTimerRef.current = setTimeout(() => keybaordAvoding(evt), 32)
|
|
135
|
+
}),
|
|
136
|
+
Keyboard.addListener('keyboardWillHide', resetKeyboard)
|
|
137
|
+
]
|
|
110
138
|
} else {
|
|
111
139
|
subscriptions = [Keyboard.addListener('keyboardDidShow', keybaordAvoding), Keyboard.addListener('keyboardDidHide', resetKeyboard)]
|
|
112
140
|
}
|
|
113
141
|
|
|
114
142
|
return () => {
|
|
115
143
|
subscriptions.forEach(subscription => subscription.remove())
|
|
144
|
+
keybaordHandleTimerRef.current && clearTimeout(keybaordHandleTimerRef.current)
|
|
116
145
|
}
|
|
117
146
|
}, [keyboardAvoid])
|
|
118
147
|
|
|
@@ -19,7 +19,7 @@ const _PortalManager = forwardRef((props: PortalManagerProps, ref:ForwardedRef<u
|
|
|
19
19
|
setState((prevState) => ({
|
|
20
20
|
portals: [...prevState.portals, { key, children }]
|
|
21
21
|
}))
|
|
22
|
-
}, [
|
|
22
|
+
}, [])
|
|
23
23
|
|
|
24
24
|
const update = useCallback((key: number, children: ReactNode) => {
|
|
25
25
|
setState((prevState) => ({
|
|
@@ -30,7 +30,7 @@ const _PortalManager = forwardRef((props: PortalManagerProps, ref:ForwardedRef<u
|
|
|
30
30
|
return item
|
|
31
31
|
})
|
|
32
32
|
}))
|
|
33
|
-
}, [
|
|
33
|
+
}, [])
|
|
34
34
|
|
|
35
35
|
const unmount = useCallback((key: number) => {
|
|
36
36
|
setState((prevState) => ({
|
|
@@ -112,6 +112,11 @@ type ScrollAdditionalProps = {
|
|
|
112
112
|
|
|
113
113
|
const AnimatedScrollView = RNAnimated.createAnimatedComponent(ScrollView) as React.ComponentType<any>
|
|
114
114
|
|
|
115
|
+
const REFRESH_COLOR = {
|
|
116
|
+
black: ['#000'],
|
|
117
|
+
white: ['#fff']
|
|
118
|
+
}
|
|
119
|
+
|
|
115
120
|
const _ScrollView = forwardRef<HandlerRef<ScrollView & View, ScrollViewProps>, ScrollViewProps>((scrollViewProps: ScrollViewProps = {}, ref): JSX.Element => {
|
|
116
121
|
const { textProps, innerProps: props = {} } = splitProps(scrollViewProps)
|
|
117
122
|
const {
|
|
@@ -121,9 +126,7 @@ const _ScrollView = forwardRef<HandlerRef<ScrollView & View, ScrollViewProps>, S
|
|
|
121
126
|
binddragstart,
|
|
122
127
|
binddragging,
|
|
123
128
|
binddragend,
|
|
124
|
-
bindtouchstart,
|
|
125
129
|
bindtouchmove,
|
|
126
|
-
bindtouchend,
|
|
127
130
|
'scroll-x': scrollX = false,
|
|
128
131
|
'scroll-y': scrollY = false,
|
|
129
132
|
'enable-back-to-top': enableBackToTop = false,
|
|
@@ -159,14 +162,15 @@ const _ScrollView = forwardRef<HandlerRef<ScrollView & View, ScrollViewProps>, S
|
|
|
159
162
|
const simultaneousHandlers = flatGesture(originSimultaneousHandlers)
|
|
160
163
|
const waitForHandlers = flatGesture(waitFor)
|
|
161
164
|
|
|
162
|
-
const
|
|
165
|
+
const { refresherContent, otherContent } = getRefresherContent(props.children)
|
|
166
|
+
const hasRefresher = refresherContent && refresherEnabled
|
|
163
167
|
|
|
168
|
+
const [refreshing, setRefreshing] = useState(false)
|
|
164
169
|
const [enableScroll, setEnableScroll] = useState(true)
|
|
165
|
-
const enableScrollValue = useSharedValue(true)
|
|
166
|
-
|
|
167
170
|
const [scrollBounces, setScrollBounces] = useState(false)
|
|
168
|
-
const bouncesValue = useSharedValue(!!false)
|
|
169
171
|
|
|
172
|
+
const enableScrollValue = useSharedValue(true)
|
|
173
|
+
const bouncesValue = useSharedValue(false)
|
|
170
174
|
const translateY = useSharedValue(0)
|
|
171
175
|
const isAtTop = useSharedValue(true)
|
|
172
176
|
const refresherHeight = useSharedValue(0)
|
|
@@ -186,16 +190,8 @@ const _ScrollView = forwardRef<HandlerRef<ScrollView & View, ScrollViewProps>, S
|
|
|
186
190
|
|
|
187
191
|
const firstScrollIntoViewChange = useRef<boolean>(true)
|
|
188
192
|
|
|
189
|
-
const refreshColor = {
|
|
190
|
-
black: ['#000'],
|
|
191
|
-
white: ['#fff']
|
|
192
|
-
}
|
|
193
|
-
|
|
194
193
|
const isContentSizeChange = useRef(false)
|
|
195
194
|
|
|
196
|
-
const { refresherContent, otherContent } = getRefresherContent(props.children)
|
|
197
|
-
const hasRefresher = refresherContent && refresherEnabled
|
|
198
|
-
|
|
199
195
|
const {
|
|
200
196
|
normalStyle,
|
|
201
197
|
hasVarDec,
|
|
@@ -643,67 +639,71 @@ const _ScrollView = forwardRef<HandlerRef<ScrollView & View, ScrollViewProps>, S
|
|
|
643
639
|
}
|
|
644
640
|
}
|
|
645
641
|
|
|
646
|
-
// 处理下拉刷新的手势
|
|
647
|
-
const panGesture =
|
|
648
|
-
.
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
642
|
+
// 处理下拉刷新的手势 - 使用 useMemo 避免每次渲染都创建
|
|
643
|
+
const panGesture = useMemo(() => {
|
|
644
|
+
if (!hasRefresher) return Gesture.Pan() // 返回空手势
|
|
645
|
+
|
|
646
|
+
return Gesture.Pan()
|
|
647
|
+
.onUpdate((event) => {
|
|
648
|
+
'worklet'
|
|
649
|
+
if (enhanced && !!bounces) {
|
|
650
|
+
if (event.translationY > 0 && bouncesValue.value) {
|
|
651
|
+
updateBouncesState(false)
|
|
652
|
+
} else if ((event.translationY < 0) && !bouncesValue.value) {
|
|
653
|
+
updateBouncesState(true)
|
|
654
|
+
}
|
|
655
655
|
}
|
|
656
|
-
}
|
|
657
656
|
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
657
|
+
if (translateY.value <= 0 && event.translationY < 0) {
|
|
658
|
+
// 滑动到顶再向上开启滚动
|
|
659
|
+
updateScrollState(true)
|
|
660
|
+
} else if (event.translationY > 0 && isAtTop.value) {
|
|
661
|
+
// 滚动到顶再向下禁止滚动
|
|
662
|
+
updateScrollState(false)
|
|
663
|
+
}
|
|
664
|
+
// 禁止滚动后切换为滑动
|
|
665
|
+
if (!enableScrollValue.value && isAtTop.value) {
|
|
666
|
+
if (refreshing) {
|
|
667
|
+
// 从完全展开状态(refresherHeight.value)开始计算偏移
|
|
668
|
+
translateY.value = Math.max(
|
|
669
|
+
0,
|
|
670
|
+
Math.min(
|
|
671
|
+
refresherHeight.value,
|
|
672
|
+
refresherHeight.value + event.translationY
|
|
673
|
+
)
|
|
674
674
|
)
|
|
675
|
-
)
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
675
|
+
} else if (event.translationY > 0) {
|
|
676
|
+
// 非刷新状态下的下拉逻辑保持不变
|
|
677
|
+
translateY.value = Math.min(event.translationY * 0.6, refresherHeight.value)
|
|
678
|
+
}
|
|
679
679
|
}
|
|
680
|
-
}
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
680
|
+
})
|
|
681
|
+
.onEnd((event) => {
|
|
682
|
+
'worklet'
|
|
683
|
+
if (enableScrollValue.value) return
|
|
684
|
+
if (refreshing) {
|
|
685
|
+
// 刷新状态下,根据滑动距离决定是否隐藏
|
|
686
|
+
// 如果向下滑动没超过 refresherThreshold,就完全隐藏,如果向上滑动完全隐藏
|
|
687
|
+
if ((event.translationY > 0 && translateY.value < refresherThreshold) || event.translationY < 0) {
|
|
688
|
+
translateY.value = withTiming(0)
|
|
689
|
+
updateScrollState(true)
|
|
690
|
+
runOnJS(runOnJSCallback)('setRefreshing', false)
|
|
691
|
+
} else {
|
|
692
|
+
translateY.value = withTiming(refresherHeight.value)
|
|
693
|
+
}
|
|
694
|
+
} else if (event.translationY >= refresherHeight.value) {
|
|
695
|
+
// 触发刷新
|
|
696
|
+
translateY.value = withTiming(refresherHeight.value)
|
|
697
|
+
runOnJS(runOnJSCallback)('onRefresh')
|
|
698
|
+
} else {
|
|
699
|
+
// 回弹
|
|
689
700
|
translateY.value = withTiming(0)
|
|
690
701
|
updateScrollState(true)
|
|
691
702
|
runOnJS(runOnJSCallback)('setRefreshing', false)
|
|
692
|
-
} else {
|
|
693
|
-
translateY.value = withTiming(refresherHeight.value)
|
|
694
703
|
}
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
runOnJS(runOnJSCallback)('onRefresh')
|
|
699
|
-
} else {
|
|
700
|
-
// 回弹
|
|
701
|
-
translateY.value = withTiming(0)
|
|
702
|
-
updateScrollState(true)
|
|
703
|
-
runOnJS(runOnJSCallback)('setRefreshing', false)
|
|
704
|
-
}
|
|
705
|
-
})
|
|
706
|
-
.simultaneousWithExternalGesture(scrollViewRef)
|
|
704
|
+
})
|
|
705
|
+
.simultaneousWithExternalGesture(scrollViewRef)
|
|
706
|
+
}, [hasRefresher, enhanced, bounces, refreshing, refresherThreshold])
|
|
707
707
|
|
|
708
708
|
const scrollAdditionalProps: ScrollAdditionalProps = extendObject(
|
|
709
709
|
{
|
|
@@ -779,61 +779,57 @@ const _ScrollView = forwardRef<HandlerRef<ScrollView & View, ScrollViewProps>, S
|
|
|
779
779
|
|
|
780
780
|
const ScrollViewComponent = enableSticky ? AnimatedScrollView : ScrollView
|
|
781
781
|
|
|
782
|
-
const
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
782
|
+
const createScrollViewContent = () => {
|
|
783
|
+
const wrappedChildren = wrapChildren(hasRefresher ? extendObject({}, props, { children: otherContent }) : props,
|
|
784
|
+
{
|
|
785
|
+
hasVarDec,
|
|
786
|
+
varContext: varContextRef.current,
|
|
787
|
+
textStyle,
|
|
788
|
+
textProps
|
|
789
|
+
})
|
|
790
|
+
return createElement(ScrollViewContext.Provider, { value: contextValue }, wrappedChildren)
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
const withRefresherScrollView = () => {
|
|
794
|
+
return createElement(
|
|
795
|
+
GestureDetector,
|
|
796
|
+
{ gesture: panGesture },
|
|
793
797
|
createElement(
|
|
794
|
-
|
|
795
|
-
|
|
798
|
+
ScrollViewComponent,
|
|
799
|
+
innerProps,
|
|
800
|
+
createElement(
|
|
801
|
+
Animated.View,
|
|
802
|
+
{ style: [refresherAnimatedStyle, refresherLayoutStyle], onLayout: onRefresherLayout },
|
|
803
|
+
refresherContent
|
|
804
|
+
),
|
|
796
805
|
createElement(
|
|
797
|
-
|
|
798
|
-
{
|
|
799
|
-
|
|
800
|
-
extendObject({}, props, { children: otherContent }),
|
|
801
|
-
{
|
|
802
|
-
hasVarDec,
|
|
803
|
-
varContext: varContextRef.current,
|
|
804
|
-
textStyle,
|
|
805
|
-
textProps
|
|
806
|
-
}
|
|
807
|
-
)
|
|
806
|
+
Animated.View,
|
|
807
|
+
{ style: contentAnimatedStyle },
|
|
808
|
+
createScrollViewContent()
|
|
808
809
|
)
|
|
809
810
|
)
|
|
810
811
|
)
|
|
811
|
-
|
|
812
|
+
}
|
|
812
813
|
|
|
813
|
-
const commonScrollView =
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
}
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
hasVarDec,
|
|
829
|
-
varContext: varContextRef.current,
|
|
830
|
-
textStyle,
|
|
831
|
-
textProps
|
|
832
|
-
})
|
|
814
|
+
const commonScrollView = () => {
|
|
815
|
+
const refreshControl = refresherEnabled
|
|
816
|
+
? createElement(RefreshControl, extendObject({
|
|
817
|
+
progressBackgroundColor: refresherBackground,
|
|
818
|
+
refreshing: refreshing,
|
|
819
|
+
onRefresh: onRefresh
|
|
820
|
+
}, refresherDefaultStyle && refresherDefaultStyle !== 'none'
|
|
821
|
+
? { colors: REFRESH_COLOR[refresherDefaultStyle] }
|
|
822
|
+
: {}))
|
|
823
|
+
: undefined
|
|
824
|
+
|
|
825
|
+
return createElement(
|
|
826
|
+
ScrollViewComponent,
|
|
827
|
+
extendObject({}, innerProps, { refreshControl }),
|
|
828
|
+
createScrollViewContent()
|
|
833
829
|
)
|
|
834
|
-
|
|
830
|
+
}
|
|
835
831
|
|
|
836
|
-
let scrollViewComponent = hasRefresher ? withRefresherScrollView : commonScrollView
|
|
832
|
+
let scrollViewComponent = hasRefresher ? withRefresherScrollView() : commonScrollView()
|
|
837
833
|
|
|
838
834
|
if (hasPositionFixed) {
|
|
839
835
|
scrollViewComponent = createElement(Portal, null, scrollViewComponent)
|