【问题标题】:Make checked/unchecked attribute onChange checkbox in Reactjs在 Reactjs 中选中/取消选中属性 onChange 复选框
【发布时间】:2016-09-14 21:41:04
【问题描述】:

我的反应组件有问题。我有这样的自定义样式复选框http://jsfiddle.net/fvdbcch0/

我想点击我的组件或标签来选中或取消选中输入。

目前,只有当我完全点击输入时,它才适用于基本样式。

如何正确更改检查状态 onChange ?

代码:

 var Tag = React.createClass({
getInitialState: function(){

  return {
      checked: false
  };
},
componentDidMount: function() {
    this.setState({
        checked: false
      });
},
_onChange: function(event) {
   if(this.state.checked == false){
       this.setState({
        checked: true
      });
   } else {
       this.setState({
        checked: false
      });
   }
},
    render: function() {
        return (
            <div>
                <input type="checkbox" id="{this.props.id}" name="{this.props.name}" checked={this.state.checked} onChange={ this._onChange }
  value={ this.props.id }/><label htmlFor="{this.props.name}">{this.props.name}</label>
            </div>
        );
    }
});
var ReviewTag = React.createClass({
    render: function() {
         var tags = [{"id": 1, "name": "friendly"}, {"id": 2, "name": "comfortable"}, {"id": 3, "name": "fast"}];
         const tagComps = tags.map(function(tag){
           return <Tag {...tag} />;
         });
        return (
        <div>
             {tagComps}
        </div>
    );
    }
});

React.render(<ReviewTag/>, document.body);

我的自定义输入的样式:

/* Base for label styling */
[type="checkbox"]:not(:checked),
[type="checkbox"]:checked,
[type="radio"]:not(:checked),
[type="radio"]:checked{
  position: absolute;
  left: -9999px;
}
[type="checkbox"]:not(:checked) + label,
[type="checkbox"]:checked + label,
[type="radio"]:not(:checked) + label,
[type="radio"]:checked + label{
  position: relative;
  padding-left: 25px;
  cursor: pointer;
}

/* checkbox/radio aspect */
[type="checkbox"]:not(:checked) + label:before,
[type="checkbox"]:checked + label:before,
[type="radio"]:not(:checked) + label:before,
[type="radio"]:checked + label:before{
  content: '';
  position: absolute;
  left:0; top: 50%;
  width: 1rem; height:1rem;
  border: 1px solid #aaa;
  background: #fff;
  box-shadow: inset 0 1px 3px rgba(0,0,0,.3);
  transform: translateY(-50%);
}
[type="radio"]:not(:checked) + label:before,
[type="radio"]:checked + label:before{
  border-radius:100%;
}
/* checked mark aspect */
[type="checkbox"]:checked + label:after {
  content: '✓';
  position: absolute;
  top: 50%;
  left: 0px;
  font-size: 1rem;
  line-height: 0.8;
  color: #e71558;
  transition: all .2s;
  transform: translateY(-50%);
}
/* checked radio aspect */
[type="radio"]:checked + label:after {
  content: '•';
  position: absolute;
  top: 6px;
  left: 2px;
  font-size: 15px;
  line-height: 0.8;
  color: #e71558;
  transition: all .2s;
  //transform: translateY(-50%);
  text-align: center;
}
/* checked mark aspect changes */
[type="checkbox"]:not(:checked) + label:after,
[type="radio"]:not(:checked) + label:after{
  opacity: 0;
  transform: scale(0);
}
[type="checkbox"]:checked + label:after,
[type="radio"]:checked + label:after {
  opacity: 1;
  //transform: scale(1);
}
/* disabled checkbox/radio */
[type="checkbox"]:disabled:not(:checked) + label:before,
[type="checkbox"]:disabled:checked + label:before,
[type="radio"]:disabled:not(:checked) + label:before,
[type="radio"]:disabled:checked + label:before{
  box-shadow: none;
  border-color: #bbb;
  background-color: #ddd;
}
[type="checkbox"]:disabled:checked + label:after,
[type="radio"]:disabled:checked + label:after{
  color: #999;
}
[type="checkbox"]:disabled + label,
[type="radio"]:disabled + label{
  color: #aaa;
}
/* accessibility */
[type="checkbox"]:checked:focus + label:before,
[type="checkbox"]:not(:checked):focus + label:before,
[type="radio"]:checked:focus + label:before,
[type="radio"]:not(:checked):focus + label:before{
  border: 1px dotted blue;
}

/* hover style just for information */
label:hover:before {
  border: 1px solid #4778d9!important;
}

非常感谢您对此的帮助。

【问题讨论】:

    标签: javascript jquery reactjs


    【解决方案1】:

    您的复选框缺少一些使其工作所需的道具。您需要能够使用道具或状态来判断复选框是否已选中。您还需要为每个复选框赋予一个值,这样当您检查它时,您实际上将拥有一个可以使用的值。最后,您需要一个 onChange 道具,该道具将在单击复选框时发生。这个函数应该更新控制该特定复选框是否被选中的任何状态。这是一个为 react 制作的复选框输入示例

    <input name={ this.props.name }
          type="checkbox"
          checked={ this.props.checked }
          className="cui-checkbox-input"
          onChange={ this._onChange }
          value={ this.props.value } />
    

    _onChange 是一个类似于

    的函数
    _onChange: function(event) { 
       // do stuff using the event to grab needed values
    }
    

    【讨论】:

    • 嗯,我猜我理解你。我在检查状态下更改了一些代码,但是我在更改此状态 onChange 时遇到了困难?如果你有时间,你现在可以看看这个,让我知道我在哪里犯了错误吗?
    【解决方案2】:

    好的,我找到了解决方案。

    我在组件的标签中添加了onClick={ this._onChange },它起作用了!

    【讨论】:

    • 太棒了!执行 onChange 函数的一种简洁方法是只执行 this.setState({ checked: !this.state.checked });
    猜你喜欢
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2017-09-21
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    相关资源
    最近更新 更多