Using Annotorious in React
At the moment, Annotorious doesn’t have native React integration (yet). If you want to use Annotorious in your own React project, there are a few things to consider:
- Annotorious modifies the DOM directly: you need to use refs to access image DOM elements.
- Annotorious has an imperative API: wrapping it for React requires a few workarounds, including initialization
in a useEffecthook, and storing theannoobject in the component state.
Below is a minimal React component to get you started:
import { useEffect, useRef, useState } from 'react';
import { Annotorious } from '@recogito/annotorious';
import '@recogito/annotorious/dist/annotorious.min.css';
function App() {
  // Ref to the image DOM element
  const imgEl = useRef();
  // The current Annotorious instance
  const [ anno, setAnno ] = useState();
  // Current drawing tool name
  const [ tool, setTool ] = useState('rect');
  // Init Annotorious when the component
  // mounts, and keep the current 'anno'
  // instance in the application state
  useEffect(() => {
    let annotorious = null;
    if (imgEl.current) {
      // Init
      annotorious = new Annotorious({
        image: imgEl.current
      });
      // Attach event handlers here
      annotorious.on('createAnnotation', annotation => {
        console.log('created', annotation);
      });
      annotorious.on('updateAnnotation', (annotation, previous) => {
        console.log('updated', annotation, previous);
      });
      annotorious.on('deleteAnnotation', annotation => {
        console.log('deleted', annotation);
      });
    }
    // Keep current Annotorious instance in state
    setAnno(annotorious);
    // Cleanup: destroy current instance
    return () => annotorious.destroy();
  }, []);
  // Toggles current tool + button label
  const toggleTool = () => {
    if (tool === 'rect') {
      setTool('polygon');
      anno.setDrawingTool('polygon');
    } else {
      setTool('rect');
      anno.setDrawingTool('rect');
    }
  }
  return (
    <div>
      <div>
        <button
          onClick={toggleTool}>
            { tool === 'rect' ? 'RECTANGLE' : 'POLYGON' }
        </button>
      </div>
      <img 
        ref={imgEl} 
        src="640px-Hallstatt.jpg" 
        alt="Hallstatt Town Square" />
    </div>
  );
}
export default App;