@tarojs/components-react 4.1.12-beta.64 → 4.1.12-beta.67
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/components/picker/picker-group-slider.js +1 -1
- package/dist/components/picker/picker-group-slider.js.map +1 -1
- package/dist/components/picker-view/index.js +265 -0
- package/dist/components/picker-view/index.js.map +1 -0
- package/dist/components/picker-view/style/index.scss.js +4 -0
- package/dist/components/picker-view/style/index.scss.js.map +1 -0
- package/dist/components/picker-view-column/index.js +517 -0
- package/dist/components/picker-view-column/index.js.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/original/components/picker/picker-group-slider.js +1 -1
- package/dist/original/components/picker/picker-group-slider.js.map +1 -1
- package/dist/original/components/picker-view/index.js +265 -0
- package/dist/original/components/picker-view/index.js.map +1 -0
- package/dist/original/components/picker-view/style/index.scss +132 -0
- package/dist/original/components/picker-view-column/index.js +517 -0
- package/dist/original/components/picker-view-column/index.js.map +1 -0
- package/dist/original/index.js +3 -1
- package/dist/original/index.js.map +1 -1
- package/dist/original/utils/picker-scale.js +25 -0
- package/dist/original/utils/picker-scale.js.map +1 -0
- package/dist/solid/components/picker/picker-group-slider.js +1 -1
- package/dist/solid/components/picker/picker-group-slider.js.map +1 -1
- package/dist/utils/picker-scale.js +25 -0
- package/dist/utils/picker-scale.js.map +1 -0
- package/package.json +6 -6
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
import { View, ScrollView } from '@tarojs/components';
|
|
2
|
+
import Taro from '@tarojs/taro';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { resolveUseMeasuredScale } from '../../utils/picker-scale.js';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function requestAccessibilityFocusOnView(node) {
|
|
8
|
+
if (node == null) return;
|
|
9
|
+
const fn = Taro.setAccessibilityFocus;
|
|
10
|
+
if (typeof fn !== 'function') return;
|
|
11
|
+
fn({
|
|
12
|
+
viewRef: {
|
|
13
|
+
current: node
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function usePickerItemScrollIntoView() {
|
|
18
|
+
const [scrollIntoView, setScrollIntoView] = React.useState('');
|
|
19
|
+
const pulseRef = React.useRef(0);
|
|
20
|
+
const scrollToItemId = React.useCallback(itemId => {
|
|
21
|
+
pulseRef.current += 1;
|
|
22
|
+
const token = pulseRef.current;
|
|
23
|
+
setScrollIntoView('');
|
|
24
|
+
setTimeout(() => {
|
|
25
|
+
if (pulseRef.current !== token) return;
|
|
26
|
+
setScrollIntoView(itemId);
|
|
27
|
+
}, 0);
|
|
28
|
+
}, []);
|
|
29
|
+
return [scrollIntoView, scrollToItemId];
|
|
30
|
+
}
|
|
31
|
+
// 默认单项高度(兜底值)
|
|
32
|
+
const DEFAULT_ITEM_HEIGHT = 34;
|
|
33
|
+
// 启用新版无障碍(slider 遮挡方案)所需的最低 app 版本;低于此版本或非 dynamic 端不加 slider
|
|
34
|
+
const MIN_A11Y_APP_VERSION = '15.9.50';
|
|
35
|
+
// 逐段比较版本号:v1 > v2 返回 1,v1 < v2 返回 -1,相等返回 0(缺失段按 0 处理)
|
|
36
|
+
function compareVersion(v1, v2) {
|
|
37
|
+
const a = String(v1).split('.');
|
|
38
|
+
const b = String(v2).split('.');
|
|
39
|
+
const len = Math.max(a.length, b.length);
|
|
40
|
+
for (let i = 0; i < len; i++) {
|
|
41
|
+
const n1 = parseInt(a[i], 10) || 0;
|
|
42
|
+
const n2 = parseInt(b[i], 10) || 0;
|
|
43
|
+
if (n1 > n2) return 1;
|
|
44
|
+
if (n1 < n2) return -1;
|
|
45
|
+
}
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
// 模块级缓存:app version 不变,只算一次,避免 column 高频 re-render 每帧都调 getSystemInfoSync。
|
|
49
|
+
// 未就绪(空 version / 抛错)时不写缓存、仅本次返回 false,下次 render 重试,保留 runtime 就绪后自愈能力。
|
|
50
|
+
let _sliderA11yResolved;
|
|
51
|
+
function resolveUseSliderA11y() {
|
|
52
|
+
var _a;
|
|
53
|
+
if (_sliderA11yResolved !== undefined) return _sliderA11yResolved;
|
|
54
|
+
if (process.env.TARO_ENV !== 'dynamic') {
|
|
55
|
+
_sliderA11yResolved = false;
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const version = ((_a = Taro.getSystemInfoSync()) === null || _a === void 0 ? void 0 : _a.version) || '';
|
|
60
|
+
if (!version) return false; // 未就绪:不缓存,下次重试
|
|
61
|
+
_sliderA11yResolved = compareVersion(version, MIN_A11Y_APP_VERSION) >= 0;
|
|
62
|
+
return _sliderA11yResolved;
|
|
63
|
+
} catch (_b) {
|
|
64
|
+
return false; // 未就绪:不缓存,下次重试
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// 从 React 节点递归收集 string/number 子节点拼接文本,供无障碍播报用。
|
|
68
|
+
// 复杂嵌套 / 纯图标 / 自定义组件无字符串子节点时返空,则不播报(可接受)。
|
|
69
|
+
function extractTextFromNode(node) {
|
|
70
|
+
if (node == null || typeof node === 'boolean') return '';
|
|
71
|
+
if (typeof node === 'string' || typeof node === 'number') return String(node);
|
|
72
|
+
if (Array.isArray(node)) return node.map(extractTextFromNode).join('');
|
|
73
|
+
if (/*#__PURE__*/React.isValidElement(node)) return extractTextFromNode(node.props.children);
|
|
74
|
+
return '';
|
|
75
|
+
}
|
|
76
|
+
// 将 CSS 字符串解析为 React 样式对象(H5 下 DOM style 只接受对象)
|
|
77
|
+
const normalizeStyle = style => {
|
|
78
|
+
if (!style) return {};
|
|
79
|
+
if (typeof style !== 'string') return style;
|
|
80
|
+
const result = {};
|
|
81
|
+
style.split(';').forEach(decl => {
|
|
82
|
+
const idx = decl.indexOf(':');
|
|
83
|
+
if (idx === -1) return;
|
|
84
|
+
const key = decl.slice(0, idx).trim();
|
|
85
|
+
const val = decl.slice(idx + 1).trim();
|
|
86
|
+
if (!key || !val) return;
|
|
87
|
+
const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
88
|
+
result[camelKey] = val;
|
|
89
|
+
});
|
|
90
|
+
return result;
|
|
91
|
+
};
|
|
92
|
+
// 计算 lengthScaleRatio(大屏适配缩放比)
|
|
93
|
+
const calculateLengthScaleRatio = res => {
|
|
94
|
+
let lengthScaleRatio = res === null || res === void 0 ? void 0 : res.lengthScaleRatio;
|
|
95
|
+
if (lengthScaleRatio == null || lengthScaleRatio === 0) {
|
|
96
|
+
lengthScaleRatio = 1;
|
|
97
|
+
if (res.windowWidth < 320) {
|
|
98
|
+
lengthScaleRatio = res.windowWidth / 320;
|
|
99
|
+
} else if (res.windowWidth >= 400 && res.windowWidth < 600) {
|
|
100
|
+
lengthScaleRatio = res.windowWidth / 400;
|
|
101
|
+
}
|
|
102
|
+
const shortSide = res.windowWidth < res.windowHeight ? res.windowWidth : res.windowHeight;
|
|
103
|
+
const isBigScreen = shortSide >= 600;
|
|
104
|
+
if (isBigScreen) {
|
|
105
|
+
lengthScaleRatio = shortSide / 720;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return lengthScaleRatio;
|
|
109
|
+
};
|
|
110
|
+
// 设置 scrollTop(按平台决定是否乘缩放比)
|
|
111
|
+
const setTargetScrollTopWithScale = function (setTargetScrollTop, baseValue, randomOffset) {
|
|
112
|
+
let lengthScaleRatio = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
|
|
113
|
+
if (process.env.TARO_ENV === 'h5' || process.env.TARO_ENV === 'weapp') {
|
|
114
|
+
const finalValue = randomOffset !== undefined ? baseValue + randomOffset : baseValue;
|
|
115
|
+
setTargetScrollTop(finalValue);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (process.env.TARO_PLATFORM === 'harmony') {
|
|
119
|
+
const finalValue = randomOffset !== undefined ? baseValue + randomOffset : baseValue;
|
|
120
|
+
setTargetScrollTop(finalValue);
|
|
121
|
+
} else {
|
|
122
|
+
const scaledValue = baseValue * lengthScaleRatio;
|
|
123
|
+
const finalValue = randomOffset !== undefined ? scaledValue + randomOffset : scaledValue;
|
|
124
|
+
setTargetScrollTop(finalValue);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
// 根据 scrollTop 计算选中索引
|
|
128
|
+
const getSelectedIndex = function (scrollTop, itemHeight) {
|
|
129
|
+
let lengthScaleRatio = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
|
|
130
|
+
let useMeasuredScale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
131
|
+
if (!useMeasuredScale || process.env.TARO_PLATFORM === 'harmony') {
|
|
132
|
+
return Math.round(scrollTop / itemHeight);
|
|
133
|
+
}
|
|
134
|
+
return Math.round(scrollTop / lengthScaleRatio / itemHeight);
|
|
135
|
+
};
|
|
136
|
+
function PickerViewColumn(props) {
|
|
137
|
+
const {
|
|
138
|
+
children,
|
|
139
|
+
id,
|
|
140
|
+
className,
|
|
141
|
+
style,
|
|
142
|
+
_itemHeight = DEFAULT_ITEM_HEIGHT,
|
|
143
|
+
_selectedIndex = 0,
|
|
144
|
+
_columnId = 0,
|
|
145
|
+
_containerHeight,
|
|
146
|
+
_enableClickItemScroll = true,
|
|
147
|
+
_instanceId = '0',
|
|
148
|
+
_onColumnChange,
|
|
149
|
+
_onPickStart,
|
|
150
|
+
_onPickEnd
|
|
151
|
+
} = props;
|
|
152
|
+
// 过滤有效子节点,得到真实可选项
|
|
153
|
+
const items = React.Children.toArray(children).filter(React.isValidElement);
|
|
154
|
+
const itemCount = items.length;
|
|
155
|
+
// 新版无障碍(slider 遮挡方案):仅 dynamic 且 app≥15.9.50、且列非空时启用。
|
|
156
|
+
// 整列作单 slider,读屏转子 increment/decrement 切相邻项;覆盖层置于 ScrollView 下层,上层 ScrollView 接管手势滚动。
|
|
157
|
+
// 须在 handleScroll / handleScrollEnd 之前定义,避免 no-use-before-define。
|
|
158
|
+
const useSliderA11y = resolveUseSliderA11y() && itemCount > 0;
|
|
159
|
+
const [targetScrollTop, setTargetScrollTop] = React.useState(0);
|
|
160
|
+
const scrollViewRef = React.useRef(null);
|
|
161
|
+
const firstItemRef = React.useRef(null);
|
|
162
|
+
const selectedIndexPropRef = React.useRef(_selectedIndex);
|
|
163
|
+
selectedIndexPropRef.current = _selectedIndex;
|
|
164
|
+
const syncScrollFromPropsRef = React.useRef(false);
|
|
165
|
+
const isTouchingRef = React.useRef(false);
|
|
166
|
+
const itemRefs = React.useRef([]);
|
|
167
|
+
const pendingScrollSettleFocusRef = React.useRef(false);
|
|
168
|
+
const [scrollIntoView, scrollToItemId] = usePickerItemScrollIntoView();
|
|
169
|
+
const [currentIndex, setCurrentIndex] = React.useState(_selectedIndex);
|
|
170
|
+
// 程序化定位(初始 / 受控跳转)不加动画,避免 dynamic 端内容尺寸就绪前动画帧被 clamp 成 0;
|
|
171
|
+
// 用户手势归中吸附时才开动画,得到顺滑的吸附过渡。初值 false 保证首帧定位无滚入感。
|
|
172
|
+
const [enableAnim, setEnableAnim] = React.useState(false);
|
|
173
|
+
const lengthScaleRatioRef = React.useRef(1);
|
|
174
|
+
const useMeasuredScaleRef = React.useRef(false);
|
|
175
|
+
// 单项渲染高度:初值取注入的期望值,挂载后从 DOM 实测覆盖,
|
|
176
|
+
// 以对齐 Taro rem 缩放后的真实像素(与容器高度同坐标系)。
|
|
177
|
+
const itemHeightRef = React.useRef(_itemHeight);
|
|
178
|
+
// 用于驱动留白 calc 重算的实测高度(渲染坐标系)
|
|
179
|
+
const [renderItemHeight, setRenderItemHeight] = React.useState(_itemHeight);
|
|
180
|
+
// 计算单项高度:对齐 picker-group calculateItemHeight 的平台/缩放分支,
|
|
181
|
+
// 但因本组件留白是 calc(50%) 半屏高、与 item 不等高,不能用 scrollHeight/childNodes 平均,
|
|
182
|
+
// 改为量单个 item 的 offsetHeight(所有 item 等高,item[0] 即代表值)。
|
|
183
|
+
const measureItemHeight = React.useCallback(() => {
|
|
184
|
+
let next;
|
|
185
|
+
if (process.env.TARO_PLATFORM === 'harmony') {
|
|
186
|
+
// harmony:不依赖 DOM 测量,用设计值(measuredScale 时乘 ratio)
|
|
187
|
+
next = useMeasuredScaleRef.current ? _itemHeight * lengthScaleRatioRef.current : _itemHeight;
|
|
188
|
+
} else {
|
|
189
|
+
const el = firstItemRef.current;
|
|
190
|
+
const h = el === null || el === void 0 ? void 0 : el.offsetHeight;
|
|
191
|
+
if (!h || h <= 0) return; // 不可测量(native offsetHeight 缺失 / 隐藏态):保留现值
|
|
192
|
+
// measuredScale 模式下 scrollHeight 已被系统放大,需除 ratio 换算回设计坐标系
|
|
193
|
+
next = useMeasuredScaleRef.current ? h / lengthScaleRatioRef.current : h;
|
|
194
|
+
}
|
|
195
|
+
if (next > 0 && next !== itemHeightRef.current) {
|
|
196
|
+
itemHeightRef.current = next;
|
|
197
|
+
setRenderItemHeight(next);
|
|
198
|
+
}
|
|
199
|
+
}, [_itemHeight]);
|
|
200
|
+
// 初始化缩放模式判定
|
|
201
|
+
React.useEffect(() => {
|
|
202
|
+
Taro.getSystemInfo({
|
|
203
|
+
success: res => {
|
|
204
|
+
lengthScaleRatioRef.current = calculateLengthScaleRatio(res);
|
|
205
|
+
useMeasuredScaleRef.current = resolveUseMeasuredScale(res);
|
|
206
|
+
},
|
|
207
|
+
fail: () => {
|
|
208
|
+
lengthScaleRatioRef.current = 1;
|
|
209
|
+
useMeasuredScaleRef.current = false;
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
}, []);
|
|
213
|
+
// 挂载 / children 数量 / 期望高变化后,实测真实单项高度
|
|
214
|
+
React.useLayoutEffect(() => {
|
|
215
|
+
measureItemHeight();
|
|
216
|
+
}, [measureItemHeight, itemCount, _itemHeight]);
|
|
217
|
+
// props selectedIndex 变化 / 实测高变化:编程式滚至对应项,400ms 内标记为程序化滚动
|
|
218
|
+
React.useEffect(() => {
|
|
219
|
+
if (scrollViewRef.current && itemCount > 0 && !isTouchingRef.current) {
|
|
220
|
+
syncScrollFromPropsRef.current = true;
|
|
221
|
+
// 程序化定位不加动画:dynamic 端内容尺寸就绪前动画帧会被 clamp 成 0,直接 set 才能在
|
|
222
|
+
// onContentSizeChange 后被原生补齐;初始加载也不需要滚入感。
|
|
223
|
+
setEnableAnim(false);
|
|
224
|
+
const baseValue = _selectedIndex * itemHeightRef.current;
|
|
225
|
+
setTargetScrollTopWithScale(setTargetScrollTop, baseValue, undefined, lengthScaleRatioRef.current);
|
|
226
|
+
setCurrentIndex(_selectedIndex);
|
|
227
|
+
const tid = setTimeout(() => {
|
|
228
|
+
syncScrollFromPropsRef.current = false;
|
|
229
|
+
}, 400);
|
|
230
|
+
return () => clearTimeout(tid);
|
|
231
|
+
}
|
|
232
|
+
}, [_selectedIndex, itemCount, renderItemHeight]);
|
|
233
|
+
// 越界 clamp:>=count→末项,<0→0
|
|
234
|
+
const clampIndex = index => {
|
|
235
|
+
if (itemCount === 0 || !Number.isFinite(index)) return 0;
|
|
236
|
+
if (index >= itemCount) return itemCount - 1;
|
|
237
|
+
if (index < 0) return 0;
|
|
238
|
+
return index;
|
|
239
|
+
};
|
|
240
|
+
const isCenterTimerId = React.useRef(null);
|
|
241
|
+
// 滚动静止后归中并同步选中
|
|
242
|
+
const handleScrollEnd = () => {
|
|
243
|
+
if (!scrollViewRef.current) return;
|
|
244
|
+
if (isCenterTimerId.current) {
|
|
245
|
+
clearTimeout(isCenterTimerId.current);
|
|
246
|
+
isCenterTimerId.current = null;
|
|
247
|
+
}
|
|
248
|
+
// 100ms 内无新滚动则归中并提交索引
|
|
249
|
+
isCenterTimerId.current = setTimeout(() => {
|
|
250
|
+
if (!scrollViewRef.current) return;
|
|
251
|
+
const scrollTop = scrollViewRef.current.scrollTop;
|
|
252
|
+
const newIndex = getSelectedIndex(scrollTop, itemHeightRef.current, lengthScaleRatioRef.current, useMeasuredScaleRef.current);
|
|
253
|
+
isTouchingRef.current = false;
|
|
254
|
+
const clamped = clampIndex(newIndex);
|
|
255
|
+
// legacy a11y: 聚焦仅依赖用户滚动标记(pending),且放在 sync 早退之前——
|
|
256
|
+
// 这样即便本拍 sync 因受控回传竞态被置 true,聚焦仍能触发(修"不播报"根因)。
|
|
257
|
+
const shouldFocusOnScrollSettle = pendingScrollSettleFocusRef.current;
|
|
258
|
+
pendingScrollSettleFocusRef.current = false;
|
|
259
|
+
if (!useSliderA11y && shouldFocusOnScrollSettle) {
|
|
260
|
+
requestAccessibilityFocusOnView(itemRefs.current[clamped]);
|
|
261
|
+
}
|
|
262
|
+
// 程序化滚动(受控定位 / slider 转子步进的回中)触发的 scrollEnd:不重复归中、不重复上报。
|
|
263
|
+
// slider 的 commitIndexByA11y 已上报一次并置 sync=true,靠此早退去重(避免 _onPickEnd 重复);
|
|
264
|
+
// 受控回传的二次 settle 同理。早退须在归中之前,避免误开动画覆盖 effect 的 setEnableAnim(false)。
|
|
265
|
+
if (syncScrollFromPropsRef.current) {
|
|
266
|
+
syncScrollFromPropsRef.current = false;
|
|
267
|
+
isCenterTimerId.current = null;
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
const baseValue = clamped * itemHeightRef.current;
|
|
271
|
+
const randomOffset = Math.random() * 0.001;
|
|
272
|
+
// 用户手势归中:开动画,得到顺滑吸附过渡(此时内容尺寸已就绪,set 不会被 clamp)
|
|
273
|
+
setEnableAnim(true);
|
|
274
|
+
setTargetScrollTopWithScale(setTargetScrollTop, baseValue, randomOffset, lengthScaleRatioRef.current);
|
|
275
|
+
// 惯性停下归中时上报最终停留项:保证 onChange 值 = 最终视觉项。
|
|
276
|
+
// immediateChange 语义(松手即报)依赖原生惯性预测落点,H5/dynamic 无法获取,故统一走此路径。
|
|
277
|
+
_onColumnChange === null || _onColumnChange === void 0 ? void 0 : _onColumnChange(_columnId, clamped);
|
|
278
|
+
_onPickEnd === null || _onPickEnd === void 0 ? void 0 : _onPickEnd();
|
|
279
|
+
isCenterTimerId.current = null;
|
|
280
|
+
}, 100);
|
|
281
|
+
};
|
|
282
|
+
// 滚动中:更新高亮索引
|
|
283
|
+
const handleScroll = () => {
|
|
284
|
+
if (!scrollViewRef.current) return;
|
|
285
|
+
if (isCenterTimerId.current) {
|
|
286
|
+
clearTimeout(isCenterTimerId.current);
|
|
287
|
+
isCenterTimerId.current = null;
|
|
288
|
+
}
|
|
289
|
+
const scrollTop = scrollViewRef.current.scrollTop;
|
|
290
|
+
const newIndex = getSelectedIndex(scrollTop, itemHeightRef.current, lengthScaleRatioRef.current, useMeasuredScaleRef.current);
|
|
291
|
+
if (newIndex !== selectedIndexPropRef.current) {
|
|
292
|
+
if (!useSliderA11y) {
|
|
293
|
+
if (!syncScrollFromPropsRef.current || isTouchingRef.current) {
|
|
294
|
+
pendingScrollSettleFocusRef.current = true;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (isTouchingRef.current) {
|
|
298
|
+
syncScrollFromPropsRef.current = false;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
const clamped = clampIndex(newIndex);
|
|
302
|
+
if (clamped !== currentIndex) {
|
|
303
|
+
setCurrentIndex(clamped);
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
// 切换后主动播报当前项:焦点停在 slider 覆盖层上,aria 属性更新读屏不会自动重读,需主动触发
|
|
307
|
+
const announceIndex = index => {
|
|
308
|
+
const text = extractTextFromNode(items[index]);
|
|
309
|
+
if (!text) return;
|
|
310
|
+
const fn = Taro.accessibilityAnnounce;
|
|
311
|
+
if (typeof fn !== 'function') return;
|
|
312
|
+
fn({
|
|
313
|
+
announce: text,
|
|
314
|
+
delay: 300
|
|
315
|
+
});
|
|
316
|
+
};
|
|
317
|
+
// 无障碍步进提交:切到相邻项并上报
|
|
318
|
+
const commitIndexByA11y = nextIndex => {
|
|
319
|
+
const clamped = clampIndex(nextIndex);
|
|
320
|
+
if (clamped === currentIndex) return;
|
|
321
|
+
isTouchingRef.current = false;
|
|
322
|
+
setCurrentIndex(clamped);
|
|
323
|
+
// 标记程序化滚动:本次 setTargetScrollTop 会让 ScrollView settle 并重入 handleScrollEnd。
|
|
324
|
+
// 不设此 flag 的话 handleScrollEnd 会再次上报 + 触发 _onPickEnd(_onPickEnd 无 dedup,
|
|
325
|
+
// 每步误报"选择结束")。设 true 后 handleScrollEnd 命中早退,只由本函数上报一次。
|
|
326
|
+
syncScrollFromPropsRef.current = true;
|
|
327
|
+
// a11y 步进恒在内容就绪后,开动画得到顺滑过渡(不会被 clamp)
|
|
328
|
+
setEnableAnim(true);
|
|
329
|
+
const baseValue = clamped * itemHeightRef.current;
|
|
330
|
+
setTargetScrollTopWithScale(setTargetScrollTop, baseValue, Math.random() * 0.001, lengthScaleRatioRef.current);
|
|
331
|
+
// 只上报列变更(父级 handleColumnChange 有 JSON dedup);不调 _onPickEnd(步进非手势结束)
|
|
332
|
+
_onColumnChange === null || _onColumnChange === void 0 ? void 0 : _onColumnChange(_columnId, clamped);
|
|
333
|
+
announceIndex(clamped);
|
|
334
|
+
};
|
|
335
|
+
const handleAriaAction = e => {
|
|
336
|
+
var _a;
|
|
337
|
+
const actionName = (_a = e === null || e === void 0 ? void 0 : e.detail) === null || _a === void 0 ? void 0 : _a.actionName;
|
|
338
|
+
if (actionName === 'increment') commitIndexByA11y(currentIndex + 1);else if (actionName === 'decrement') commitIndexByA11y(currentIndex - 1);
|
|
339
|
+
};
|
|
340
|
+
// 无障碍 label:当前项文本;取不到(纯图标/复杂节点)则不挂
|
|
341
|
+
const ariaLabel = useSliderA11y ? extractTextFromNode(items[currentIndex]) || undefined : undefined;
|
|
342
|
+
// 每个 child 包固定高度容器,保证 index×itemHeight 计算可靠。
|
|
343
|
+
// slider 模式:整列作单 slider,item 全 ariaHidden(读屏只认覆盖层)。
|
|
344
|
+
// legacy 模式:item 是独立无障碍节点,挂 ref(聚焦) + id + onClick(点击跳转)。
|
|
345
|
+
// 包裹 View 的子节点是用户 children(可能是嵌套 View 而非纯文本),自身无可播报名字,
|
|
346
|
+
// 聚焦它读屏会静音;故 legacy 下注入 ariaLabel(提取文本)让它成为有名字的可聚焦叶子,
|
|
347
|
+
// 对齐 picker 老版"View 直接裹字符串"的隐式行为。
|
|
348
|
+
const wrappedItems = items.map((child, index) => {
|
|
349
|
+
const itemId = `picker-view-item-${_instanceId}-${_columnId}-${index}`;
|
|
350
|
+
const itemLabel = !useSliderA11y ? extractTextFromNode(child) || undefined : undefined;
|
|
351
|
+
return /*#__PURE__*/jsx(View, {
|
|
352
|
+
id: !useSliderA11y ? itemId : undefined,
|
|
353
|
+
ref: el => {
|
|
354
|
+
if (index === 0) firstItemRef.current = el;
|
|
355
|
+
if (!useSliderA11y) itemRefs.current[index] = el;
|
|
356
|
+
},
|
|
357
|
+
className: "taro-picker-view__item",
|
|
358
|
+
...(useSliderA11y ? {
|
|
359
|
+
ariaHidden: true
|
|
360
|
+
} : {}),
|
|
361
|
+
...(itemLabel ? {
|
|
362
|
+
ariaLabel: itemLabel
|
|
363
|
+
} : {}),
|
|
364
|
+
...(!useSliderA11y && _enableClickItemScroll ? {
|
|
365
|
+
onClick: () => scrollToItemId(itemId)
|
|
366
|
+
} : {}),
|
|
367
|
+
style: {
|
|
368
|
+
height: _itemHeight,
|
|
369
|
+
overflow: 'hidden'
|
|
370
|
+
},
|
|
371
|
+
children: child
|
|
372
|
+
}, index);
|
|
373
|
+
});
|
|
374
|
+
// 留白高度:
|
|
375
|
+
// - harmony:ArkUI 不解析 calc、百分比链不成立,用确定 px = (容器高 − 单项高)/2,
|
|
376
|
+
// 使选中项(首项)中心对齐容器中线;容器高由父组件解析下发(_containerHeight)。
|
|
377
|
+
// - 其它端:calc(50% - 半项高),依赖百分比高度链精确居中。
|
|
378
|
+
const isHarmony = process.env.TARO_PLATFORM === 'harmony';
|
|
379
|
+
const harmonyBlankPx = _containerHeight != null ? Math.max((_containerHeight - _itemHeight) / 2, 0) : 0;
|
|
380
|
+
const blankHeight = isHarmony ? harmonyBlankPx : `calc(50% - ${renderItemHeight / 2}px)`;
|
|
381
|
+
// harmony 上 ScrollView 自身也要确定 px(SCSS 的 height:100% 在 ArkUI 不成立)
|
|
382
|
+
const columnStyle = isHarmony && _containerHeight != null ? Object.assign({
|
|
383
|
+
height: _containerHeight
|
|
384
|
+
}, normalizeStyle(style)) : normalizeStyle(style);
|
|
385
|
+
// harmony 嵌套滚动:selfOnly 让本列独占滚动,不把手势链传给外层 ScrollView,
|
|
386
|
+
// 避免嵌在可滚动页面时父子争抢(下拉内部先、上拉外部先)。其它端不透传该属性。
|
|
387
|
+
const nestedScrollProps = isHarmony ? {
|
|
388
|
+
scrollForward: 'selfOnly',
|
|
389
|
+
scrollBackward: 'selfOnly'
|
|
390
|
+
} : {};
|
|
391
|
+
const blankTop = /*#__PURE__*/jsx(View, {
|
|
392
|
+
className: "taro-picker-view__column-blank",
|
|
393
|
+
...(useSliderA11y ? {
|
|
394
|
+
ariaHidden: true
|
|
395
|
+
} : {}),
|
|
396
|
+
style: {
|
|
397
|
+
height: blankHeight
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
const blankBottom = /*#__PURE__*/jsx(View, {
|
|
401
|
+
className: "taro-picker-view__column-blank",
|
|
402
|
+
...(useSliderA11y ? {
|
|
403
|
+
ariaHidden: true
|
|
404
|
+
} : {}),
|
|
405
|
+
style: {
|
|
406
|
+
height: blankHeight
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
// 非 slider 模式:ScrollView 直接作列(与改造前完全一致,其它端零影响)
|
|
410
|
+
// legacy a11y: enableClickItemScroll 时加 scrollIntoView + scrollIntoViewAlignment 支持点击跳转
|
|
411
|
+
if (!useSliderA11y) {
|
|
412
|
+
const clickScrollViewProps = _enableClickItemScroll ? {
|
|
413
|
+
scrollIntoView,
|
|
414
|
+
scrollIntoViewAlignment: 'center'
|
|
415
|
+
} : {};
|
|
416
|
+
return /*#__PURE__*/jsxs(ScrollView, {
|
|
417
|
+
ref: scrollViewRef,
|
|
418
|
+
id: id,
|
|
419
|
+
className: `taro-picker-view__column${className ? ` ${className}` : ''}`,
|
|
420
|
+
scrollY: true,
|
|
421
|
+
showScrollbar: false,
|
|
422
|
+
style: columnStyle,
|
|
423
|
+
scrollTop: targetScrollTop,
|
|
424
|
+
...clickScrollViewProps,
|
|
425
|
+
onScroll: handleScroll,
|
|
426
|
+
onTouchStart: () => {
|
|
427
|
+
isTouchingRef.current = true;
|
|
428
|
+
_onPickStart === null || _onPickStart === void 0 ? void 0 : _onPickStart();
|
|
429
|
+
},
|
|
430
|
+
onScrollEnd: handleScrollEnd,
|
|
431
|
+
scrollWithAnimation: enableAnim,
|
|
432
|
+
...nestedScrollProps,
|
|
433
|
+
children: [blankTop, wrappedItems, blankBottom]
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
// slider 模式:ScrollView 外包 relative 容器承载覆盖层。
|
|
437
|
+
// - 容器保留 taro-picker-view__column(flex:1 主轴撑宽,harmony 已证明)+ 用户 className;harmony 补 height px。
|
|
438
|
+
// - ScrollView 去掉列 class、加 a11y 隐藏;harmony 显式 height px + width:100%(harmony 上 height:100% 链失效、width:100% 有效),不依赖容器 flex 交叉轴 stretch。
|
|
439
|
+
// - id 仍落在 ScrollView(与非 slider 一致,防丢失)。
|
|
440
|
+
const containerStyle = isHarmony && _containerHeight != null ? Object.assign({
|
|
441
|
+
position: 'relative',
|
|
442
|
+
height: _containerHeight
|
|
443
|
+
}, normalizeStyle(style)) : Object.assign({
|
|
444
|
+
position: 'relative'
|
|
445
|
+
}, normalizeStyle(style));
|
|
446
|
+
const scrollViewStyle = isHarmony && _containerHeight != null ? {
|
|
447
|
+
height: _containerHeight,
|
|
448
|
+
width: '100%'
|
|
449
|
+
} : {
|
|
450
|
+
height: '100%'
|
|
451
|
+
};
|
|
452
|
+
// 覆盖层:harmony 上 top/bottom:0 派生高度失效(同 height:100% 那类),仿 __mask 用 width:100% + 显式 px。
|
|
453
|
+
// absolute 铺满整列 + zIndex:0,置于 ScrollView(relative + zIndex:1)下层:
|
|
454
|
+
// 上层 ScrollView 接管手势滚动,覆盖层不设 pointerEvents 也不拦触摸;
|
|
455
|
+
// 读屏因 ScrollView ariaHidden 被跳过,焦点落到下层未 hidden 的覆盖层——无需 checkIsOpenAccessibility。
|
|
456
|
+
const overlayStyle = isHarmony && _containerHeight != null ? {
|
|
457
|
+
position: 'absolute',
|
|
458
|
+
top: 0,
|
|
459
|
+
left: 0,
|
|
460
|
+
width: '100%',
|
|
461
|
+
height: _containerHeight,
|
|
462
|
+
zIndex: 0
|
|
463
|
+
} : {
|
|
464
|
+
position: 'absolute',
|
|
465
|
+
top: 0,
|
|
466
|
+
left: 0,
|
|
467
|
+
right: 0,
|
|
468
|
+
bottom: 0,
|
|
469
|
+
zIndex: 0
|
|
470
|
+
};
|
|
471
|
+
// ScrollView 需为定位元素(relative)且 zIndex 更高,才能真正盖在 absolute 覆盖层上层接管手势
|
|
472
|
+
const scrollViewLayeredStyle = Object.assign(Object.assign({}, scrollViewStyle), {
|
|
473
|
+
position: 'relative',
|
|
474
|
+
zIndex: 1
|
|
475
|
+
});
|
|
476
|
+
return /*#__PURE__*/jsxs(View, {
|
|
477
|
+
className: `taro-picker-view__column${className ? ` ${className}` : ''}`,
|
|
478
|
+
style: containerStyle,
|
|
479
|
+
children: [/*#__PURE__*/jsx(View, {
|
|
480
|
+
className: "taro-picker-view__a11y-overlay",
|
|
481
|
+
style: overlayStyle,
|
|
482
|
+
ariaRole: "slider",
|
|
483
|
+
ariaLabel: ariaLabel
|
|
484
|
+
// @ts-expect-error Taro View 未声明无障碍扩展 props
|
|
485
|
+
,
|
|
486
|
+
ariaAction: [{
|
|
487
|
+
name: 'increment',
|
|
488
|
+
label: 'increment'
|
|
489
|
+
}, {
|
|
490
|
+
name: 'decrement',
|
|
491
|
+
label: 'decrement'
|
|
492
|
+
}],
|
|
493
|
+
onAriaAction: handleAriaAction
|
|
494
|
+
}), /*#__PURE__*/jsxs(ScrollView, {
|
|
495
|
+
ref: scrollViewRef,
|
|
496
|
+
id: id,
|
|
497
|
+
scrollY: true,
|
|
498
|
+
showScrollbar: false,
|
|
499
|
+
ariaHidden: true,
|
|
500
|
+
style: scrollViewLayeredStyle,
|
|
501
|
+
scrollTop: targetScrollTop,
|
|
502
|
+
onScroll: handleScroll,
|
|
503
|
+
onTouchStart: () => {
|
|
504
|
+
isTouchingRef.current = true;
|
|
505
|
+
_onPickStart === null || _onPickStart === void 0 ? void 0 : _onPickStart();
|
|
506
|
+
},
|
|
507
|
+
onScrollEnd: handleScrollEnd,
|
|
508
|
+
scrollWithAnimation: enableAnim,
|
|
509
|
+
...nestedScrollProps,
|
|
510
|
+
children: [blankTop, wrappedItems, blankBottom]
|
|
511
|
+
})]
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
PickerViewColumn.displayName = 'PickerViewColumn';
|
|
515
|
+
|
|
516
|
+
export { PickerViewColumn, PickerViewColumn as default };
|
|
517
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/picker-view-column/index.tsx"],"sourcesContent":["import { ScrollView, View } from '@tarojs/components'\nimport Taro from '@tarojs/taro'\nimport * as React from 'react'\n\nimport { resolveUseMeasuredScale } from '../../utils/picker-scale'\n\ntype TaroScrollView = React.ElementRef<typeof ScrollView>\ntype TaroView = React.ElementRef<typeof View>\n\nfunction requestAccessibilityFocusOnView(node: TaroView | null | undefined): void {\n if (node == null) return\n const fn = (Taro as any).setAccessibilityFocus\n if (typeof fn !== 'function') return\n fn({ viewRef: { current: node } as React.RefObject<any> })\n}\n\nfunction usePickerItemScrollIntoView(): [string, (itemId: string) => void] {\n const [scrollIntoView, setScrollIntoView] = React.useState('')\n const pulseRef = React.useRef(0)\n const scrollToItemId = React.useCallback((itemId: string) => {\n pulseRef.current += 1\n const token = pulseRef.current\n setScrollIntoView('')\n setTimeout(() => {\n if (pulseRef.current !== token) return\n setScrollIntoView(itemId)\n }, 0)\n }, [])\n return [scrollIntoView, scrollToItemId]\n}\n\n// 默认单项高度(兜底值)\nconst DEFAULT_ITEM_HEIGHT = 34\n\n// 启用新版无障碍(slider 遮挡方案)所需的最低 app 版本;低于此版本或非 dynamic 端不加 slider\nconst MIN_A11Y_APP_VERSION = '15.9.50'\n\n// 逐段比较版本号:v1 > v2 返回 1,v1 < v2 返回 -1,相等返回 0(缺失段按 0 处理)\nfunction compareVersion(v1: string, v2: string): number {\n const a = String(v1).split('.')\n const b = String(v2).split('.')\n const len = Math.max(a.length, b.length)\n for (let i = 0; i < len; i++) {\n const n1 = parseInt(a[i], 10) || 0\n const n2 = parseInt(b[i], 10) || 0\n if (n1 > n2) return 1\n if (n1 < n2) return -1\n }\n return 0\n}\n\n// 模块级缓存:app version 不变,只算一次,避免 column 高频 re-render 每帧都调 getSystemInfoSync。\n// 未就绪(空 version / 抛错)时不写缓存、仅本次返回 false,下次 render 重试,保留 runtime 就绪后自愈能力。\nlet _sliderA11yResolved: boolean | undefined\nfunction resolveUseSliderA11y(): boolean {\n if (_sliderA11yResolved !== undefined) return _sliderA11yResolved\n if (process.env.TARO_ENV !== 'dynamic') { _sliderA11yResolved = false; return false }\n try {\n const version = (Taro as any).getSystemInfoSync()?.version || ''\n if (!version) return false // 未就绪:不缓存,下次重试\n _sliderA11yResolved = compareVersion(version, MIN_A11Y_APP_VERSION) >= 0\n return _sliderA11yResolved\n } catch {\n return false // 未就绪:不缓存,下次重试\n }\n}\n\n// 从 React 节点递归收集 string/number 子节点拼接文本,供无障碍播报用。\n// 复杂嵌套 / 纯图标 / 自定义组件无字符串子节点时返空,则不播报(可接受)。\nfunction extractTextFromNode(node: React.ReactNode): string {\n if (node == null || typeof node === 'boolean') return ''\n if (typeof node === 'string' || typeof node === 'number') return String(node)\n if (Array.isArray(node)) return node.map(extractTextFromNode).join('')\n if (React.isValidElement(node)) return extractTextFromNode((node.props as any).children)\n return ''\n}\n\n// 将 CSS 字符串解析为 React 样式对象(H5 下 DOM style 只接受对象)\nconst normalizeStyle = (style?: string | React.CSSProperties): React.CSSProperties => {\n if (!style) return {}\n if (typeof style !== 'string') return style\n const result: Record<string, string> = {}\n style.split(';').forEach((decl) => {\n const idx = decl.indexOf(':')\n if (idx === -1) return\n const key = decl.slice(0, idx).trim()\n const val = decl.slice(idx + 1).trim()\n if (!key || !val) return\n const camelKey = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase())\n result[camelKey] = val\n })\n return result as React.CSSProperties\n}\n\n// 计算 lengthScaleRatio(大屏适配缩放比)\nconst calculateLengthScaleRatio = (res: Taro.getSystemInfo.Result): number => {\n let lengthScaleRatio = (res as any)?.lengthScaleRatio\n if (lengthScaleRatio == null || lengthScaleRatio === 0) {\n lengthScaleRatio = 1\n if (res.windowWidth < 320) {\n lengthScaleRatio = res.windowWidth / 320\n } else if (res.windowWidth >= 400 && res.windowWidth < 600) {\n lengthScaleRatio = res.windowWidth / 400\n }\n const shortSide = res.windowWidth < res.windowHeight ? res.windowWidth : res.windowHeight\n const isBigScreen = shortSide >= 600\n if (isBigScreen) {\n lengthScaleRatio = shortSide / 720\n }\n }\n return lengthScaleRatio\n}\n\n// 设置 scrollTop(按平台决定是否乘缩放比)\nconst setTargetScrollTopWithScale = (\n setTargetScrollTop: (value: number) => void,\n baseValue: number,\n randomOffset?: number,\n lengthScaleRatio: number = 1,\n) => {\n if (process.env.TARO_ENV === 'h5' || process.env.TARO_ENV === 'weapp') {\n const finalValue = randomOffset !== undefined ? baseValue + randomOffset : baseValue\n setTargetScrollTop(finalValue)\n return\n }\n if (process.env.TARO_PLATFORM === 'harmony') {\n const finalValue = randomOffset !== undefined ? baseValue + randomOffset : baseValue\n setTargetScrollTop(finalValue)\n } else {\n const scaledValue = baseValue * lengthScaleRatio\n const finalValue = randomOffset !== undefined ? scaledValue + randomOffset : scaledValue\n setTargetScrollTop(finalValue)\n }\n}\n\n// 根据 scrollTop 计算选中索引\nconst getSelectedIndex = (scrollTop: number, itemHeight: number, lengthScaleRatio: number = 1, useMeasuredScale: boolean = false): number => {\n if (!useMeasuredScale || process.env.TARO_PLATFORM === 'harmony') {\n return Math.round(scrollTop / itemHeight)\n }\n return Math.round(scrollTop / lengthScaleRatio / itemHeight)\n}\n\nexport interface PickerViewColumnProps {\n children?: React.ReactNode\n id?: string\n className?: string\n style?: string | React.CSSProperties\n ariaLabel?: string\n // 以下为父组件 PickerView 通过 cloneElement 注入的内部 props\n _itemHeight?: number\n _selectedIndex?: number\n _columnId?: number\n // harmony 专用:父组件解析出的确定容器高(px)。其它端为 undefined,留白走 calc(50%)\n _containerHeight?: number\n /** 点击选项是否滚至选中区,默认 true */\n _enableClickItemScroll?: boolean\n /** 同页多实例时保证选项 id 唯一,避免 scrollIntoView 命中其它 PickerView */\n _instanceId?: string\n _onColumnChange?: (columnId: number, index: number) => void\n _onPickStart?: () => void\n _onPickEnd?: () => void\n}\n\nexport function PickerViewColumn(props: PickerViewColumnProps) {\n const {\n children,\n id,\n className,\n style,\n _itemHeight = DEFAULT_ITEM_HEIGHT,\n _selectedIndex = 0,\n _columnId = 0,\n _containerHeight,\n _enableClickItemScroll = true,\n _instanceId = '0',\n _onColumnChange,\n _onPickStart,\n _onPickEnd,\n } = props\n\n // 过滤有效子节点,得到真实可选项\n const items = React.Children.toArray(children).filter(React.isValidElement)\n const itemCount = items.length\n\n // 新版无障碍(slider 遮挡方案):仅 dynamic 且 app≥15.9.50、且列非空时启用。\n // 整列作单 slider,读屏转子 increment/decrement 切相邻项;覆盖层置于 ScrollView 下层,上层 ScrollView 接管手势滚动。\n // 须在 handleScroll / handleScrollEnd 之前定义,避免 no-use-before-define。\n const useSliderA11y = resolveUseSliderA11y() && itemCount > 0\n\n const [targetScrollTop, setTargetScrollTop] = React.useState(0)\n const scrollViewRef = React.useRef<TaroScrollView>(null)\n const firstItemRef = React.useRef<React.ElementRef<typeof View>>(null)\n const selectedIndexPropRef = React.useRef(_selectedIndex)\n selectedIndexPropRef.current = _selectedIndex\n const syncScrollFromPropsRef = React.useRef(false)\n const isTouchingRef = React.useRef(false)\n const itemRefs = React.useRef<Array<TaroView | null>>([])\n const pendingScrollSettleFocusRef = React.useRef(false)\n const [scrollIntoView, scrollToItemId] = usePickerItemScrollIntoView()\n const [currentIndex, setCurrentIndex] = React.useState(_selectedIndex)\n // 程序化定位(初始 / 受控跳转)不加动画,避免 dynamic 端内容尺寸就绪前动画帧被 clamp 成 0;\n // 用户手势归中吸附时才开动画,得到顺滑的吸附过渡。初值 false 保证首帧定位无滚入感。\n const [enableAnim, setEnableAnim] = React.useState(false)\n\n const lengthScaleRatioRef = React.useRef(1)\n const useMeasuredScaleRef = React.useRef(false)\n // 单项渲染高度:初值取注入的期望值,挂载后从 DOM 实测覆盖,\n // 以对齐 Taro rem 缩放后的真实像素(与容器高度同坐标系)。\n const itemHeightRef = React.useRef(_itemHeight)\n // 用于驱动留白 calc 重算的实测高度(渲染坐标系)\n const [renderItemHeight, setRenderItemHeight] = React.useState(_itemHeight)\n\n // 计算单项高度:对齐 picker-group calculateItemHeight 的平台/缩放分支,\n // 但因本组件留白是 calc(50%) 半屏高、与 item 不等高,不能用 scrollHeight/childNodes 平均,\n // 改为量单个 item 的 offsetHeight(所有 item 等高,item[0] 即代表值)。\n const measureItemHeight = React.useCallback(() => {\n let next: number\n if (process.env.TARO_PLATFORM === 'harmony') {\n // harmony:不依赖 DOM 测量,用设计值(measuredScale 时乘 ratio)\n next = useMeasuredScaleRef.current\n ? _itemHeight * lengthScaleRatioRef.current\n : _itemHeight\n } else {\n const el = firstItemRef.current as unknown as HTMLElement | null\n const h = el?.offsetHeight\n if (!h || h <= 0) return // 不可测量(native offsetHeight 缺失 / 隐藏态):保留现值\n // measuredScale 模式下 scrollHeight 已被系统放大,需除 ratio 换算回设计坐标系\n next = useMeasuredScaleRef.current ? h / lengthScaleRatioRef.current : h\n }\n if (next > 0 && next !== itemHeightRef.current) {\n itemHeightRef.current = next\n setRenderItemHeight(next)\n }\n }, [_itemHeight])\n\n // 初始化缩放模式判定\n React.useEffect(() => {\n Taro.getSystemInfo({\n success: (res) => {\n lengthScaleRatioRef.current = calculateLengthScaleRatio(res)\n useMeasuredScaleRef.current = resolveUseMeasuredScale(res)\n },\n fail: () => {\n lengthScaleRatioRef.current = 1\n useMeasuredScaleRef.current = false\n }\n })\n }, [])\n\n // 挂载 / children 数量 / 期望高变化后,实测真实单项高度\n React.useLayoutEffect(() => {\n measureItemHeight()\n }, [measureItemHeight, itemCount, _itemHeight])\n\n // props selectedIndex 变化 / 实测高变化:编程式滚至对应项,400ms 内标记为程序化滚动\n React.useEffect(() => {\n if (scrollViewRef.current && itemCount > 0 && !isTouchingRef.current) {\n syncScrollFromPropsRef.current = true\n // 程序化定位不加动画:dynamic 端内容尺寸就绪前动画帧会被 clamp 成 0,直接 set 才能在\n // onContentSizeChange 后被原生补齐;初始加载也不需要滚入感。\n setEnableAnim(false)\n const baseValue = _selectedIndex * itemHeightRef.current\n setTargetScrollTopWithScale(setTargetScrollTop, baseValue, undefined, lengthScaleRatioRef.current)\n setCurrentIndex(_selectedIndex)\n const tid = setTimeout(() => {\n syncScrollFromPropsRef.current = false\n }, 400)\n return () => clearTimeout(tid)\n }\n }, [_selectedIndex, itemCount, renderItemHeight])\n\n // 越界 clamp:>=count→末项,<0→0\n const clampIndex = (index: number): number => {\n if (itemCount === 0 || !Number.isFinite(index)) return 0\n if (index >= itemCount) return itemCount - 1\n if (index < 0) return 0\n return index\n }\n\n const isCenterTimerId = React.useRef<NodeJS.Timeout | null>(null)\n\n // 滚动静止后归中并同步选中\n const handleScrollEnd = () => {\n if (!scrollViewRef.current) return\n if (isCenterTimerId.current) {\n clearTimeout(isCenterTimerId.current)\n isCenterTimerId.current = null\n }\n // 100ms 内无新滚动则归中并提交索引\n isCenterTimerId.current = setTimeout(() => {\n if (!scrollViewRef.current) return\n const scrollTop = scrollViewRef.current.scrollTop\n const newIndex = getSelectedIndex(scrollTop, itemHeightRef.current, lengthScaleRatioRef.current, useMeasuredScaleRef.current)\n isTouchingRef.current = false\n\n const clamped = clampIndex(newIndex)\n\n // legacy a11y: 聚焦仅依赖用户滚动标记(pending),且放在 sync 早退之前——\n // 这样即便本拍 sync 因受控回传竞态被置 true,聚焦仍能触发(修\"不播报\"根因)。\n const shouldFocusOnScrollSettle = pendingScrollSettleFocusRef.current\n pendingScrollSettleFocusRef.current = false\n if (!useSliderA11y && shouldFocusOnScrollSettle) {\n requestAccessibilityFocusOnView(itemRefs.current[clamped])\n }\n\n // 程序化滚动(受控定位 / slider 转子步进的回中)触发的 scrollEnd:不重复归中、不重复上报。\n // slider 的 commitIndexByA11y 已上报一次并置 sync=true,靠此早退去重(避免 _onPickEnd 重复);\n // 受控回传的二次 settle 同理。早退须在归中之前,避免误开动画覆盖 effect 的 setEnableAnim(false)。\n if (syncScrollFromPropsRef.current) {\n syncScrollFromPropsRef.current = false\n isCenterTimerId.current = null\n return\n }\n\n const baseValue = clamped * itemHeightRef.current\n const randomOffset = Math.random() * 0.001\n // 用户手势归中:开动画,得到顺滑吸附过渡(此时内容尺寸已就绪,set 不会被 clamp)\n setEnableAnim(true)\n setTargetScrollTopWithScale(setTargetScrollTop, baseValue, randomOffset, lengthScaleRatioRef.current)\n // 惯性停下归中时上报最终停留项:保证 onChange 值 = 最终视觉项。\n // immediateChange 语义(松手即报)依赖原生惯性预测落点,H5/dynamic 无法获取,故统一走此路径。\n _onColumnChange?.(_columnId, clamped)\n _onPickEnd?.()\n\n isCenterTimerId.current = null\n }, 100)\n }\n\n // 滚动中:更新高亮索引\n const handleScroll = () => {\n if (!scrollViewRef.current) return\n if (isCenterTimerId.current) {\n clearTimeout(isCenterTimerId.current)\n isCenterTimerId.current = null\n }\n const scrollTop = scrollViewRef.current.scrollTop\n const newIndex = getSelectedIndex(scrollTop, itemHeightRef.current, lengthScaleRatioRef.current, useMeasuredScaleRef.current)\n if (newIndex !== selectedIndexPropRef.current) {\n if (!useSliderA11y) {\n if (!syncScrollFromPropsRef.current || isTouchingRef.current) {\n pendingScrollSettleFocusRef.current = true\n }\n }\n if (isTouchingRef.current) {\n syncScrollFromPropsRef.current = false\n }\n }\n const clamped = clampIndex(newIndex)\n if (clamped !== currentIndex) {\n setCurrentIndex(clamped)\n }\n }\n\n // 切换后主动播报当前项:焦点停在 slider 覆盖层上,aria 属性更新读屏不会自动重读,需主动触发\n const announceIndex = (index: number) => {\n const text = extractTextFromNode(items[index])\n if (!text) return\n const fn = (Taro as any).accessibilityAnnounce\n if (typeof fn !== 'function') return\n fn({ announce: text, delay: 300 })\n }\n\n // 无障碍步进提交:切到相邻项并上报\n const commitIndexByA11y = (nextIndex: number) => {\n const clamped = clampIndex(nextIndex)\n if (clamped === currentIndex) return\n isTouchingRef.current = false\n setCurrentIndex(clamped)\n // 标记程序化滚动:本次 setTargetScrollTop 会让 ScrollView settle 并重入 handleScrollEnd。\n // 不设此 flag 的话 handleScrollEnd 会再次上报 + 触发 _onPickEnd(_onPickEnd 无 dedup,\n // 每步误报\"选择结束\")。设 true 后 handleScrollEnd 命中早退,只由本函数上报一次。\n syncScrollFromPropsRef.current = true\n // a11y 步进恒在内容就绪后,开动画得到顺滑过渡(不会被 clamp)\n setEnableAnim(true)\n const baseValue = clamped * itemHeightRef.current\n setTargetScrollTopWithScale(setTargetScrollTop, baseValue, Math.random() * 0.001, lengthScaleRatioRef.current)\n // 只上报列变更(父级 handleColumnChange 有 JSON dedup);不调 _onPickEnd(步进非手势结束)\n _onColumnChange?.(_columnId, clamped)\n announceIndex(clamped)\n }\n\n const handleAriaAction = (e: any) => {\n const actionName = e?.detail?.actionName\n if (actionName === 'increment') commitIndexByA11y(currentIndex + 1)\n else if (actionName === 'decrement') commitIndexByA11y(currentIndex - 1)\n }\n\n // 无障碍 label:当前项文本;取不到(纯图标/复杂节点)则不挂\n const ariaLabel = useSliderA11y\n ? (extractTextFromNode(items[currentIndex]) || undefined)\n : undefined\n\n // 每个 child 包固定高度容器,保证 index×itemHeight 计算可靠。\n // slider 模式:整列作单 slider,item 全 ariaHidden(读屏只认覆盖层)。\n // legacy 模式:item 是独立无障碍节点,挂 ref(聚焦) + id + onClick(点击跳转)。\n // 包裹 View 的子节点是用户 children(可能是嵌套 View 而非纯文本),自身无可播报名字,\n // 聚焦它读屏会静音;故 legacy 下注入 ariaLabel(提取文本)让它成为有名字的可聚焦叶子,\n // 对齐 picker 老版\"View 直接裹字符串\"的隐式行为。\n const wrappedItems = items.map((child, index) => {\n const itemId = `picker-view-item-${_instanceId}-${_columnId}-${index}`\n const itemLabel = !useSliderA11y ? (extractTextFromNode(child) || undefined) : undefined\n return (\n <View\n key={index}\n id={!useSliderA11y ? itemId : undefined}\n ref={(el) => {\n if (index === 0) (firstItemRef as any).current = el\n if (!useSliderA11y) itemRefs.current[index] = el\n }}\n className=\"taro-picker-view__item\"\n {...(useSliderA11y ? { ariaHidden: true } : {})}\n {...(itemLabel ? { ariaLabel: itemLabel } : {})}\n {...(!useSliderA11y && _enableClickItemScroll\n ? { onClick: () => scrollToItemId(itemId) }\n : {})}\n style={{ height: _itemHeight, overflow: 'hidden' }}\n >\n {child}\n </View>\n )\n })\n\n // 留白高度:\n // - harmony:ArkUI 不解析 calc、百分比链不成立,用确定 px = (容器高 − 单项高)/2,\n // 使选中项(首项)中心对齐容器中线;容器高由父组件解析下发(_containerHeight)。\n // - 其它端:calc(50% - 半项高),依赖百分比高度链精确居中。\n const isHarmony = process.env.TARO_PLATFORM === 'harmony'\n const harmonyBlankPx = _containerHeight != null\n ? Math.max((_containerHeight - _itemHeight) / 2, 0)\n : 0\n const blankHeight: string | number = isHarmony\n ? harmonyBlankPx\n : `calc(50% - ${renderItemHeight / 2}px)`\n // harmony 上 ScrollView 自身也要确定 px(SCSS 的 height:100% 在 ArkUI 不成立)\n const columnStyle: React.CSSProperties = isHarmony && _containerHeight != null\n ? { height: _containerHeight, ...normalizeStyle(style) }\n : normalizeStyle(style)\n // harmony 嵌套滚动:selfOnly 让本列独占滚动,不把手势链传给外层 ScrollView,\n // 避免嵌在可滚动页面时父子争抢(下拉内部先、上拉外部先)。其它端不透传该属性。\n const nestedScrollProps = isHarmony\n ? { scrollForward: 'selfOnly', scrollBackward: 'selfOnly' }\n : {}\n\n const blankTop = (\n <View\n className=\"taro-picker-view__column-blank\"\n {...(useSliderA11y ? { ariaHidden: true } : {})}\n style={{ height: blankHeight }}\n />\n )\n const blankBottom = (\n <View\n className=\"taro-picker-view__column-blank\"\n {...(useSliderA11y ? { ariaHidden: true } : {})}\n style={{ height: blankHeight }}\n />\n )\n\n // 非 slider 模式:ScrollView 直接作列(与改造前完全一致,其它端零影响)\n // legacy a11y: enableClickItemScroll 时加 scrollIntoView + scrollIntoViewAlignment 支持点击跳转\n if (!useSliderA11y) {\n const clickScrollViewProps = _enableClickItemScroll\n ? { scrollIntoView, scrollIntoViewAlignment: 'center' as const }\n : {}\n return (\n <ScrollView\n ref={scrollViewRef}\n id={id}\n className={`taro-picker-view__column${className ? ` ${className}` : ''}`}\n scrollY\n showScrollbar={false}\n style={columnStyle}\n scrollTop={targetScrollTop}\n {...clickScrollViewProps}\n onScroll={handleScroll}\n onTouchStart={() => { isTouchingRef.current = true; _onPickStart?.() }}\n onScrollEnd={handleScrollEnd}\n scrollWithAnimation={enableAnim}\n {...nestedScrollProps}\n >\n {blankTop}\n {wrappedItems}\n {blankBottom}\n </ScrollView>\n )\n }\n\n // slider 模式:ScrollView 外包 relative 容器承载覆盖层。\n // - 容器保留 taro-picker-view__column(flex:1 主轴撑宽,harmony 已证明)+ 用户 className;harmony 补 height px。\n // - ScrollView 去掉列 class、加 a11y 隐藏;harmony 显式 height px + width:100%(harmony 上 height:100% 链失效、width:100% 有效),不依赖容器 flex 交叉轴 stretch。\n // - id 仍落在 ScrollView(与非 slider 一致,防丢失)。\n const containerStyle: React.CSSProperties = isHarmony && _containerHeight != null\n ? { position: 'relative', height: _containerHeight, ...normalizeStyle(style) }\n : { position: 'relative', ...normalizeStyle(style) }\n const scrollViewStyle: React.CSSProperties = isHarmony && _containerHeight != null\n ? { height: _containerHeight, width: '100%' }\n : { height: '100%' }\n // 覆盖层:harmony 上 top/bottom:0 派生高度失效(同 height:100% 那类),仿 __mask 用 width:100% + 显式 px。\n // absolute 铺满整列 + zIndex:0,置于 ScrollView(relative + zIndex:1)下层:\n // 上层 ScrollView 接管手势滚动,覆盖层不设 pointerEvents 也不拦触摸;\n // 读屏因 ScrollView ariaHidden 被跳过,焦点落到下层未 hidden 的覆盖层——无需 checkIsOpenAccessibility。\n const overlayStyle: React.CSSProperties = isHarmony && _containerHeight != null\n ? { position: 'absolute', top: 0, left: 0, width: '100%', height: _containerHeight, zIndex: 0 }\n : { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, zIndex: 0 }\n // ScrollView 需为定位元素(relative)且 zIndex 更高,才能真正盖在 absolute 覆盖层上层接管手势\n const scrollViewLayeredStyle: React.CSSProperties = { ...scrollViewStyle, position: 'relative', zIndex: 1 }\n\n return (\n <View\n className={`taro-picker-view__column${className ? ` ${className}` : ''}`}\n style={containerStyle}\n >\n {/* 无障碍焦点靶:置于 ScrollView 之前(下层)。读屏焦点落此(内部无可滚动祖先,\n 左右滑=切焦点而非滚动);上层 ScrollView 接管手势,故无需 pointerEvents:none。 */}\n <View\n className=\"taro-picker-view__a11y-overlay\"\n style={overlayStyle}\n ariaRole=\"slider\"\n ariaLabel={ariaLabel}\n // @ts-expect-error Taro View 未声明无障碍扩展 props\n ariaAction={[\n { name: 'increment', label: 'increment' },\n { name: 'decrement', label: 'decrement' },\n ]}\n onAriaAction={handleAriaAction}\n />\n <ScrollView\n ref={scrollViewRef}\n id={id}\n scrollY\n showScrollbar={false}\n ariaHidden\n style={scrollViewLayeredStyle}\n scrollTop={targetScrollTop}\n onScroll={handleScroll}\n onTouchStart={() => { isTouchingRef.current = true; _onPickStart?.() }}\n onScrollEnd={handleScrollEnd}\n scrollWithAnimation={enableAnim}\n {...nestedScrollProps}\n >\n {blankTop}\n {wrappedItems}\n {blankBottom}\n </ScrollView>\n </View>\n )\n}\n\nPickerViewColumn.displayName = 'PickerViewColumn'\n\nexport default PickerViewColumn\n"],"names":["requestAccessibilityFocusOnView","node","fn","Taro","setAccessibilityFocus","viewRef","current","usePickerItemScrollIntoView","scrollIntoView","setScrollIntoView","React","useState","pulseRef","useRef","scrollToItemId","useCallback","itemId","token","setTimeout","DEFAULT_ITEM_HEIGHT","MIN_A11Y_APP_VERSION","compareVersion","v1","v2","a","String","split","b","len","Math","max","length","i","n1","parseInt","n2","_sliderA11yResolved","resolveUseSliderA11y","undefined","process","env","TARO_ENV","version","_a","getSystemInfoSync","_b","extractTextFromNode","Array","isArray","map","join","isValidElement","props","children","normalizeStyle","style","result","forEach","decl","idx","indexOf","key","slice","trim","val","camelKey","replace","_","c","toUpperCase","calculateLengthScaleRatio","res","lengthScaleRatio","windowWidth","shortSide","windowHeight","isBigScreen","setTargetScrollTopWithScale","setTargetScrollTop","baseValue","randomOffset","arguments","finalValue","TARO_PLATFORM","scaledValue","getSelectedIndex","scrollTop","itemHeight","useMeasuredScale","round","PickerViewColumn","id","className","_itemHeight","_selectedIndex","_columnId","_containerHeight","_enableClickItemScroll","_instanceId","_onColumnChange","_onPickStart","_onPickEnd","items","Children","toArray","filter","itemCount","useSliderA11y","targetScrollTop","scrollViewRef","firstItemRef","selectedIndexPropRef","syncScrollFromPropsRef","isTouchingRef","itemRefs","pendingScrollSettleFocusRef","currentIndex","setCurrentIndex","enableAnim","setEnableAnim","lengthScaleRatioRef","useMeasuredScaleRef","itemHeightRef","renderItemHeight","setRenderItemHeight","measureItemHeight","next","el","h","offsetHeight","useEffect","getSystemInfo","success","resolveUseMeasuredScale","fail","useLayoutEffect","tid","clearTimeout","clampIndex","index","Number","isFinite","isCenterTimerId","handleScrollEnd","newIndex","clamped","shouldFocusOnScrollSettle","random","handleScroll","announceIndex","text","accessibilityAnnounce","announce","delay","commitIndexByA11y","nextIndex","handleAriaAction","e","actionName","detail","ariaLabel","wrappedItems","child","itemLabel","_jsx","View","ref","ariaHidden","onClick","height","overflow","isHarmony","harmonyBlankPx","blankHeight","columnStyle","nestedScrollProps","scrollForward","scrollBackward","blankTop","blankBottom","clickScrollViewProps","scrollIntoViewAlignment","_jsxs","ScrollView","scrollY","showScrollbar","onScroll","onTouchStart","onScrollEnd","scrollWithAnimation","containerStyle","Object","assign","position","scrollViewStyle","width","overlayStyle","top","left","zIndex","right","bottom","scrollViewLayeredStyle","ariaRole","ariaAction","name","label","onAriaAction","displayName"],"mappings":"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"}
|