reactjs 不断得到“不支持动态更改onViewableItemsChanged”

liwlm1x9  于 2023-01-25  发布在  React
关注(0)|答案(2)|浏览(111)

在我的项目中,我有一个(水平)FlatList,我想在新页面可见时触发一个函数。我知道我需要指定viewabilityConfig和onViewableItemsChanged。但是,当我这样做时,我一直收到这个错误消息:"不支持动态更改onViewableItemsChanged"。
我是一个新手,所以看其他关于同样错误的帖子并没有让我更聪明。
有什么想法吗?

const DATA = [
  20201202 = {
    id: "20201202",
    data: day1,
  },
  2020120 = {
    id: "2020120",
    data: day2,
  },
  20201204 = {
    id: "20201204",
    data: day3,
  },
]; */

const LiveScreen = (props, { navigation }) => {
  const FlatListItem = ({ title }) => (
    <View style={styles.item}>
      <Text style={styles.title}>{title.day}</Text>
    </View>
  );

  // FLATLIST

  const renderFlatList = ({ item }) => <FlatListItem title={item} />;

  

  // VIEWABILITY
  const viewabilityConfig = {
    waitForInteraction: true,
    // At least one of the viewAreaCoveragePercentThreshold or itemVisiblePercentThreshold is required.
    viewAreaCoveragePercentThreshold: 95,
    itemVisiblePercentThreshold: 75,
  };

  return (
    <View style={{ flex: 1, width: "100%", backgroundColor: "#F4F5F5" }}>
      <View style={{ flex: 1 }}>

        <SafeAreaView>
          <FlatList
            horizontal
            pagingEnabled
            data={DATA}
            renderItem={renderFlatList}
            keyExtractor={(item) => item.id}
            initialScrollIndex={5}
            viewabilityConfig={viewabilityConfig}
            onViewableItemsChanged={(viewableItems, changed) => {
              console.log("Visible items are", viewableItems);
              console.log("Changed in this iteration", changed);
            }}
          />
        </SafeAreaView>
      </View>
    </View>
  );
};

const styles = StyleSheet.create({});

export default LiveScreen;

我已经删除了多余的代码。
先谢了

yyyllmsg

yyyllmsg1#

viewabilityConfig需要在构造函数中完成以避免此错误。

constructor (props) {
  super(props)

  this.viewabilityConfig = {
      waitForInteraction: true,
      // At least one of the viewAreaCoveragePercentThreshold or itemVisiblePercentThreshold is required.
      viewAreaCoveragePercentThreshold: 95,
      itemVisiblePercentThreshold: 75,
  }
}
<FlatList
    viewabilityConfig={this.viewabilityConfig}
  ...
/>

对于功能组件,需要使用Ref钩子。

const viewabilityConfig = useRef({
  waitForInteraction: true,
      // At least one of the viewAreaCoveragePercentThreshold or itemVisiblePercentThreshold is required.
      viewAreaCoveragePercentThreshold: 95,
      itemVisiblePercentThreshold: 75,
})
svmlkihl

svmlkihl2#

迟到了,但问题不在于viewabilityConfig,而在于onViewableItemsChanged
在函数组件中,需要分离出onViewableItemsChanged的处理程序,并将其放在ref中,如下所示:

const handleViewableItemsChanged = useRef(({viewableItems, changed})=>{
    console.log("Visible items are", viewableItems);
    console.log("Changed in this iteration", changed)
});

<FlatList
    ...
    viewabilityConfig={viewabilityConfig}
    onViewableItemsChanged={handleViewableItemsChanged.current}
/>

使用一个带有空依赖项数组的useCallback钩子也可以达到同样的效果,但是这种方式更简洁一些。

相关问题