【问题标题】:Dynamically create dropdown menu options from array with react-bootstrap使用 react-bootstrap 从数组动态创建下拉菜单选项
【发布时间】:2018-11-29 09:35:08
【问题描述】:

我现在正在构建一个基于 drupal 的电子商务网站,但遇到了困难。一般来说,反应和编码仍然是新手,但正在努力学习。所以我已经使用 redux 和 rest api 获取了所有数据,并且我正在获取我的产品、变体和属性。产品页面正在根据 url 设置特定产品,现在我需要能够通过下拉菜单选择不同的属性。目前我有一个与 react-bootstrap 文档中显示的匹配的占位符下拉列表。但是,我需要根据包含属性的数组在该下拉列表中放置选项。

我确信这很简单,但我一直在四处寻找,但还没有找到有效的答案。希望大家帮忙。

在查看代码时,请记住,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.log(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 reactjs bootstrap-4 react-bootstrap


    【解决方案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 吗?如果那更合适,我宁愿使用它。我尽量坚持最佳实践……
    • 好吧,您希望用户能够选择尺寸,不是吗?
    • 我不熟悉这个库,但this 似乎是正确的地方。您将使用 map 与选择输入相同的方式。
    • 正确。我想你可以通过使用 onClick 函数来设置大小。
    • 我知道你要去哪里,但这是我正在查看的库react-bootstrap.github.io/components/forms
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2014-09-26
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2022-01-27
    • 2014-07-17
    相关资源
    最近更新 更多