javascript - 你如何在 React 中使用子组件实现 "check all"?

标签 javascript checkbox reactjs

我在这里找到了几个可以回答问题的问题,

但他们不允许我渲染带有复选框的组件。

我想要的是这样的,

render: function () {
    var rows = [<ChildElement key={1} />, <ChildElement key={2} />];
    return (
    <ParentElement>{rows}</ParentElement>
    );
}

我的 ChildElements 每个都有自己的复选框,无论何时在 ParentElement 上选中或取消选中全局复选框,这些复选框都可以设置为 checked=truechecked=false

有什么建议吗?干杯

最佳答案

我整理了一个要点供您尝试,但基本思想是维护父项中复选框的状态,并在子项中进行回调以传递其更改后的状态。

http://jsfiddle.net/69z2wepo/4785/

var Row = React.createClass({
  getInitialState: function() {
    return {
      checked: false
    };
  },
  checkIt: function() {
    this.props.callback(this.props.index, !this.props.checked);
    return;
  },
  render: function() {
    return (
      <tr>
        <td><input type="checkbox" checked={this.props.checked} onChange={this.checkIt} /></td>
        <td>{this.props.obj.foo}</td>
      </tr>
    );
  }
});

var Table = React.createClass({
  getInitialState: function() {
    var rowState =[];
    for(var i = 0; i < this.props.rows.length; i++) {
      rowState[i] = false;
    }
    return {
      checkAll: false,
      rowState:rowState
    };
  },
  checkRow: function (id,value) {
    this.state.rowState[id] = value;
    if (this.state.checkAll) {
      this.state.checkAll = !this.state.checkAll;
    }
    this.setState({
      rowState: this.state.rowState,
      checkAll: this.state.checkAll
    });
  },
  checkAll: function () {
    var rowState =[];
    var checkState = !this.state.checkAll;
    for(var i = 0; i < this.state.rowState.length; i++) {
      rowState[i] = checkState;
    }

    this.state.checkAll = checkState;

    this.setState({
      rowState: rowState,
      checkAll: this.state.checkAll
    });
  },
  render: function() {
    var self = this;

    var rows = _.map(this.props.rows, function( row,index) {
      return (<Row obj={row} index={index} key={row.id} checked={self.state.rowState[index]} callback={self.checkRow} />);
    });
    return (
      <div className="table-holder container">
      <input type="checkbox" checked={this.state.checkAll} onChange={this.checkAll} />
      <table className="table">{rows}</table>
      </div>
    );
  }
});

var rows = [
  {
    'id' : 1,
    'foo': 'bar'
  },
  {
    'id' : 2,
    'foo': 'baarrrr'
  },
  {
    'id' : 3,
    'foo': 'baz'
  }
];

React.render(<Table rows={rows}/>, document.getElementById('container'));

关于javascript - 你如何在 React 中使用子组件实现 "check all"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29242048/

相关文章:

javascript - 访问控制允许来源 - 不工作

javascript - Google Maps v3 - 删除多边形上的顶点

javascript - 修改jquery $.get函数响应

javascript - 在 JavaScript 中添加多个 HTML 表单输入值

reactjs - 在 React 中渲染之前获取数据的最佳位置

reactjs - 如何更改 MuiInputBase-root 的宽度?

javascript - 我怎样才能正确地渲染这个组件?

jQuery:优化代码(标签中的背景)

javascript - 浏览器有时会添加 <tbody>

javascript - 复选框第一次不反射(reflect)其选中值