【问题标题】:How do I create a dynamic drop down list with react-bootstrap如何使用 react-bootstrap 创建动态下拉列表
【发布时间】:2016-03-24 16:49:37
【问题描述】:

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

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

【问题讨论】:

    标签: javascript reactjs react-bootstrap


    【解决方案1】:

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

     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
    }
    

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

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

    【讨论】:

    • 很好的解释@Theo,我有一个功能请求,在选择任何选项(仅限单个值)时,它应该在上面的输入框中附加相应选项的值,如果我开始类型,选项应该打开。提前谢谢?
    【解决方案2】:

    我的工作示例

    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>
    

    【讨论】:

    • 我认为省略key(我认为是数组索引)会更正确,而是设置&lt;option key={e.value}&gt;。键应该是组件的 id 引用,如果说列表重新排序,则依赖数组索引可能会导致不一致。
    • @Nathan - 正确。本文更详细...medium.com/@robinpokorny/…
    【解决方案3】:

    使用箭头函数绑定动态drop。

    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>

    【讨论】:

      【解决方案4】:
      // 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>
      

      【讨论】:

        【解决方案5】:

        1 班轮将是:

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

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            基本上你需要做的就是映射数组。这将返回一个 &lt;option&gt; 元素列表,您可以将其放置在表单中进行渲染。

            array.map((element, index) => <option key={index}>{element}</option>)
            

            完整的功能组件,从保存在组件状态的数组中呈现&lt;option&gt;s。 Multiple 属性让您按住 CTRL 键单击要选择的许多元素。删除它,如果你想要下拉菜单。

            import React, { useState } from "react";
            
            const ExampleComponent = () => {
                const [options, setOptions] = useState(["option 1", "option 2", "option 3"]);
            
                return (
                    <form>
                        <select multiple>
                        { options.map((element, index) => <option key={index}>{element}</option>) }
                        </select>
                        <button>Add</button>
                    </form>
                );
            }
            

            component with multiple select

            工作示例:https://codesandbox.io/s/blue-moon-rt6k6?file=/src/App.js

            【讨论】:

              【解决方案8】:

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

              示例代码

              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>
              );
              

              【讨论】:

                【解决方案9】:

                我可以使用Typeahead 做到这一点。对于一个简单的场景来说,它看起来有点冗长,但我发布它是因为它会对某人有所帮助。

                首先我创建了一个组件,以便它可以重用。

                interface DynamicSelectProps {
                    readonly id: string
                    readonly options: any[]
                    readonly defaultValue: string | null
                    readonly disabled: boolean
                    onSelectItem(item: any): any
                    children?:React.ReactNode
                }
                
                export default function DynamicSelect({id, options, defaultValue, onSelectItem, disabled}: DynamicSelectProps) {
                
                    const [selection, setSelection] = useState<any[]>([]);
                
                    return <>
                        <Typeahead
                            labelKey={option => `${option.key}`}
                            id={id}
                            onChange={selected => {
                                setSelection(selected)
                                onSelectItem(selected)
                            }}
                            options={options}
                            defaultInputValue={defaultValue || ""}
                            placeholder="Search"
                            selected={selection}
                            disabled={disabled}
                        />
                    </>
                }
                

                回调函数

                function onSelection(selection: any) {
                    console.log(selection)
                    //handle selection
                }
                

                用法

                <div className="form-group">
                    <DynamicSelect
                        options={array.map(item => <option key={item} value={item}>{item}</option>)}
                        id="search-typeahead"
                        defaultValue={<default-value>}
                        disabled={false}
                        onSelectItem={onSelection}>
                    </DynamicSelect>
                </div>
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2014-09-19
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-11-07
                  • 1970-01-01
                  • 2021-05-18
                  • 1970-01-01
                  相关资源
                  最近更新 更多