Я хочу иметь возможность добавить пропозицию onLoad / onAbort к любому элементу изображения или видео внутри элемента JSX, переданного моей функции.
Я создаю компонент галереи, который принимает элементы JSX и отображает ихв выбранном образце. Идея состоит в том, что любой элемент JSX может быть передан, и он будет отформатирован и отображен. Для того, чтобы это работало должным образом, особенно алгоритмы сортировки, которые выполняют несколько проходов, мне нужно знать, когда изображения и видео были загружены и приняты в их исходных разрешениях, чтобы я мог масштабировать их и сохранять соотношения. Для этого я хочу прикрепить свойство onload и onabort к каждому изображению, содержащемуся в элементе JSX, передаваемом в мою функцию, которая обновляет состояние моего компонента, сообщая компоненту, что изображение загружено.
Я не уверен, как это сделать, потому что нет ограничений на структуру входящего элемента JSX. Он может иметь любой уровень вложенности, и изображение или видео могут находиться где угодно внутри этой структуры. Если бы я делал это пост-рендер, я бы сделал:
//gridRef.current is the grid element ref I get through useRef()
const images = gridRef.current.querySelectorAll('img');
images.forEach((image, index) => {
if (image.complete) //mark current image as already loaded
else {
image.onload = () => {
//mark current image as loaded after it loads
};
image.onabort = () => {
//mark current image as loaded after it aborts
};
image.onerror = () => {
//mark current image as loaded after it errors out
};
//mark current image as not loaded yet
}
});
И то же самое для видео. Однако я не хочу делать это после рендеринга, потому что изображение может загружаться после проверки image.complete и перед подключением слушателя, что может вызвать ошибку. Было бы гораздо более естественно сделать это еще до рендеринга элемента, но как?
Я бы хотел одно из следующего:
1) Нечто похожее на свойство image.complete, котороесообщает, загружены ли все потомки элементов, поэтому, если бы я использовал его в своем элементе сетки, он вернул бы true только после загрузки всех изображений во всех узлах-потомках. Тогда я мог бы выполнить эту проверку после рендеринга, и мне не нужно было бы редактировать JSX.
2) Способ поиска по иерархии элементов JSX и извлечения, а затем редактирования всех элементов img и video.
3) Свойство, которое запускает функцию, когда загружены все компоненты-потомки.
4) Все остальное, что достигает тех же целей.