Динамически создавать параметры раскрывающегося меню из массива с помощью response-bootstrap

Я сейчас создаю сайт электронной коммерции на основе 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;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
6 350
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Отличительной особенностью 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 кажется более подходящим элементом для этого, но это был не ваш вопрос.

Ах да, это просто, спасибо! Хотя вы можете мне рассказать, как будет использоваться select? Если это более подходит, я бы предпочел это. Я стараюсь придерживаться лучших практик, когда могу ...

Morgan Caldbeck 29.11.2018 02:42

Что ж, вы хотите, чтобы пользователь мог выбирать размер, не так ли?

Solo 29.11.2018 02:43

Я не знаком с этой библиотекой, но это кажется подходящим местом для изучения. Вы бы использовали map с выбранным входом таким же образом.

Solo 29.11.2018 02:46

Правильный. Я подумал, что вы можете сделать это с помощью функции onClick, хотя и для установки размера.

Morgan Caldbeck 29.11.2018 02:47

Я вижу, к чему вы клоните, но это библиотека, которую я ищу response-bootstrap.github.io/components/forms

Morgan Caldbeck 29.11.2018 02:51

Ах, вы использовали reactstrap в своем ответе. Но оба кажутся очень похожими.

Solo 29.11.2018 02:52

Вы можете сделать это с onClick, это вопрос предпочтения, если он работает аналогичным образом, но select является обычным.

Solo 29.11.2018 02:54

Другие вопросы по теме