Warm tip: This article is reproduced from serverfault.com, please click

Rendering specific component in React Native

发布于 2020-11-27 12:41:44

I used the ScrollView's onMomentumScrollEnd handler to determine the current page based on the contentOffset in the recyclerlistview Component.

 const [currentPage, setCurrentPage] = useState(0);

 const onScrollEnd = (e) => {
    let contentOffset = e.nativeEvent.contentOffset;
    let viewSize = e.nativeEvent.layoutMeasurement;
    let pageNum = Math.floor(contentOffset.x / viewSize.width);
    setCurrentPage(pageNum);
  };

return (
   <View style={{ flex: 1 }}>
        <RecyclerListView
          rowRenderer={({ item }, index) => <Page item={item} id={index} />}
          dataProvider={list}
          layoutProvider={layoutProvider}
          onMomentumScrollEnd={onScrollEnd}
          isHorizontal
          pagingEnabled
        />
        <View style={{ flex: 0.1, backgroundColor:"gold" }}>
          <Text>{`current page: ${currentPage}`}</Text>
       </View>
      </View>
  );

I want to display the current Page inside a Text component, but when currentPage state changes in onMomentumScrollEnd handler the whole app is re-render. I need to re-render only the Text Component, any suggestion for that.

Questioner
Aymen Guidad
Viewed
0
Aymen Guidad 2020-11-28 17:47:00

I find a solution. the easiest way is to create a class component and put the displayed component in it, then I reference it and change the current page with ref hook.

 class DisplayCurrentPage extends React.Component {
   contractor(prop){
    super(prop)
    state:{currentPage:0}
   }
   updateCurrentPage = (index) => {this.setState({CurrentPage: index})}
   render(){
    return(
      <View style={{ flex: 0.1, backgroundColor:"gold" }}>
          <Text>{`current page: ${this.state.currentPage}`}</Text>
       </View>
     );

   }

 };
  

 const reference = createRef();
 const onScrollEnd = (e) => {
    let contentOffset = e.nativeEvent.contentOffset;
    let viewSize = e.nativeEvent.layoutMeasurement;
    let pageNum = Math.floor(contentOffset.x / viewSize.width);
    reference.current.updateCurrentPage(pageNum);
  };

return (
   <View style={{ flex: 1 }}>
        <RecyclerListView
          rowRenderer={({ item }, index) => <Page item={item} id={index} />}
          dataProvider={list}
          layoutProvider={layoutProvider}
          onMomentumScrollEnd={onScrollEnd}
          isHorizontal
          pagingEnabled
        />
        <DisplayCurrentPage ref={reference} />
      </View>
  );

When the page is changed, only DisplayCurrentPage is re-render.