React-Native:Ref 缺少 FlatList 的 scrollToIndex()
React-Native: Ref is missing scrollToIndex() for FlatList
我正在将引用传递给 FlatList 并期望访问 scrollToIndex() 函数,但它没有出现在控制台中,当我尝试使用它时它抛出错误说“scrollTo() is not一个函数”,它甚至没有意识到我正在尝试使用 scrollToIndex()。
这是我代码中的一个简单用法示例:
const ref = useRef()
ref.current?.scrollToIndex({index:itemIndex,animated:true})
<FlatList ref={ref} .../>
有没有人经历过这个并且知道如何让它发挥作用?我查看了文档和示例,一切似乎都很好。如有任何帮助,我们将不胜感激!
更新:
组件:
import React from "react";
import { View, FlatList, ImageBackground,TouchableOpacity,ScrollView,StyleSheet, Text} from "react-native";
const Projects = ({ index, navigation }) => {
const {width} = Dimensions.get("window")
const [imageIndex, setIndex] = React.useState(0)
const ref = React.useRef()
const wItem = (width - 63) / 2;
console.log("index projects", imageIndex)
const scrollToIndex = (index)=>{
if(ref.current){
ref.current.scrollToIndex({index:index})
}
}
const goToIndex = React.useCallback((info) => {
const wait = new Promise(resolve => setTimeout(resolve, 200));
wait.then(() => {
ref.current?.scrollToIndex({ index: info.index, animated: true });
})
}, [])
return (
<ScrollView >
<TouchableOpacity onPress={()=> scrollToIndex(5)}><Text>Scroll to</Text></TouchableOpacity>
<FlatList ref={ref}
nestedScrollEnabled
numColumns={2}
data={DATA}
onScrollToIndexFailed={(index)=>goToIndex(index)}
style={styles.flatList}
keyExtractor={(i, index) => index.toString()}
renderItem={({ item, index }) => (
<View style={styles.item}>
<ImageBackground
source={item.image}
/* @ts-ignore */
imageStyle={styles.imgStyle}
style={{ width: wItem, height: wItem, alignItems: "flex-end" }}>
</ImageBackground>
</TouchableOpacity>
<Text>{item.title}</Text>
</View>
)}
/>
</ScrollView>
);
};
export default Projects;
const styles = StyleSheet.create({
container: {
flex: 1,
},
item: {
marginRight: 15,
marginBottom: 24,
alignItems:'center'
},
flatList: {
marginHorizontal: 24,
marginTop: 16,
},
imgStyle: {
borderRadius: 12,
},
});
const DATA = [//本地图片列表]
无法调用scrollTo,因为ref在使用的时候只是初始化,没有赋值:
const ref = useRef()
// ref = null
ref.current?.scrollToIndex({index:itemIndex,animated:true})
// ref = null
<FlatList ref={ref} .../>
// ref != null
因此在您第一次渲染之前不会分配 ref。这意味着如果你想在 ref 上调用 .scrollTo() ,你可以通过两种不同的方式进行:
1 - 如果您想最初滚动到某个索引:
useEffect(() => {
const initialIndex = 34 //random number
if (ref.current){
ref.current.scrollToIndex({index: initialIndex})
}
}, [ref])
依赖数组中的 ref
将确保只要 ref
的值发生变化,useEffect 就会 运行 (在这种情况下,一旦它被分配给一个通过呈现 <Flatlist />
的值
2 - 如果你想按需滚动到某个索引:
const handleScrollTo = (index) => {
if (ref.current && typeof ref.current.scrollToIndex === 'function'){
ref.current.scrollToIndex({index: index})
}
}
这个函数应该连接到类似 onPress 或类似的东西,这意味着只要用户按下按钮就应该定义 ref
因为能够看到按钮并按下它需要组件有呈现。尽管 ref.current 在此处使用后就应该已经分配,但最好确保它不会在没有崩溃的情况下崩溃,这就是我们添加 if-statement 的原因.
我正在将引用传递给 FlatList 并期望访问 scrollToIndex() 函数,但它没有出现在控制台中,当我尝试使用它时它抛出错误说“scrollTo() is not一个函数”,它甚至没有意识到我正在尝试使用 scrollToIndex()。
这是我代码中的一个简单用法示例:
const ref = useRef()
ref.current?.scrollToIndex({index:itemIndex,animated:true})
<FlatList ref={ref} .../>
有没有人经历过这个并且知道如何让它发挥作用?我查看了文档和示例,一切似乎都很好。如有任何帮助,我们将不胜感激!
更新:
组件:
import React from "react";
import { View, FlatList, ImageBackground,TouchableOpacity,ScrollView,StyleSheet, Text} from "react-native";
const Projects = ({ index, navigation }) => {
const {width} = Dimensions.get("window")
const [imageIndex, setIndex] = React.useState(0)
const ref = React.useRef()
const wItem = (width - 63) / 2;
console.log("index projects", imageIndex)
const scrollToIndex = (index)=>{
if(ref.current){
ref.current.scrollToIndex({index:index})
}
}
const goToIndex = React.useCallback((info) => {
const wait = new Promise(resolve => setTimeout(resolve, 200));
wait.then(() => {
ref.current?.scrollToIndex({ index: info.index, animated: true });
})
}, [])
return (
<ScrollView >
<TouchableOpacity onPress={()=> scrollToIndex(5)}><Text>Scroll to</Text></TouchableOpacity>
<FlatList ref={ref}
nestedScrollEnabled
numColumns={2}
data={DATA}
onScrollToIndexFailed={(index)=>goToIndex(index)}
style={styles.flatList}
keyExtractor={(i, index) => index.toString()}
renderItem={({ item, index }) => (
<View style={styles.item}>
<ImageBackground
source={item.image}
/* @ts-ignore */
imageStyle={styles.imgStyle}
style={{ width: wItem, height: wItem, alignItems: "flex-end" }}>
</ImageBackground>
</TouchableOpacity>
<Text>{item.title}</Text>
</View>
)}
/>
</ScrollView>
);
};
export default Projects;
const styles = StyleSheet.create({
container: {
flex: 1,
},
item: {
marginRight: 15,
marginBottom: 24,
alignItems:'center'
},
flatList: {
marginHorizontal: 24,
marginTop: 16,
},
imgStyle: {
borderRadius: 12,
},
});
const DATA = [//本地图片列表]
无法调用scrollTo,因为ref在使用的时候只是初始化,没有赋值:
const ref = useRef()
// ref = null
ref.current?.scrollToIndex({index:itemIndex,animated:true})
// ref = null
<FlatList ref={ref} .../>
// ref != null
因此在您第一次渲染之前不会分配 ref。这意味着如果你想在 ref 上调用 .scrollTo() ,你可以通过两种不同的方式进行:
1 - 如果您想最初滚动到某个索引:
useEffect(() => {
const initialIndex = 34 //random number
if (ref.current){
ref.current.scrollToIndex({index: initialIndex})
}
}, [ref])
依赖数组中的 ref
将确保只要 ref
的值发生变化,useEffect 就会 运行 (在这种情况下,一旦它被分配给一个通过呈现 <Flatlist />
2 - 如果你想按需滚动到某个索引:
const handleScrollTo = (index) => {
if (ref.current && typeof ref.current.scrollToIndex === 'function'){
ref.current.scrollToIndex({index: index})
}
}
这个函数应该连接到类似 onPress 或类似的东西,这意味着只要用户按下按钮就应该定义 ref
因为能够看到按钮并按下它需要组件有呈现。尽管 ref.current 在此处使用后就应该已经分配,但最好确保它不会在没有崩溃的情况下崩溃,这就是我们添加 if-statement 的原因.