Пойдем по-порядку:
1. Никогда не используйте ключевое слово
var. Есть вполне себе
let и
const
2. Переменные iframe и virtualDom объявлены так, что их значение будет сбрасываться в undefined при каждом ререндере компонента. Отсюда, собственно и ошибка.
Чтобы это поправить можно объявить эти переменные с использованием useRef
const virtualDom = useRef();
Далее в асинхронном коде произвести установку в ref
virtualDom.current = dom;
Ну и наконец, обернуть функцию save в useCallback:
const save = useCallback(() => {
const newDom = virtualDom.current?.cloneNoder(virtualDom); //Копируем данные, лежащие в виртуальном dom
...
}, [virtualDom]);
Кстати, обернуть в useCallback необходимо все функции, использующие переменную virtualDom и всё тоже свмое необходимо проделать относительно переменной iframe.
P.S. Обязательно почитайте про хуки и жизненный цикл компонентов React.