Javascript 如何使用 react-bootstrap 创建动态下拉列表

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/36205673/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 18:45:25  来源:igfitidea点击:

How do I create a dynamic drop down list with react-bootstrap

javascriptreactjsreact-bootstrap

提问by JohnL

The example codein the react-bootstrap site shows the following. I need to drive the options using an array, but I'm having trouble finding examples that will compile.

react-bootstrap 站点中的示例代码显示如下。我需要使用数组来驱动选项,但我无法找到可以编译的示例。

<Input type="select" label="Multiple Select" multiple>
  <option value="select">select (multiple)</option>
  <option value="other">...</option>
</Input>

回答by Theo

You can start with these two functions. The first will create your select options dynamically based on the props passed to the page. If they are mapped to the state then the select will recreate itself.

您可以从这两个功能开始。第一个将根据传递给页面的道具动态创建您的选择选项。如果它们被映射到状态,那么选择将重新创建自己。

 createSelectItems() {
     let items = [];         
     for (let i = 0; i <= this.props.maxValue; i++) {             
          items.push(<option key={i} value={i}>{i}</option>);   
          //here I will be creating my options dynamically based on
          //what props are currently passed to the parent component
     }
     return items;
 }  

onDropdownSelected(e) {
    console.log("THE VAL", e.target.value);
    //here you will see the current selected value of the select input
}

Then you will have this block of code inside render. You will pass a function reference to the onChange prop and everytime onChange is called the selected object will bind with that function automatically. And instead of manually writing your options you will just call the createSelectItems() function which will build and return your options based on some constraints (which can change).

然后你将在渲染中拥有这段代码。您将传递一个对 onChange 道具的函数引用,每次调用 onChange 时,所选对象将自动与该函数绑定。而不是手动编写您的选项,您只需调用 createSelectItems() 函数,该函数将根据某些约束(可以更改)构建并返回您的选项。

  <Input type="select" onChange={this.onDropdownSelected} label="Multiple Select" multiple>
       {this.createSelectItems()}
  </Input>

回答by dev-siberia

My working example

我的工作示例

this.countryData = [
    { value: 'USA', name: 'USA' },
    { value: 'CANADA', name: 'CANADA' }            
];

<select name="country" value={this.state.data.country}>
    {this.countryData.map((e, key) => {
        return <option key={key} value={e.value}>{e.name}</option>;
    })}
</select>

回答by Awais Asghar

bind dynamic drop using arrow function.

使用箭头函数绑定动态放置。

class BindDropDown extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      values: [
        { name: 'One', id: 1 },
        { name: 'Two', id: 2 },
        { name: 'Three', id: 3 },
        { name: 'four', id: 4 }
      ]
    };
  }
  render() {
    let optionTemplate = this.state.values.map(v => (
      <option value={v.id}>{v.name}</option>
    ));

    return (
      <label>
        Pick your favorite Number:
        <select value={this.state.value} onChange={this.handleChange}>
          {optionTemplate}
        </select>
      </label>
    );
  }
}

ReactDOM.render(
  <BindDropDown />,
  document.getElementById('root')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root">
    <!-- This element's contents will be replaced with your component. -->
</div>

回答by Jjang

A 1 liner would be:

1 班轮将是:

import * as YourTypes from 'Constants/YourTypes';
....
<Input ...>
    {Object.keys(YourTypes).map((t,i) => <option key={i} value={t}>{t}</option>)}
</Input>

Assuming you store the list constants in a separate file (and you should, unless they're downloaded from a web service):

假设您将列表常量存储在一个单独的文件中(您应该这样做,除非它们是从 Web 服务下载的):

# YourTypes.js
export const MY_TYPE_1="My Type 1"
....

回答by Jathin jain

You need to add key for mapping otherwise it throws warning because each props should have a unique key.Code revised below: let optionTemplate = this.state.values.map((v, index) => ({v.name}));

你需要为映射添加键,否则它会抛出警告,因为每个道具都应该有一个唯一的键。代码修改如下: let optionTemplate = this.state.values.map((v, index) => ({v.name})) ;

回答by Rizo

You can create dynamic select options by map()

您可以通过 map() 创建动态选择选项

Example code

示例代码

return (
    <select className="form-control"
            value={this.state.value}
            onChange={event => this.setState({selectedMsgTemplate: event.target.value})}>
        {
            templates.map(msgTemplate => {
                return (
                    <option key={msgTemplate.id} value={msgTemplate.text}>
                        Select one...
                    </option>
                )
            })
        }
    </select>
)
  </label>
);

回答by Vigneshwaran Chandrasekaran

// on component load, load this list of values
// or we can get this details from api call also    
const animalsList = [
{
    id: 1,
    value: 'Tiger'
}, {
    id: 2,
    value: 'Lion'
}, {
    id: 3,
    value: 'Dog'
}, {
    id: 4,
    value: 'Cat'
}
];

// generage select dropdown option list dynamically
function Options({ options }) {
    return (
        options.map(option => 
                    <option key={option.id} value={option.value}>                                   
                    {option.value}
                    </option>)
                   );
}

<select
name="animal"
className="form-control">
<Options options={animalsList} />
</select>