如何使用 react-bootstrap 创建动态下拉列表
How do I create a dynamic drop down list with react-bootstrap
react-bootstrap 站点中的示例 code 显示以下内容。我需要使用数组来驱动选项,但我找不到可以编译的示例。
<Input type="select" label="Multiple Select" multiple>
<option value="select">select (multiple)</option>
<option value="other">...</option>
</Input>
您可以从这两个功能入手。第一个将根据传递给页面的道具动态创建 select 选项。如果它们被映射到状态,那么 select 将重新创建自己。
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 时,selected 对象将自动与该函数绑定。而不是手动编写您的选项,您只需调用 createSelectItems() 函数,该函数将根据某些约束(可以更改)构建和return您的选项。
<Input type="select" onChange={this.onDropdownSelected} label="Multiple Select" multiple>
{this.createSelectItems()}
</Input>
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"
....
使用箭头函数绑定动态放置。
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>
我的工作示例
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.Code 修改如下:
让 optionTemplate = this.state.values.map((v, index) => ({v.name}));
您可以通过 map()
创建动态 select 选项
示例代码
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>
);
// 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>
我能够使用 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>
基本上您需要做的就是映射数组。这将 return 一个包含 <option>
个元素的列表,您可以将这些元素放在表单中进行呈现。
array.map((element, index) => <option key={index}>{element}</option>)
完整功能组件,从组件状态中保存的数组中呈现 <option>
s。 Multiple
属性 让我们按住 CTRL 并单击许多元素以 select。如果需要下拉菜单,请将其删除。
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
react-bootstrap 站点中的示例 code 显示以下内容。我需要使用数组来驱动选项,但我找不到可以编译的示例。
<Input type="select" label="Multiple Select" multiple>
<option value="select">select (multiple)</option>
<option value="other">...</option>
</Input>
您可以从这两个功能入手。第一个将根据传递给页面的道具动态创建 select 选项。如果它们被映射到状态,那么 select 将重新创建自己。
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 时,selected 对象将自动与该函数绑定。而不是手动编写您的选项,您只需调用 createSelectItems() 函数,该函数将根据某些约束(可以更改)构建和return您的选项。
<Input type="select" onChange={this.onDropdownSelected} label="Multiple Select" multiple>
{this.createSelectItems()}
</Input>
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"
....
使用箭头函数绑定动态放置。
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>
我的工作示例
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.Code 修改如下: 让 optionTemplate = this.state.values.map((v, index) => ({v.name}));
您可以通过 map()
创建动态 select 选项示例代码
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>
);
// 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>
我能够使用 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>
基本上您需要做的就是映射数组。这将 return 一个包含 <option>
个元素的列表,您可以将这些元素放在表单中进行呈现。
array.map((element, index) => <option key={index}>{element}</option>)
完整功能组件,从组件状态中保存的数组中呈现 <option>
s。 Multiple
属性 让我们按住 CTRL 并单击许多元素以 select。如果需要下拉菜单,请将其删除。
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