首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >React:动态生成的<select>元素-在映射元素中设置“selected”状态

React:动态生成的<select>元素-在映射元素中设置“selected”状态
EN

Stack Overflow用户
提问于 2017-07-23 06:19:35
回答 1查看 896关注 0票数 1

我正在尝试在<select>元素中处理动态生成的<option>的选择,我知道onChange触发器是我需要用来setState的,但我似乎无法让她正常工作。

下面是我正在做的事情:

请参阅CodePen上阿奇博尔德·哈默(@archaeopteryx)的the Pen dynamic select

代码语言:javascript
运行
复制
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。有什么想法吗?

另外,有没有人有解决这类问题的建议呢?有没有你知道的超级巧妙的开发工具或方法来找出哪些道具被通过了,等等?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-23 06:49:18

问题是select元素中的选项不会触发任何事件,更改发生在select元素中,而不是选项中。您所要做的就是将handleSelect方法传递给<select>组件:

代码语言:javascript
运行
复制
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://addons.mozilla.org/es/firefox/addon/react-devtools/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45259749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档