Как мне стилизовать или управлять элементами, которые сохраняются из списка / ключа массива в ReactJS?

#reactjs

#reactjs

Вопрос:

A. Я хочу создать сетку 2×3. Сетка будет состоять из одного компонента, содержащего различную информацию. У каждого компонента есть изображение, изображение alt, заголовок и описание. Опять же, каждый компонент находится внутри сетки 2×3.

Мне удалось добиться отображения каждого компонента друг над другом. Но я хочу, чтобы они были сопряжены. Я попытался использовать функцию .map() для итерации по списку и успешно получил дамп элементов. Я не знаю, как управлять компонентами по отдельности, поскольку то, что я делал, — это дамп списка элементов. Я не знаю, как использовать CSS с этим, поскольку я не могу контролировать

 <component />
  

Теперь это все <div>{webItems}</div> дамп.

 // From App.js

    function App() {
      const webItems = webImages.map(item => <WebItem key={item.id} item={item} />);
      return <div>{webItems}</div>;
    }

    // From WebItem.js

    function WebItem(props) {
      return (

            <div className="webItem" key={props.item.id}>
              <img src={props.item.imageURL} alt={props.item.imageAlt} />
              <h3>{props.item.imageTitle}</h3>
              <p>{props.item.imageBlurb}</p>
            </div>

      );
    }

//There is an external file using a webImages variable as an array holding objects of individual, key, imageURL, imageAlt, imageTitle and imageBlurb info.
  

Я не уверен, есть ли CSS или метод react JS для решения этой проблемы. Я просто хочу, чтобы каждое изображение и его собственное описание были в сетке 2×3. Я также хотел бы иметь возможность стилизовать каждый из них, если это возможно.

Ответ №1:

Проблема, с которой вы сталкиваетесь, заключается в том, что вы накладываете 6 секунд друг на друга. div Но вам нужна структура, подобная сетке. Один из способов сделать это — окружить каждую пару в a div и использовать display: flex .

Я написал код для группировки массива в массив из 2, чтобы упростить рендеринг.

 const webImages = [1, 2, 3, 4, 5, 6];
function App() {
  // [[1, 2], [3, 4], [5, 6]]
  const groupedItems = webImages.reduce((groups, item, idx, arr) => {
    if (idx % 2 === 0) {
      groups.push(arr.slice(idx, idx   2));
    }
    return groups;
  }, []);
  const webItems = groupedItems.map(([item1, item2]) => (
    <div className="row">
      <WebItem key={item1} item={item1} />
      <WebItem key={item2} item={item2} />
    </div>
  ));
  return <div>{webItems}</div>;
}

function WebItem(props) {
  return <div className="webItem">{props.item}</div>;
}

ReactDOM.render(<App />, document.getElementById("root"));  
 .row {
  display: flex;
}

.webItem {
  height: 5rem;
  width: 5rem;
  border: 1px solid;
  background: lightblue;
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>  

Комментарии:

1. Как мне проверить «четность» с помощью вашего кода, если я использовал {id: 1}, {id: 2}, {id:3}, {id: 4}, {id: 5}, {id: 6}? В конечном итоге они становятся ключами, как вы, возможно, уже знаете. Есть ли способ подключиться к идентификатору # для проверки четности?

2. Вы могли бы использовать item.id вместо idx . Но его лучше использовать idx , поскольку он фактически гарантирует, что он будет в порядке, например, 0,1,2…