这是React/React Native,但我觉得这个问题与JavaScript有关。不管怎样,这是我有的:
onViewableItemsChanged={({ viewableItems }) => {
if (viewableItems.length > 0) {
setActiveIndex(viewableItems[0].index || 0)
}
}}
,viewableItems是被破坏的东西。我们可以访问它,因为我们正在使用onViewableItemsChanged. 但是当我把这个函数移到别处时,比如:
onViewableItemsChanged={onFlatlistUpdate}
const onFlatlistUpdate = useCallback(({ viewableItems }) => {
if (viewableItems.length > 0) {
setActiveIndex(viewableItems[0].index || 0)
}
}, [])
I don ' t get whereviewableItems是来自哪里?我的意思是,在第一个例子中,它是从onViewableItemsChanged的上下文中解构的. 然而在第二个例子中,它是完全独立的,远离onViewableItemsChanged(当然我们使用的是useCallback但这无关紧要)那么我们是怎么接触到它的呢?
TL博士:在第二个例子中(onFlatlistUpdate),其中是viewableItems如何访问viewableItems
?在这两个示例中,您都将一个函数传递给onViewableItemsChanged
prop。在第一种情况下,您将创建一个内联匿名函数,并将该函数引用传递给onViewableItemsChanged
。在第二种情况下,您正在使用useCallback()
创建一个函数,然后将其传递给onViewableItemsChanged
(由useCallback()
返回的函数将转发它传递给您提供的函数的任何参数)。在内部,具有onViewableItemsChanged
属性的FlatList
组件将调用该函数并传递带有viewableItems
的对象,例如onViewableItemsChanged({viewableItems: ...})
。这允许您在传递给FlatList
组件的函数中解构对象。
我的意思是在第一个例子中,它是从上下文中解构的onViewableItemsChanged
onViewableItemsChanged
没有真正的"上下文"。onViewableItemsChanged
只是一个传递函数给它的道具。然后如何在FlatList
中调用该函数决定了该函数的参数。这是由FlatList
组件的内部处理,你不需要担心太多。你可以独立创建这个函数,也可以内联创建它,在这两种情况下,你传递给onViewableItemsChanged
的函数引用可以被FlatList
调用。
myFlatList
:
const myFlatList = (onViewableItemsChanged) => {
onViewableItemsChanged({viewableItems: [1, 2, 3]});
}
// Defining the callback function inline
myFlatList(({viewableItems}) => {
console.log("inline", viewableItems);
});
// Similar to your `useCallback()` definition
const callbackFn = ({viewableItems}) => {
console.log("independent", viewableItems);
}
myFlatList(callbackFn);