#arrays #reactjs #loops
#массивы #reactjs #циклы
Вопрос:
Я все еще очень новичок в этом и, вероятно, полностью переосмысливаю / усложняю вещи.
У меня есть массив изображений, которые отображаются как ожидалось. В рамках процесса сопоставления я создаю новую ссылку для каждого изображения, чтобы я мог использовать атрибут ‘current’ для получения высоты и ширины, на основе которых у меня есть троичный оператор для применения некоторого стиля. Я сомневаюсь, что это единственный или лучший способ добиться этого, и я открыт для предложений…
Теперь к проблеме. Если у меня есть одно изображение и одна ссылка, описанный выше процесс отлично работает, однако, как только я добавляю больше изображений и пытаюсь получить «текущий», он терпит неудачу. Но я могу записать в консоль свой массив ссылок, и я получаю все обратно, включая размеры изображения.
Проблема стоит передо мной, но я просто не могу понять, в чем проблема. Возможно, я просто неправильно понял, как работают ссылки и current.
Любая помощь была бы весьма признательна.
Мой код выглядит следующим образом:
import React, { useState, useRef, useEffect, createRef } from "react";
import Images from "../images";
const IllustrationList = () => {
const [images, setImages] = useState([]);
useEffect(() => {
// populate with Images from Images Array
setImages(Images);
}, []);
// ref array
const imageRefs = [];
const [dimensions, setDimensions] = useState({ width: 0, height: 0 });
useEffect(() => {
if (imageRefs.current) {
setDimensions({
width: imageRefs.current.naturalWidth,
height: imageRefs.current.naturalHeight,
});
}
});
return (
<div className="illustration-gallery">
<ul className="cropped-images pl-0">
{images.map((image, i) => {
const newRef = createRef();
imageRefs.push(newRef);
return (
<li className="li-illustration" key={i}>
<a href={image.image} data-lightbox="mygallery">
<img
src={image.image}
alt="illustrations"
ref={newRef}
className={
dimensions.width > dimensions.height ? "imageSize" : ""
}
/>
</a>
</li>
);
})}
</ul>
</div>
);
};
export default IllustrationList;
Комментарии:
1.
imageRefs
это просто массив (ссылок), поэтому он сам по себе не будет иметьcurrent
свойства. ПосколькуimageRefs
определено в теле функции, оно также переопределяется при каждом цикле рендеринга. К каким размерам изображения вы хотите получить доступ / сохранить в локальном состоянии? Или вы хотитеdimensions
быть массивом измерений? Кроме того, функция рендеринга должна быть чистой, т. Е. Вы не должны создавать ссылки там при отображении элементов изображения.2. Привет, Дрю, спасибо за ваш комментарий. Мне нужны размеры для всех изображений, а затем применить стиль на основе этого. Возможно, есть другой способ?
Ответ №1:
Я смог решить свою проблему.
Я думаю, что я полностью переосмыслил проблему и придумал гораздо более простое решение. Я не знаю, лучший ли это способ добиться этого, но он делает то, что я хочу / в чем я нуждаюсь.
useEffect(() => {
let landScape = document.querySelectorAll("img");
landScape.forEach(() => {
for (var i = 0; i < Images.length; i ) {
if (landScape[i].naturalWidth > landScape[i].naturalHeight) {
landScape[i].className = "landscape";
}
}
});