For AI agents: the complete documentation index is available at https://react-native-gesture-image-viewer.pages.dev/1.x/llms.txt, the full documentation bundle is available at https://react-native-gesture-image-viewer.pages.dev/1.x/llms-full.txt, and this page is available as Markdown at https://react-native-gesture-image-viewer.pages.dev/1.x/guide/performance-optimization-tips.md.
v3 is stable. See what changed
  • English
  • 1.x
  • Performance Optimization Tips

    Wrap the renderItem function with useCallback to prevent unnecessary re-renders.

    import { useCallback, useState } from 'react'; 
    import { ScrollView, Image, Modal } from 'react-native';
    import { GestureViewer } from 'react-native-gesture-image-viewer';
    
    function App() {
      const images = [...];
      const [visible, setVisible] = useState(false);
    
      const renderImage = useCallback((imageUrl: string) => {
        return <Image source={{ uri: imageUrl }} style={{ width: '100%', height: '100%' }} resizeMode="contain" />;
      }, []);
    
      return (
        <Modal visible={visible} onRequestClose={() => setVisible(false)}>
          <GestureViewer
            data={images}
            renderItem={renderImage}
            ListComponent={ScrollView}
            onDismiss={() => setVisible(false)}
          />
        </Modal>
      );
    }

    For large images, we recommend using expo-image or FastImage.

    import { ScrollView, Modal } from 'react-native';
    import { GestureViewer } from 'react-native-gesture-image-viewer';
    import { Image } from 'expo-image'; 
    
    function App() {
      const images = [...];
      const [visible, setVisible] = useState(false);
    
      const renderImage = useCallback((imageUrl: string) => {
        return <Image source={{ uri: imageUrl }} style={{ width: '100%', height: '100%' }} contentFit="contain" />; 
      }, []);
    
      return (
        <Modal visible={visible} onRequestClose={() => setVisible(false)}>
          <GestureViewer
            data={images}
            renderItem={renderImage}
            ListComponent={ScrollView}
            onDismiss={() => setVisible(false)}
          />
        </Modal>
      );
    }

    For handling many images, we recommend using FlashList.

    import { useCallback, useState } from 'react';
    import { Image, Modal } from 'react-native';
    import { GestureViewer } from 'react-native-gesture-image-viewer';
    import { FlashList } from '@shopify/flash-list'; 
    
    function App() {
      const images = [...];
      const [visible, setVisible] = useState(false);
    
      const renderImage = useCallback((imageUrl: string) => {
        return <Image source={{ uri: imageUrl }} style={{ width: '100%', height: '100%' }} resizeMode="contain" />;
      }, []);
    
      return (
        <Modal visible={visible} onRequestClose={() => setVisible(false)}>
          <GestureViewer
            data={images}
            renderItem={renderImage}
            ListComponent={FlashList} 
            onDismiss={() => setVisible(false)}
          />
        </Modal>
      );
    }

    Test on actual devices (performance may be limited in simulators).