FlatList、Props ListHeaderComponent 和 Dynamic flatlist 数据
FlatList, Props ListHeaderComponent and Dynamic flatlist data
对不起这个标题,我没有灵感,我不知道为我的问题取什么标题。
我在我的 React 本机应用程序上使用 Socket.io
来呈现一些动态数据。
我正在使用 FlatList
来显示所有这些数据,我需要在 FlatList
.
顶部显示一些内容,例如过滤器和按钮
所以在我的 FlatList
Props 中,我使用了 ListHeaderComponent
并且在这个组件中我显示了另一个平面列表和内容。
我的问题是:
当主要 FlatList
使用 Socket.io
响应之一更新时(每 5 秒),ListHeaderComponent
显示的所有组件在一段时间内都无法使用。
这段时间大约为 500 毫秒或更短,但在 ListHeaderComponent
中我有一些按钮/过滤器,在此期间它们不可点击。
而且每次更新FlatList数据都会重复这个问题
你可以在这里看到我的代码(简单):
export default function MyList({ navigation }) {
const [myData, setMyData] = useState<ResponseType[]>([])
// Socket Io
const socket = io(SOCKET_URL, { forceNew: true, timeout: 5000 })
useEffect(() => {
socket.on("connect", () => {
console.log("Connected to Socket ID : ", socket.id)
})
return () => {
socket.disconnect()
socket.close()
}
},[])
socket.on("socketResponse", (data: ResponseType) => {
setMyData(prevDate => [...prevDate, data])
})
const renderFilterItem = ({ item }: { item: Filter }) => <Text key={ item.id }>{ item.title }</Text>
const renderListItem = ({ item }: { item: ResponseType }) => <Text key={ item.id }>{ item.id }</Text>
const ListTop = () => (
<>
<TouchableOpacity onPress={() => navigation.navigate('HomePage')}>
<Text>BACK CONTENT</Text>
</TouchableOpacity>
<FlatList
horizontal
showsHorizontalScrollIndicator={false}
data={someFilters}
keyExtractor={(item) => item.id}
renderItem={renderFilterItem}
/>
</>
)
return (
<FlatList
ListHeaderComponent={ListTop}
data={myData}
keyExtractor={(item) => item.id}
renderItem={renderListItem}
maxToRenderPerBatch={5}
windowSize={2}
/>
)
}
我不知道如何更好地解释我的问题。但是如果我把 ListHeaderComponent
的组件移到 FlatList 上面,就没有问题了。
但是如果我这样做,只有 FlatList 是可滚动的,我希望所有页面都可滚动。
由于这个错误,我无法用 ScrollView
包装我的平面列表:VirtualizedLists should never be nested inside plain ScrollViews with the same orientation
有人遇到过这个问题吗?
谢谢
尝试对 ListTop 组件进行优化,因为这里可能出现的问题是由于父组件的更改而导致功能组件的渲染。
这是代码示例。
import React, {useCallback} from 'react';
// your other codes
const ListTop = useCallback(() => (
<>
<TouchableOpacity onPress={() => navigation.navigate('HomePage')}>
<Text>BACK CONTENT</Text>
</TouchableOpacity>
<FlatList
horizontal
showsHorizontalScrollIndicator={false}
data={someFilters}
keyExtractor={(item) => item.id}
renderItem={renderFilterItem}
/>
</>
), [someFilters]);
此处组件将被记忆,直到 someFilters 没有变化。
对不起这个标题,我没有灵感,我不知道为我的问题取什么标题。
我在我的 React 本机应用程序上使用 Socket.io
来呈现一些动态数据。
我正在使用 FlatList
来显示所有这些数据,我需要在 FlatList
.
顶部显示一些内容,例如过滤器和按钮
所以在我的 FlatList
Props 中,我使用了 ListHeaderComponent
并且在这个组件中我显示了另一个平面列表和内容。
我的问题是:
当主要 FlatList
使用 Socket.io
响应之一更新时(每 5 秒),ListHeaderComponent
显示的所有组件在一段时间内都无法使用。
这段时间大约为 500 毫秒或更短,但在 ListHeaderComponent
中我有一些按钮/过滤器,在此期间它们不可点击。
而且每次更新FlatList数据都会重复这个问题
你可以在这里看到我的代码(简单):
export default function MyList({ navigation }) {
const [myData, setMyData] = useState<ResponseType[]>([])
// Socket Io
const socket = io(SOCKET_URL, { forceNew: true, timeout: 5000 })
useEffect(() => {
socket.on("connect", () => {
console.log("Connected to Socket ID : ", socket.id)
})
return () => {
socket.disconnect()
socket.close()
}
},[])
socket.on("socketResponse", (data: ResponseType) => {
setMyData(prevDate => [...prevDate, data])
})
const renderFilterItem = ({ item }: { item: Filter }) => <Text key={ item.id }>{ item.title }</Text>
const renderListItem = ({ item }: { item: ResponseType }) => <Text key={ item.id }>{ item.id }</Text>
const ListTop = () => (
<>
<TouchableOpacity onPress={() => navigation.navigate('HomePage')}>
<Text>BACK CONTENT</Text>
</TouchableOpacity>
<FlatList
horizontal
showsHorizontalScrollIndicator={false}
data={someFilters}
keyExtractor={(item) => item.id}
renderItem={renderFilterItem}
/>
</>
)
return (
<FlatList
ListHeaderComponent={ListTop}
data={myData}
keyExtractor={(item) => item.id}
renderItem={renderListItem}
maxToRenderPerBatch={5}
windowSize={2}
/>
)
}
我不知道如何更好地解释我的问题。但是如果我把 ListHeaderComponent
的组件移到 FlatList 上面,就没有问题了。
但是如果我这样做,只有 FlatList 是可滚动的,我希望所有页面都可滚动。
由于这个错误,我无法用 ScrollView
包装我的平面列表:VirtualizedLists should never be nested inside plain ScrollViews with the same orientation
有人遇到过这个问题吗?
谢谢
尝试对 ListTop 组件进行优化,因为这里可能出现的问题是由于父组件的更改而导致功能组件的渲染。
这是代码示例。
import React, {useCallback} from 'react';
// your other codes
const ListTop = useCallback(() => (
<>
<TouchableOpacity onPress={() => navigation.navigate('HomePage')}>
<Text>BACK CONTENT</Text>
</TouchableOpacity>
<FlatList
horizontal
showsHorizontalScrollIndicator={false}
data={someFilters}
keyExtractor={(item) => item.id}
renderItem={renderFilterItem}
/>
</>
), [someFilters]);
此处组件将被记忆,直到 someFilters 没有变化。