2015-02-23 67 views
31

所以我試圖在reactjs中獲得一個select元素的值,但只是無法弄清楚。 this.refs.selectElement.getDOMNode().value始終爲undefined。表格上的所有其他控件(如text)都正常工作。有任何想法嗎?是否通過refs獲得select元素的值並且必須使用onChange事件?如何在react-bootstrap中獲取select元素的值?

更新時間:

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> 
 
    ) 
 
    } 
 
});

更新:解決方案 所以,如果有人跑進類似的東西,顯然,如果你正在使用的反應,引導你不能給Input元素(如果已將其包裝在ListGroup中)。將其從中取出或將所有Input元素包裝在<form>標記中。這解決了我的問題,感謝所有的幫助。

+1

你能發佈你的代碼嗎? – sma 2015-02-23 16:34:09

+0

我用代碼更新了它。 – 2015-02-23 16:42:55

+0

你無處設置'ref =「selectElement」'。 – julen 2015-02-23 17:22:18

回答

31

我看你使用的是react-bootstrap,它包括一個圍繞常規輸入元素的包裝。

在這種情況下,您需要使用getInputDOMNode()包裝函數來獲取底層輸入的實際DOM元素。但你也可以使用getValue()便利功能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/

+0

不起作用。 getInputDOMNode()以未定義的形式出現。 – 2015-02-24 07:40:43

+0

它確實有效,我添加了一個JSFiddle來展示一個示例。 – julen 2015-02-24 08:35:43

+0

你是對的,它確實有效。然而,由於某種原因,它不適用於我的應用程序,但我會接受答案,因爲它是正確的答案。謝謝 – 2015-02-24 17:05:18

13

做一個函數handleChange()。然後,把它放在你的渲染()這樣的:

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

而在組件的功能:

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

是的,這就是我現在正在做的事情,但問題是我們不能使用refs來選擇元素嗎? – 2015-02-24 07:41:13

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", 
36

這是相當簡單:

的渲染方法,你應該保持對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) 
} 
+11

提供答案的獎勵積分,無需使用參考 – Raniz 2016-03-10 14:30:16

+2

謝謝,幫助了我很多! :) – Vetterjack 2017-04-21 10:04:44

+1

這是做這件事的最佳方式。 – eden 2017-06-26 19:31:05

6
"react": "^15.0.2", 
"react-bootstrap": "^0.29.3", 
"react-dom": "^15.0.2", 

在env下,ReactDOM.findDOMNode()適用於我。在

渲染():

<FormControl name="username" ref="username"/> 
在處理程序

():

const username = findDOMNode(this.refs.username); 
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" /> 
    // ... 
    } 
} 
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; 
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> 
    } 
} 
+0

我能否知道爲什麼這個答案最初被拒絕投票?我真的很陌生,我想知道這是否正確實施。 – 2017-12-06 07:36:48

+0

@NivedithaKarmegam同樣的問題,自從我加入後,我一直在這裏一直在這裏,人們在沒有給出答案的情況下進行投票,爲什麼這真的是一個問題。關於你的問題,這是否是一個適當的實施,這取決於,在寫這個答案的時候,我不確定最近的更新。所以我的個人理念是,如果它的工作原理,你不需要更新你的圖書館,並希望生產效率,那麼這種方法是給你的。否則,'react-bootstrap'文檔是你最好的朋友,因爲即使在SO這裏接受的答案也會變得陳舊。 – JohnnyQ 2017-12-12 01:01:24