簡體   English   中英

如何從react-bootstrap復選框獲取值/屬性?

[英]How to get values/properties from a react-bootstrap checkbox?

我正在嘗試使用react-bootstrap復選框( https://react-bootstrap.github.io/components.html#forms-controls ),我需要在更改狀態時觸發事件。 能夠以編程方式取消/檢查它和/或判斷它是否被檢查也是很好的。 不幸的是,當代碼被轉換並呈現​​時,它將輸入包裝在div中。

我怎樣才能在dom中找到它並操縱它?

我的代碼看起來類似於:

import React, { PropTypes } from 'react';
import { Checkbox } from 'react-bootstrap';

const EditItem = (props) => {

  return (
    <div>
      <Checkbox style={{ marginLeft: '15px' }} >{props.itemLable}</Checkbox>
    </div>
  );
};

export default EditItem;

瀏覽器渲染:

...
<div class="checkbox" style="margin-left: 15px;">
  <label>
    <input type="checkbox">
  </label>
</div>
...

我在文檔中看到了inputRef prop,但是我找不到任何這樣的例子或讓它自己工作。

有兩種方式:React方式和不那么React方式。

React的方法是通過傳遞道具並通過附加事件處理程序來響應其狀態的變化來設置子組件的狀態。 對於Checkbox,這意味着設置checkedonChange道具。

請注意,在下面的例子中父組件(應用程序)如何跟蹤復選框的狀態,可以用兩種設置this.setState ,並查詢它this.state.checkboxChecked

 const { Checkbox, Button } = ReactBootstrap; class App extends React.Component { constructor() { super(); this.state = { checkboxChecked: false }; this.handleChange = this.handleChange.bind(this); this.handleIsItChecked = this.handleIsItChecked.bind(this); this.handleToggle = this.handleToggle.bind(this); } render() { return ( <div> <Checkbox checked={this.state.checkboxChecked} onChange={this.handleChange} /> <Button type="button" onClick={this.handleToggle}>Toggle</Button> <Button type="button" onClick={this.handleIsItChecked}>Is it checked?</Button> </div> ); } handleChange(evt) { this.setState({ checkboxChecked: evt.target.checked }); } handleIsItChecked() { console.log(this.state.checkboxChecked ? 'Yes' : 'No'); } handleToggle() { this.setState({ checkboxChecked: !this.state.checkboxChecked }); } } ReactDOM.render(<App/>, document.querySelector('div')); 
 <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/latest/css/bootstrap.min.css"> <script src="//cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/react-bootstrap/0.30.8/react-bootstrap.min.js"></script> <div></div> 

不那么React的方法是獲取對呈現的DOM元素的引用並直接訪問其checked屬性。 我不推薦這個,因為它必然會用icky強制性代碼污染你可愛的功能性React代碼。 不過,使用React-Bootstrap可以通過設置inputRef prop來實現,如下例所示:

 const { Checkbox, Button } = ReactBootstrap; class App extends React.Component { constructor() { super(); this.handleIsItChecked = this.handleIsItChecked.bind(this); this.handleToggle = this.handleToggle.bind(this); } render() { return ( <div> <Checkbox onChange={this.handleChange} inputRef={ref => this.myCheckbox = ref} /> <Button type="button" onClick={this.handleToggle}>Toggle</Button> <Button type="button" onClick={this.handleIsItChecked}>Is it checked?</Button> </div> ); } handleIsItChecked() { console.log(this.myCheckbox.checked ? 'Yes' : 'No'); } handleToggle() { this.myCheckbox.checked = !this.myCheckbox.checked; } } ReactDOM.render(<App/>, document.querySelector('div')); 
 <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/latest/css/bootstrap.min.css"> <script src="//cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/react-bootstrap/0.30.8/react-bootstrap.min.js"></script> <div></div> 

謝謝你的上述答案。 我在給定組件中有多個復選框時稍微概括了上面的內容:

  constructor() {
    super();
    this.state = { YourInputName: false };
    this.handleCheckboxChange = this.handleCheckboxChange.bind(this);
  }

  render() {
    return (
      <div>
        <Checkbox
          name="YourInputName"
          onChange={this.handleCheckboxChange} />
      </div>
    );
  }

  handleCheckboxChange(event) {
    const target = event.target
    const checked = target.checked
    const name = target.name
    this.setState({
        [name]: checked,
    });
  }

您是否嘗試過將onChange屬性設置為復選框?

handleChange(event) {
    this.setState(*set checkbox state here*);
}

<Checkbox onChange={this.handleChange}></Checkbox>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM