如何设置默认的Checked复选框ReactJS?


168

在为复选框状态分配默认值后,我无法更新复选框状态 checked="checked"在React中。

var rCheck = React.createElement('input',
                                 {type: 'checkbox', checked:'checked', value: true},
                                 'Check here');

分配后checked="checked",我无法通过单击取消选中/选中来交互复选框状态。


6
facebook.github.io/react/docs/forms.html检查受控组件和非受控组件之间的区别。
zerkms,2015年

Answers:


234

要与复选框进行交互,您需要在更改复选框后更新其状态。要使用默认设置,可以使用defaultChecked

一个例子:

<input type="checkbox" defaultChecked={this.state.chkbox} onChange={this.handleChangeChk} />

但是我没有将INPUT创建为类,而是由React.createElement创建的。因此,如何设置默认值
Yarin Nim 2015年

6
@YarinNim可以render与上述<input>元素一起使用。的defaultChecked可以作为像PARAM提供checkedIS。
nitishagar

70

有几种方法可以完成此操作,以下是几种方法:

使用State Hooks编写

function Checkbox() {
  const [checked, setChecked] = React.useState(true);

  return (
    <label>
      <input type="checkbox"
        checked={checked}
        onChange={() => setChecked(!checked)}
      />
      Check Me!
    </label>
  );
}

ReactDOM.render(
  <Checkbox />,
  document.getElementById('checkbox'),
);

这是JSBin上的现场演示。

使用组件编写

class Checkbox extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      isChecked: true,
    };
  }
  toggleChange = () => {
    this.setState({
      isChecked: !this.state.isChecked,
    });
  }
  render() {
    return (
      <label>
        <input type="checkbox"
          checked={this.state.isChecked}
          onChange={this.toggleChange}
        />
        Check Me!
      </label>
    );
  }
}

ReactDOM.render(
  <Checkbox />,
  document.getElementById('checkbox'),
);

这是JSBin上的现场演示。


3
全州!无状态方法怎么样?
绿色的

53

如果仅使用创建复选框,React.createElement则使用该属性 defaultChecked

React.createElement('input',{type: 'checkbox', defaultChecked: false});

归功于@nash_ag


4
这是不对的,您也可以将defaultChecked与常规html标记一起使用,与(class => className)和(for => htmlFor)相同,依此类推...
Fareed Alnamrouti

31

在React渲染生命周期中,表单元素上的value属性将覆盖DOM中的值。对于不受控制的组件,您通常希望React指定初始值,但使后续更新不受控制。要处理这种情况,可以指定defaultValue或defaultChecked属性而不是value。

        <input
          type="checkbox"
          defaultChecked={true}
        />

要么

React.createElement('input',{type: 'checkbox', defaultChecked: true});

defaultChecked在下面查看有关复选框的更多详细信息:https : //reactjs.org/docs/uncontrol-components.html#default-values


1
如果直接使用选中的参数,则无法取消选中它。为此,必须使用defaultChecked参数。谢谢。
kodmanyagha

12

除了正确的答案,您也可以执行:P

<input name="remember" type="checkbox" defaultChecked/>

1
应该是公认的答案,因为这是大多数人想要的:本机HTML的替代方法checked
布拉姆·范罗伊

4

它正在工作

<input type="checkbox" value={props.key} defaultChecked={props.checked} ref={props.key} onChange={this.checkboxHandler} />

并启动它

{this.viewCheckbox({ key: 'yourKey', text: 'yourText', checked: this.state.yourKey })}

3

您可以将“ true”或“”传递给输入复选框的checked属性。空引号(“”)将被理解为false,并且该项目将被取消选中。

let checked = variable === value ? "true" : "";
<input
     className="form-check-input"
    type="checkbox"
    value={variable}
    id={variable}
    name={variable}
    checked={checked}
/>
<label className="form-check-label">{variable}</label>

已弃用
Mbanda,

@Mbanda您能否提供文档以提供有关此的更多信息
Brad

您不应该这样做。如果将字符串传递给“ checked”属性,则会收到警告:“警告:已收到trueboolean属性的字符串checked。尽管此方法有效,但如果传递字符串“ false”,则无法按预期工作。已检查= {true}?”
paul.ago

1

就我而言,我认为“ defaultChecked”在状态/条件下无法正常工作。因此,我使用“ checked”和“ onChange”来切换状态。

例如。

checked={this.state.enabled} onChange={this.setState({enabled : !this.state.enabled})}

0

这是我前一段时间做的代码,可能有用。您必须使用此行=> this.state = {选中:false,checked2:true};

class Componente extends React.Component {
  constructor(props) {
    super(props);

    this.state = { checked: false, checked2: true};
    this.handleChange = this.handleChange.bind(this);
    this.handleChange2 = this.handleChange2.bind(this);

  }  

  handleChange() {
    this.setState({
        checked: !this.state.checked      
    })
  }

  handleChange2() {
    this.setState({
        checked2: !this.state.checked2      
    })
  }

  render() {
    const togglecheck1 = this.state.checked ? 'hidden-check1' : '';
    const togglecheck2 = this.state.checked2 ? 'hidden-check2' : '';

    return <div>
        <div>
        <label>Check 1</label>
        <input type="checkbox" id="chk1"className="chk11" checked={ this.state.checked } onChange={ this.handleChange } />
        <label>Check 2</label>
        <input type="checkbox" id="chk2" className="chk22" checked={ this.state.checked2 } onChange={ this.handleChange2 } />
      </div>

      <div className={ togglecheck1 }>show hide div with check 1</div>
      <div className={ togglecheck2 }>show hide div with check 2</div>

    </div>;
  }
}

ReactDOM.render(
  <Componente />,
  document.getElementById('container')
);

的CSS

.hidden-check1 {
  display: none;  
  }

.hidden-check2 {
  visibility: hidden;
}

的HTML

  <div id="container">
      <!-- This element's contents will be replaced with your component. -->
  </div>

这是codepen => http://codepen.io/parlop/pen/EKmaWM


还有另一个...这是全州的方法!无状态呢?
绿色的

绿色,你是什么意思?
omarojo

0

不要太努力。首先,了解下面给出的一个简单示例。这对您很清楚。在这种情况下,只需按下复选框,我们就会从状态中获取值(最初为false),将其更改为其他值(最初为true)并相应地设置状态。如果第二次按下该复选框,它将再次执行相同的过程。抓取值(现在为true),将其更改为(false),然后相应地设置状态(现在再次为false)。下面共享代码。

第1部分

state = {
  verified: false
} // The verified state is now false

第2部分

verifiedChange = e => {
  // e.preventDefault(); It's not needed
  const { verified } = e.target;
  this.setState({
    verified: !this.state.verified // It will make the default state value(false) at Part 1 to true 
  });
}; 

第三部分

  <form> 
      <input
          type="checkbox"
          name="verified"
          id="verified"
          onChange={this.verifiedChange} // Triggers the function in the Part 2
          value={this.state.verified}
      />
      <label for="verified">
      <small>Verified</small>
      </label>
  </form>

0

这可以用纯js来完成

              <Form.Group controlId="categoryStatus">
                <Form.Check
                  type="checkbox"
                  label="Category Status Active/In-active"
                  onChange={this.handleChecked}                 
                />
              </Form.Group>
  //Load category to form : to edit
  GetCategoryById(id) {
    this.UpdateId = id
    axios.get('http://localhost:4000/Category/edit/' + id)
      .then(response => {
        this.setState({
          category_name: response.data.category_name,
          category_description: response.data.category_description,
          is_active: response.data.is_active,
        });

        response.data.is_active == 1 ? document.getElementById("categoryStatus").checked = true : document.getElementById("categoryStatus").checked = false;
      })
      .catch(function (error) {
        console.log(error);
      })
  }


-2
 <div className="form-group">
          <div className="checkbox">
            <label><input type="checkbox" value="" onChange={this.handleInputChange.bind(this)}  />Flagged</label>
            <br />
            <label><input type="checkbox" value=""  />Un Flagged</label>
          </div>
        </div

handleInputChange(event){

console.log("event",event.target.checked)   }

上述句柄在选中或未选中时为您提供true或false的值


-2

我将状态设置为any []类型。并在构造函数中将状态设置为null。

onServiceChange = (e) => {
    const {value} = e.target;
    const index = this.state.services.indexOf(value);
    const services = this.state.services.filter(item => item !== value);
    this.setState(prevState => ({
        services: index === -1 ? prevState.services.push(value) && prevState.services : this.state.services.filter(item => item !== value)
    }))
}

在输入元素中

this.onServiceChange(e)} /> this.onServiceChange(e)} /> this.onServiceChange(e)} /> this.onServiceChange(e)} />

一段时间后,我想通了。以为这可能对大家有帮助:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.