Отличная статья по теме useEffect. Если коротко, то вы на каждый рендер создаете
новую функцию save и
новую переменную html, при этом в момент выполнения функции open вы скорей всего захватите по замыканю переменную html из области видимости которая уже устареет на момент выполнения вновь созданной функции save по клику на кнопке. Для сохранения любого значения между рендерами без тригера ререндера компонента можно использовать useRef.