【问题标题】:onclick function in react-grid-layout to get checkbox checkedreact-grid-layout 中的 onclick 函数以选中复选框
【发布时间】:2016-12-27 16:34:09
【问题描述】:

在 react-grid-layout 中,我正在显示名称、图像和一个复选框。默认情况下将选中该复选框。我想做的事情是点击我想更改复选框状态的网格,这里onCellClick() 功能不起作用。 这是代码

var Student= React.createClass({
  getDefaultProps:function() {
    return {
      className: "layout",
      rowHeight: 16,
      cols: 16,
      width:1200,
      isDraggable: false,
      isResizable:false,
      verticalCompact:false
    };
  },
  onCellClick:function(){
  if(document.getElementById("stdattendance").checked==false){
  document.getElementById("stdattendance").checked=true;
  }else{
  document.getElementById("stdattendance").checked=false;
  }
  },
  generateDOM:function() {
  console.log(this.props.student+_.range(this.props.items)+new Array(this.props.student));
  var clickfun=this.click;
      return _.map(this.props.student, function(item, i) {
      var keyint=item.id;
      idval.push(item.id);
      var checkid=item.id+"-id";
      var divid=item.id+"-id";
      console.log("key"+keyint+idval);
      console.log("x after : " + i * 2 % 16);
      console.log("y after : " + Math.floor(i / 8) * 8);
      return (<div key={i} id={divid} onClick={this.onCellClick} data-grid={{x: i * 2 % 16, y: Math.floor(i / 8) * 8, w: 2, h: 6,static: true }}><span className="group-class1"> {item.name}</span> 
      <div id="check">
      <input type="checkbox" id="stdattendance" name="stdattendance" checked/>
      </div>
      <Image src="../images/No_image.png"/>
      </div>);     
      });

  },
  render: function() {
    // This prints the correct data

    console.log(this.props.student);
    return (
    <div>
    {(this.props.student.length)?
      <div>
    <ReactGridLayout 
          {...this.props}>

     {this.generateDOM()}
      </ReactGridLayout>
     </div>:""
      }
      </div>
         );
    }
});

【问题讨论】:

  • 你应该使用 React 状态而不是手动处理 DOM。我的意思是,如果你要弄乱 DOM,为什么还要麻烦 React?

标签: javascript reactjs checkbox


【解决方案1】:

原因,为什么所有网格都被选中,是你对所有行使用单个状态变量,使用一个数组,每个条目将附加到每一行,试试这个:

  var Student= React.createClass({
    getInitialState: function() {
       return {
         checked: []
       }
  },
  getDefaultProps:function() {
  return {
     className: "layout",
     rowHeight: 16,
     cols: 16,
     width:1200,
     isDraggable: false,
     isResizable:false,
     verticalCompact:false
  };
},
onCellClick:function(index){
     let checked = this.state.checked;
     checked[index] = !checked[index];
     this.setState({checked: checked});
}
generateDOM:function() {
  console.log(this.props.student+_.range(this.props.items)+new Array(this.props.student));
  var clickfun=this.click;
  return _.map(this.props.student, function(item, i) {
  var keyint=item.id;
  idval.push(item.id);
  var checkid=item.id+"-id";
  var divid=item.id+"-id";
  console.log("key"+keyint+idval);
  console.log("x after : " + i * 2 % 16);
  console.log("y after : " + Math.floor(i / 8) * 8);
  return (<div key={i} id={divid} onClick={this.onCellClick(i)} data-grid={{x: i * 2 % 16, y: Math.floor(i / 8) * 8, w: 2, h: 6,static: true }}><span className="group-class1"> {item.name}</span> 
  <div id="check">
  <input type="checkbox" ref="stdattendance" name="stdattendance" checked={!this.state.checked[i]}/>
  </div>
  <Image src="../images/No_image.png"/>


</div>);     
  }.bind(this));

},
render: function() {
   // This prints the correct data
   console.log(this.props.student);
   return (
     <div>
       {(this.props.student.length)?
          <div>
            <ReactGridLayout {...this.props}>
                {this.generateDOM()}
            </ReactGridLayout>
         </div>:""
       }
     </div>);
}
});

【讨论】:

  • 0n执行checked[index] = !checked[index],已经执行了多次
  • 你怎么知道,这会影响用户界面,仍然有同样的问题吗??
【解决方案2】:

你应该使用 react 方式而不是使用 Javascript DOM,并使用 refs

<input type="checkbox" ref="stdattendance" name="stdattendance" checked/>



onCellClick:function(){
     if(React.findDOMNode(this.refs.stdattendance).checked == false){
        React.findDOMNode(this.refs.stdattendance).checked=true;
     }else{
        React.findDOMNode(this.refs.stdattendance).checked=false;
     }
}

虽然上面的方法已经足够了,但我建议你使用一个受控的复选框组件

    var Student= React.createClass({
      getInitialState: function() {
         return {
            checked: true
         }
      },
      getDefaultProps:function() {
        return {
          className: "layout",
          rowHeight: 16,
          cols: 16,
          width:1200,
          isDraggable: false,
          isResizable:false,
          verticalCompact:false
        };
      },
      onCellClick:function(divid){
  var val;
  console.log("val"+divid);
  var inputElements = document.getElementsByClassName('checkboxgrp');
    for(var i=0; i<inputElements.length; i++){
    console.log(document.getElementsByClassName('checkboxgrp')[i].value);
    if(document.getElementsByClassName('checkboxgrp')[i].value==divid){
      if(document.getElementsByClassName('checkboxgrp')[i].checked==true){
        document.getElementsByClassName('checkboxgrp')[i].checked=false;
    }else{
    document.getElementsByClassName('checkboxgrp')[i].checked=true
    }}}
    },
      generateDOM:function() {
      console.log(this.props.student+_.range(this.props.items)+new Array(this.props.student));
      var clickfun=this.click;
          return _.map(this.props.student, function(item, i) {
          var keyint=item.id;
          idval.push(item.id);
          var checkid=item.id+"-id";
          var divid=item.id+"-id";
          console.log("key"+keyint+idval);
          console.log("x after : " + i * 2 % 16);
          console.log("y after : " + Math.floor(i / 8) * 8);
          return (<div key={i} id={divid} onClick={this.onCellClick.bind(this, divid)} data-grid={{x: i * 2 % 16, y: Math.floor(i / 8) * 8, w: 2, h: 6,static: true }}><span className="group-class1"> {item.name}</span> 
          <div id="check">
          <input type="checkbox" ref="stdattendance" name="stdattendance" className="checkboxgrp" value={item.user} checked={this.state.checked}/>
          </div>
          <Image src="../images/No_image.png"/>


        </div>);     
          }.bind(this));

      },
      render: function() {
        // This prints the correct data

        console.log(this.props.student);
        return (
        <div>
        {(this.props.student.length)?
          <div>
        <ReactGridLayout 
              {...this.props}>

         {this.generateDOM()}
          </ReactGridLayout>
         </div>:""
          }
          </div>
             );
        }
    });

【讨论】:

  • onClick={this.onCellClick} 中已经有错误 --- 无法读取未定义的属性 'onCellClick'
  • 刚刚意识到 map 函数没有绑定到导致 onClick 未定义的上下文。刚刚修好了
  • 它工作正常,谢谢你的回答。但是在单击网格时,会单击所有网格复选框
  • 这种情况下需要定义一个对应单个复选框的状态,可以参考stackoverflow.com/questions/39227084/…
  • 好的,但我正在显示带有学生姓名数量复选框的网格
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 2019-09-28
  • 1970-01-01
相关资源
最近更新 更多