如何在react-bootstrap中获取select元素的值?

时间:2015-02-23 16:29:40

标签: javascript reactjs react-bootstrap

所以我试图在reactjs中获得select元素的值,但是无法弄明白。 this.refs.selectElement.getDOMNode().value始终为undefined。表单上的所有其他控件(如text)都运行正常。有任何想法吗?您是否无法通过select获取refs元素的值并且必须使用onChange事件?

更新:



var TestSelectClass = React.createClass({
  mixins: [Router.Navigation],

  _handleDube: function(event) {
    DubeActionCreators.DubeTest({
      message: this.refs.message.getDOMNode().value,
      tax: this.refs.tax.getDOMNode().value,
      validity: this.refs.valid_for.getDOMNode().value
    });
  },

  render: function() {
    return (
      <ReactBootstrap.ListGroup>
          <textarea
            className="form-control"
            rows="3"
            placeholder="Enter message"
            ref="message" >
          </textarea>
          <div className="input-group">
            <span className="input-group-addon" id="basic-addon1">$</span>
            <input type="text" className="form-control" placeholder="10" aria-describedby="basic-addon1" ref="tax" />
          </div>
        <Input type="select" value="1" ref="valid_for">
          <option value="1">1 hour</option>
          <option value="2">1 day</option>
          <option value="2">5 days</option>
        </Input>
      </ReactBootstrap.ListGroup>
    )
  }
});
&#13;
&#13;
&#13;

已更新:解决方案 所以,如果有人碰到类似的东西,显然如果你使用的是反应引导程序,如果你将它包裹在Input中,你就无法进入ListGroup元素。从中取出或将所有Input元素包装在<form>标记中。这解决了我的问题,感谢所有的帮助。

9 个答案:

答案 0 :(得分:42)

非常简单:

在渲染方法上你应该关注bind(this)

<select onChange={this.yourChangeHandler.bind(this)}>
  <option value="-1" disabled>--</option>
  <option value="1">one</option>
  <option value="2">two</option>
  <option value="3">three</option>
</select>

你的处理程序就像:

yourChangeHandler(event){
  alert(event.target.value)
}

答案 1 :(得分:31)

我看到你正在使用react-bootstrap,其中包含常规输入元素的包装。

在这种情况下,您需要使用getInputDOMNode()包装函数来获取底层输入的实际DOM元素。但您也可以使用getValue()。{/ p>的react-bootstrap provides for Input elements便利功能

因此,您的_handleDube函数应如下所示:

  _handleDube: function(event) {
    DubeActionCreators.DubeTest({
      message: this.refs.message.getInputDOMNode().value,
      tax: this.refs.tax.getInputDOMNode().value,
      validity: this.refs.valid_for.getValue()
    });
  },

请参阅此JSFiddle以获取完整示例:http://jsfiddle.net/mnhm5j3g/1/

答案 2 :(得分:13)

创建函数handleChange()。然后,将它放在你的render()中:

<Input type="select" value="1" ref="valid_for" onChange={this.handleChange}>

组件中的功能:

handleChange: function(e) {
  var val = e.target.value;
},

答案 3 :(得分:6)

"react": "^15.0.2",
"react-bootstrap": "^0.29.3",
"react-dom": "^15.0.2",
在env下,ReactDOM.findDOMNode()对我有用。

在render()中:

<FormControl name="username" ref="username"/>
在handler()中

const username = findDOMNode(this.refs.username);

答案 4 :(得分:3)

以上都不适合我。我实际上必须通过DOM层次结构来提出一种提取值的方法。 PS:我在代码中使用ReactBootstrap.ListGroup。只是来自React Bootstrap的Input。这是我的代码(ES6 +)。

import ReactDOM from 'react-dom';

getValueFromSelect(ref){
    var divDOMNode = ReactDOM.findDOMNode(ref);
    /* the children in my case were a label and the select itself. 
       lastChild would point to the select child node*/
    var selectNode = divDOMNode.lastChild;
    return selectNode.options[selectNode.selectedIndex].text;
}

依赖关系:

    "react": "^0.14.3",
    "react-bootstrap": "0.28.1",
    "react-dom": "^0.14.3",

答案 5 :(得分:1)

参考字符串为considered legacy and may be deprecated。但似乎react-bootstrap组件不能与回调引用一起工作。我今天正在努力处理搜索输入。

class SearchBox extends Component {
  constructor(props, context) {
    super(props, context);
    this.handleChange = this.handleChange.bind(this);
  }

  handleChange() {
    this.props.updateQuery(this._query.value);
  }

  render() {
    // ...
    <FormControl
      onChange={this.handleChange}
      ref={(c) => this._query = c} // should work but doesn't
      value={this.props.query}
      type="text"
      placeholder="Search" />
    // ...
  }
}

我抓住改变事件并从中获取价值。这不会感觉到“反应方式”或非常新,但它确实有效。

class SearchBox extends Component {
  constructor(props, context) {
    super(props, context);
    this.handleChange = this.handleChange.bind(this);
  }

  handleChange(e) {
    this.props.updateQuery(e.target.value);
  }

  render() {
    // ...
    <FormControl
      onChange={this.handleChange}
      value={this.props.query}
      type="text"
      placeholder="Search" />
    // ...
  }
}

答案 6 :(得分:0)

还有另一种简单方法!如果您使用<FormGroup>组件并设置controlId道具,则内部DOM(<input>,...)会将controlId作为其id属性。例如:

<FormGroup controlId="myInputID">
  <ControlLabel>Text</ControlLabel>
  <FormControl type="text" placeholder="Enter text" />
</FormGroup>

然后通过调用document.getElementById

获得价值
var myInputValue = document.getElementById("myInputID").value;

答案 7 :(得分:0)

如果您像我一样使用最新的FormControl组件,我的解决方案是:

import React, {Component} from 'react'
import ReactDOM from 'react-dom'

class Blah extends Component {
    getSelectValue = () => {
        /* Here's the key solution */
        console.log(ReactDOM.findDOMNode(this.select).value)
    }

    render() {
        return
        <div> 
            <FormControl
            ref={select => { this.select = select }}
            componentClass="select"
            disabled={this.state.added}
            >
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
            </FormControl>
            <Button onclick={this.getSelectValue}>
                Get Select value
            </Button>
        </div>
    }
}

答案 8 :(得分:0)

  1. 事件处理程序应如下所示:
const changeLanguage = (event: any)=> {
  console.log('Selected Index : ', event.target.selectedIndex);
}
  1. JSX 应包含以下内容:
<Form.Control as="select" onChange={(event)=>{changeLanguage(event)}}>                
  <option>English</option>
  <option>Marathi</option>
</Form.Control>

注意:此解决方案适用于功能组件。对于类组件,我们需要相应地更改语法。