如何在react-bootstrap中获取select元素的值?
How to get select element's value in react-bootstrap?
所以我试图在 reactjs 中获取 select
元素的值,但就是无法弄清楚。 this.refs.selectElement.getDOMNode().value
总是以 undefined
的形式出现。 text
等表单上的所有其他控件都工作正常。有任何想法吗?是不是不能通过refs
获取select
元素的值,必须使用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>
)
}
});
更新:解决方案
因此,如果有人遇到类似的情况,显然如果您使用的是 react-bootstrap,如果您将它包装在 ListGroup
中,则无法访问 Input
元素。要么将其从中取出,要么将所有 Input
元素包装在 <form>
标记中。这解决了我的问题,感谢所有帮助。
我看到您正在使用 react-bootstrap,它包含一个围绕常规输入元素的包装器。
在这种情况下,您需要使用 getInputDOMNode()
wrapper function in order to get the underlying input's actual DOM element. But you can also use the getValue()
convenience function that 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/
创建函数 handleChange()。然后,像这样把它放在你的 render() 中:
<Input type="select" value="1" ref="valid_for" onChange={this.handleChange}>
以及组件中的函数:
handleChange: function(e) {
var val = e.target.value;
},
以上的 None 对我有用。实际上,我不得不通过 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",
很简单:
关于渲染方法,你应该留意 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)
}
"react": "^15.0.2",
"react-bootstrap": "^0.29.3",
"react-dom": "^15.0.2",
在环境下,ReactDOM.findDOMNode() 对我有用。
在渲染()中:
<FormControl name="username" ref="username"/>
在处理程序()中:
const username = findDOMNode(this.refs.username);
作为字符串的引用是 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" />
// ...
}
}
我最终抓住了变化事件并从中获取了价值。这感觉不到 "React way" 或非常新潮,但它确实有效。
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" />
// ...
}
}
还有一个简单的方法!如果你使用 <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;
如果你像我一样使用最新的 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>
}
}
- 事件处理程序应如下所示:
const changeLanguage = (event: any)=> {
console.log('Selected Index : ', event.target.selectedIndex);
}
- JSX 应包含以下内容:
<Form.Control as="select" onChange={(event)=>{changeLanguage(event)}}>
<option>English</option>
<option>Marathi</option>
</Form.Control>
注意:此解决方案适用于函数组件。对于 class 个组件,我们需要相应地更改语法。
:
注意到目前不推荐使用 getDOMNode() 和不推荐使用 findDOMNode()
import * as React from 'react'
import Form from 'react-bootstrap/Form'
。 &
const Componente1 = (props) => {
let clave = document.getElementById('formSignupPassword').value
console.log(clave)
return (
<>
<Form>
<Form.Group className="mb-2" controlId="formSignupPassword">
<Form.Label className="mb-0">Contraseña</Form.Label>
<Form.Control
type="password"
placeholder="Registre una clave"
/>
</Form.Group>
</Form>
</>
)
}
。 &.
const Componente2 = (props) => {
let passwordText = React.createRef()
let clave = passwordText.current.value
console.log(clave)
return (
<>
<Form>
<Form.Group className="mb-2" controlId="formSignupPassword">
<Form.Label className="mb-0">Contraseña</Form.Label>
<Form.Control
type="password"
placeholder="Registre una clave"
inputRef={passwordText}
// or Use
ref={passwordText}
/>
</Form.Group>
</Form>
</>
)
}
。 ={() =>} & .
const Componente3 = (props) => {
const [userEmail, setEmail] = React.useState(null)
console.log(userEmail)
return (
<>
<Form>
<Form.Group className="mb-2" controlId="formSignupEmail">
<Form.Label className="mb-0">Email</Form.Label>
<Form.Control
type="email"
placeholder="Registre una cuenta de email valida"
onChange={(e) => setEmail(e.target.value)}
/>
</Form.Group>
</Form>
</>
)
}
所以我试图在 reactjs 中获取 select
元素的值,但就是无法弄清楚。 this.refs.selectElement.getDOMNode().value
总是以 undefined
的形式出现。 text
等表单上的所有其他控件都工作正常。有任何想法吗?是不是不能通过refs
获取select
元素的值,必须使用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>
)
}
});
更新:解决方案
因此,如果有人遇到类似的情况,显然如果您使用的是 react-bootstrap,如果您将它包装在 ListGroup
中,则无法访问 Input
元素。要么将其从中取出,要么将所有 Input
元素包装在 <form>
标记中。这解决了我的问题,感谢所有帮助。
我看到您正在使用 react-bootstrap,它包含一个围绕常规输入元素的包装器。
在这种情况下,您需要使用 getInputDOMNode()
wrapper function in order to get the underlying input's actual DOM element. But you can also use the getValue()
convenience function that 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/
创建函数 handleChange()。然后,像这样把它放在你的 render() 中:
<Input type="select" value="1" ref="valid_for" onChange={this.handleChange}>
以及组件中的函数:
handleChange: function(e) {
var val = e.target.value;
},
None 对我有用。实际上,我不得不通过 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",
很简单:
关于渲染方法,你应该留意 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)
}
"react": "^15.0.2",
"react-bootstrap": "^0.29.3",
"react-dom": "^15.0.2",
在环境下,ReactDOM.findDOMNode() 对我有用。
在渲染()中:
<FormControl name="username" ref="username"/>
在处理程序()中:
const username = findDOMNode(this.refs.username);
作为字符串的引用是 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" />
// ...
}
}
我最终抓住了变化事件并从中获取了价值。这感觉不到 "React way" 或非常新潮,但它确实有效。
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" />
// ...
}
}
还有一个简单的方法!如果你使用 <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;
如果你像我一样使用最新的 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>
}
}
- 事件处理程序应如下所示:
const changeLanguage = (event: any)=> {
console.log('Selected Index : ', event.target.selectedIndex);
}
- JSX 应包含以下内容:
<Form.Control as="select" onChange={(event)=>{changeLanguage(event)}}>
<option>English</option>
<option>Marathi</option>
</Form.Control>
注意:此解决方案适用于函数组件。对于 class 个组件,我们需要相应地更改语法。
:
注意到目前不推荐使用 getDOMNode() 和不推荐使用 findDOMNode()
import * as React from 'react'
import Form from 'react-bootstrap/Form'
。 &
const Componente1 = (props) => {
let clave = document.getElementById('formSignupPassword').value
console.log(clave)
return (
<>
<Form>
<Form.Group className="mb-2" controlId="formSignupPassword">
<Form.Label className="mb-0">Contraseña</Form.Label>
<Form.Control
type="password"
placeholder="Registre una clave"
/>
</Form.Group>
</Form>
</>
)
}
。 &.
const Componente2 = (props) => {
let passwordText = React.createRef()
let clave = passwordText.current.value
console.log(clave)
return (
<>
<Form>
<Form.Group className="mb-2" controlId="formSignupPassword">
<Form.Label className="mb-0">Contraseña</Form.Label>
<Form.Control
type="password"
placeholder="Registre una clave"
inputRef={passwordText}
// or Use
ref={passwordText}
/>
</Form.Group>
</Form>
</>
)
}
。 ={() =>} & .
const Componente3 = (props) => {
const [userEmail, setEmail] = React.useState(null)
console.log(userEmail)
return (
<>
<Form>
<Form.Group className="mb-2" controlId="formSignupEmail">
<Form.Label className="mb-0">Email</Form.Label>
<Form.Control
type="email"
placeholder="Registre una cuenta de email valida"
onChange={(e) => setEmail(e.target.value)}
/>
</Form.Group>
</Form>
</>
)
}