【问题标题】:React: Dynamically generated <select> elements - setting 'selected' state in a mapped elementReact:动态生成的 <select> 元素 - 在映射元素中设置“选择”状态
【发布时间】:2017-07-22 22:19:34
【问题描述】:

我正在尝试在&lt;select&gt; 元素中处理动态生成的&lt;option&gt; 的选择。我知道onChange 触发器是我需要设置状态的,但我似乎无法让她工作。

这就是我正在做的事情:

请参阅 Archibald Hammer (@archaeopteryx) 在CodePen 上的钢笔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。有什么想法吗?

另外,有没有人有任何解决此类问题的专业提示?您知道任何超级流畅的开发工具或找出正在传递哪些道具的方法等?

【问题讨论】:

    标签: forms reactjs lodash setstate


    【解决方案1】:

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

    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

    就调试技巧而言,在这种特殊情况下,只需知道事件是由选择组件触发的,而不是由选项元素触发的;)。但我一直使用的是 React 开发者工具:

    https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi

    https://addons.mozilla.org/es/firefox/addon/react-devtools/

    【讨论】:

    • 感谢一百万!首先选择第一个元素时有一个小错误。我想我会把它作为默认选择的项目。如果您单击第一项,则由于某种原因它不会调用 setState。再次感谢! PS。我也使用 React-dev-tools。很有帮助。
    • 是的,在数组中创建一个空值的额外元素,我已经更新了示例,看看。
    猜你喜欢
    • 2021-07-26
    • 2020-08-20
    • 1970-01-01
    • 2022-06-27
    • 2022-12-17
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多