我正在尝试在<select>
元素中处理动态生成的<option>
的选择,我知道onChange
触发器是我需要用来setState的,但我似乎无法让她正常工作。
下面是我正在做的事情:
请参阅CodePen上阿奇博尔德·哈默(@archaeopteryx)的the Pen dynamic select。
import React from 'react'
import ReactDOM from 'react-dom'
import _ from 'lodash'
const ITEMS = [
{ name: 'centos', text: 'centos', value: 'centosValue' },
{ name: 'ubuntu', text: 'ubuntu', value: 'ubuntuValue' },
]
const SelectComponent = (props) => (
<select name={props.name}>
{_.map(props.items, (item, i) => <Option
key={i}
name={item.name}
value={item.value}
text={item.text}
handleSelect={props.handleSelect}
/>
)}
</select>
)
const Option = (props) => (
<option
value={props.value}
onChange={props.handleSelect}>{props.text}</option>
)
class App extends React.Component {
constructor() {
super()
this.state = {
selected: ''
}
this.handleSelect = this.handleSelect.bind(this)
}
handleSelect(e) {
this.setState({selected: e.target.value})
}
render() {
return (
<div>
<SelectComponent
name="testSelect"
items={ITEMS}
handleSelect={this.handleSelect}
/>
<div>
<p>Selected: {this.state.selected}</p>
</div>
</div>
)
}
}
ReactDOM.render(<App/>, document.getElementById('app'))
这段代码确实按照预期呈现了下拉选择器,但它没有触发所选项目上的setState。有什么想法吗?
另外,有没有人有解决这类问题的建议呢?有没有你知道的超级巧妙的开发工具或方法来找出哪些道具被通过了,等等?
发布于 2017-07-23 06:49:18
问题是select元素中的选项不会触发任何事件,更改发生在select元素中,而不是选项中。您所要做的就是将handleSelect
方法传递给<select>
组件:
const SelectComponent = (props) => (
<select name={props.name}
onChange={props.handleSelect}
>
{_.map(props.items, (item, i) => <Option
key={i}
name={item.name}
value={item.value}
text={item.text}
handleSelect={props.handleSelect}
/>
)}
</select>
);
const Option = (props) => (
<option
value={props.value}
>{props.text}</option>
)
抱歉,我忘了添加实时示例链接:https://codesandbox.io/s/31AyQ2woR
就调试技巧而言,在这种特殊情况下,只需知道事件是由select组件而不是option元素触发的;)。但我一直使用的是React开发工具:
https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi
https://stackoverflow.com/questions/45259749
复制相似问题