Skip to content

Commit cfa8fa1

Browse files
authored
Merge pull request #2176 from didi/fix-movable-runonjs
fix: movable bindchange报错 & runOnJS 闭包缓存问题
2 parents 3a6b887 + 7932a25 commit cfa8fa1

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

packages/webpack-plugin/lib/runtime/components/react/mpx-movable-view.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -200,16 +200,6 @@ const _MovableView = forwardRef<HandlerRef<View, MovableViewProps>, MovableViewP
200200
)
201201
}, [])
202202

203-
// 节流版本的 change 事件触发
204-
const handleTriggerChangeThrottled = useCallback(({ x, y, type }: { x: number; y: number; type?: string }) => {
205-
'worklet'
206-
const now = Date.now()
207-
if (now - lastChangeTime.value >= changeThrottleTime) {
208-
lastChangeTime.value = now
209-
runOnJS(runOnJSCallback)('handleTriggerChange', { x, y, type })
210-
}
211-
}, [changeThrottleTime])
212-
213203
useEffect(() => {
214204
runOnUI(() => {
215205
if (offsetX.value !== x || offsetY.value !== y) {
@@ -414,6 +404,16 @@ const _MovableView = forwardRef<HandlerRef<View, MovableViewProps>, MovableViewP
414404
})
415405
const runOnJSCallback = useRunOnJSCallback(runOnJSCallbackRef)
416406

407+
// 节流版本的change事件触发
408+
const handleTriggerChangeThrottled = useCallback(({ x, y, type }: { x: number; y: number; type?: string }) => {
409+
'worklet'
410+
const now = Date.now()
411+
if (now - lastChangeTime.value >= changeThrottleTime) {
412+
lastChangeTime.value = now
413+
runOnJS(runOnJSCallback)('handleTriggerChange', { x, y, type })
414+
}
415+
}, [changeThrottleTime])
416+
417417
const gesture = useMemo(() => {
418418
const handleTriggerMove = (e: GestureTouchEvent) => {
419419
'worklet'

packages/webpack-plugin/lib/runtime/components/react/mpx-scroll-view.tsx

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,18 @@ const _ScrollView = forwardRef<HandlerRef<ScrollView & View, ScrollViewProps>, S
211211

212212
const scrollViewRef = useRef<ScrollView>(null)
213213

214+
const propsRef = useRef(props)
215+
const refresherStateRef = useRef({
216+
hasRefresher,
217+
refresherTriggered
218+
})
219+
220+
propsRef.current = props
221+
refresherStateRef.current = {
222+
hasRefresher,
223+
refresherTriggered
224+
}
225+
214226
const runOnJSCallbackRef = useRef({
215227
setEnableScroll,
216228
setScrollBounces,
@@ -524,6 +536,7 @@ const _ScrollView = forwardRef<HandlerRef<ScrollView & View, ScrollViewProps>, S
524536

525537
// 处理刷新
526538
function onRefresh () {
539+
const { hasRefresher, refresherTriggered } = refresherStateRef.current
527540
if (hasRefresher && refresherTriggered === undefined) {
528541
// 处理使用了自定义刷新组件,又没设置 refresherTriggered 的情况
529542
setRefreshing(true)
@@ -535,10 +548,10 @@ const _ScrollView = forwardRef<HandlerRef<ScrollView & View, ScrollViewProps>, S
535548
}
536549
}, 500)
537550
}
538-
const { bindrefresherrefresh } = props
551+
const { bindrefresherrefresh } = propsRef.current
539552
bindrefresherrefresh &&
540553
bindrefresherrefresh(
541-
getCustomEvent('refresherrefresh', {}, { layoutRef }, props)
554+
getCustomEvent('refresherrefresh', {}, { layoutRef }, propsRef.current)
542555
)
543556
}
544557

0 commit comments

Comments
 (0)