Я сейчас создаю сайт электронной коммерции на основе drupal и застрял. Все еще новичок в реагировании и программировании в целом, но пытаюсь научиться. Итак, я получил все свои данные, используя redux и rest api, и я получаю свои продукты, варианты и атрибуты. На странице продукта настраивается конкретный продукт на основе URL-адреса, и теперь мне нужно иметь возможность выбирать различные атрибуты в раскрывающемся меню. В настоящее время у меня есть раскрывающийся список заполнителей, который соответствует показанному в документации по реакции-загрузке. Однако мне нужно разместить параметры в этом раскрывающемся списке на основе моего массива, содержащего атрибуты.
Я уверен, что это просто, но я искал вокруг и пока не нашел ответа, который работает. Надеюсь, вы, ребята, сможете помочь.
Просматривая код, имейте в виду, что sizes = [] - это массив, из которого я хочу разместить данные в качестве выбираемых опций в раскрывающемся списке.
Вот страница продукта:
import React, { Component} from 'react';
import '../../css/Home.css';
import MenuBar from "../sub-components/MenuBar";
import LeftMenuBar from "../sub-components/LeftMenuBar";
import "../../css/ProductPage.css"
import WomensWear from "../../media/WomensWear.jpg"
import {
Dropdown,
DropdownToggle,
DropdownMenu,
DropdownItem } from 'reactstrap';
class ProductPage extends Component {
constructor(props) {
super(props);
this.toggle = this.toggle.bind(this);
this.state = {
dropdownOpen: false
};
}
toggle() {
this.setState(prevState => ({
dropdownOpen: !prevState.dropdownOpen
}));
}
getProduct() {
let product = null;
let sizes = [];
if (this.props.products && this.props.products.items.length) {
product = this.props.products.items.find(o => o.path[0].alias === this.props.router.match.url);
if (product && this.props.variations && this.props.attributes) {
product.something = [];
for (let i = 0; i < product.variations.length; i++) {
let varid = product.variations[i].target_id;
let variation = this.props.variations.items.find(o => o.variation_id[0].value === varid);
variation.size = this.props.attributes.items.find(o => o.attribute_value_id[0].value === variation.attribute_size[0].target_id);
sizes.push({value: variation.size.attribute_value_id[0].value, name: variation.size.name[0].value});
product.something.push(variation);
console.info(sizes);
}
}
}
return product;
}
render() {
let style = {
height: this.props.height - 56,
};
let product = this.getProduct();
let body = product && product.body.length ? product.body[0].value : null;
return (
<div className = "App" id = "default">
<div className='MenuBar'>
<MenuBar/>
</div>
<div>
<div style = {style} className = "ProductPage row no-gutters">
<div className = "col-xs-3 col-md-3">
<LeftMenuBar/>
</div>
<div className = "outer col-xs-4 col-md-4">
<div>
<div id = "ProductPlacement">
<img src = {WomensWear} alt = ""/>
<div id = "alternate-pics">
<div id = "alt-pic">
</div>
<div id = "alt-pic">
</div>
<div id = "alt-pic">
</div>
</div>
</div>
</div>
</div>
<div className = "col-xs-5 col-md-5">
<div id = "ImagePlacement">
<div className = "ProductTitle">
<h1>First Product</h1>
</div>
<hr/>
<div className = "ProductDescription">
<div dangerouslySetInnerHTML = {{__html: body}} />
</div>
<div id = "options">
<div id = "color">
</div>
<div id = "color2">
</div>
<div id = "color3">
</div>
</div>
<div id = "options">
<div>
<Dropdown isOpen = {this.state.dropdownOpen} toggle = {this.toggle}>
<DropdownToggle caret id = "size-dropdown">
Size
</DropdownToggle>
<DropdownMenu>
<DropdownItem>1</DropdownItem>
<DropdownItem>3</DropdownItem>
<DropdownItem>5</DropdownItem>
</DropdownMenu>
</Dropdown>
<div className = "AddToCart">
<button className = "AddToCart">Add To Cart</button>
<button className = "Price">$34.99</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
);
}
}
export default ProductPage;



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Отличительной особенностью React является то, что вы можете использовать обычный JS.
<Dropdown isOpen = {this.state.dropdownOpen} toggle = {this.toggle}>
<DropdownToggle caret id = "size-dropdown">
Size
</DropdownToggle>
<DropdownMenu>
{sizes.map(size => (
<DropdownItem>{size}</DropdownItem>
))}
</DropdownMenu>
</Dropdown>
Примечание: select кажется более подходящим элементом для этого, но это был не ваш вопрос.
Что ж, вы хотите, чтобы пользователь мог выбирать размер, не так ли?
Я не знаком с этой библиотекой, но это кажется подходящим местом для изучения. Вы бы использовали map с выбранным входом таким же образом.
Правильный. Я подумал, что вы можете сделать это с помощью функции onClick, хотя и для установки размера.
Я вижу, к чему вы клоните, но это библиотека, которую я ищу response-bootstrap.github.io/components/forms
Ах, вы использовали reactstrap в своем ответе. Но оба кажутся очень похожими.
Вы можете сделать это с onClick, это вопрос предпочтения, если он работает аналогичным образом, но select является обычным.
Ах да, это просто, спасибо! Хотя вы можете мне рассказать, как будет использоваться select? Если это более подходит, я бы предпочел это. Я стараюсь придерживаться лучших практик, когда могу ...