首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用?检查固定数据表中的所有框?

使用?检查固定数据表中的所有框?
EN

Stack Overflow用户
提问于 2015-03-15 23:00:37
回答 2查看 5.7K关注 0票数 0

我在函数checkall中使用jquery来选中/取消选中固定数据表特定列中的所有复选框。我想知道这是否是最好的方法,还是有一种“反应方式”这样做?

代码语言:javascript
复制
'use strict';

var React = require('react/addons');
var Table = require('fixed-data-table').Table;
var Column = require('fixed-data-table').Column;

// Table data as a list of array.
var rows = [
  ['a1', 'b1', 'c1'],
  ['a2', 'b3', 'c2'],
  ['a3', 'b3', 'c3'],
];

function checkBox(data){
  return (
    <input type="checkbox" value={data} className="kill-checkbox" />
  );
}

function rowGetter(rowIndex) {
  return rows[rowIndex];
}

// Fixed data tables (Facebook) requirement:http://facebook.github.io/fixed-data-table/
require('../../styles/fixed-data-table.css');
var TableTester = React.createClass({
  render: function () {
    return (
      <div>
        <label>Check All</label>&nbsp;<input type="checkbox" id="check-all" onClick={this.checkall} />
        <Table rowsCount={rows.length} width={1000} height={300} headerHeight={50} rowHeight={50} rowGetter={rowGetter}>
          <Column label="Col 1" width={500} dataKey={0} />                                                            
          <Column label="Col 2" width={500} dataKey={1} cellRenderer={checkBox} align="center" />
        </Table>
      </div>
    );
  },

  checkall:function(){
    var checked = $("#check-all").is(':checked');    
    $(".kill-checkbox").each(function(){
      $(this).prop('checked', checked);
    });
  },  

});

module.exports = TableTester;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-16 10:36:21

这取决于应用程序中选中或未选中的复选框意味着什么,以及何时需要这些信息。这样做可以有效地将状态放入DOM中,当您稍后需要该信息时,您将不得不返回到DOM以获得该状态。

另一种方法是拥有一些数据,这些数据表示或可以用于导出每个复选框的复选性,并使用这些数据来设置其checked支柱。然后,您需要实现适当的事件处理程序,以便根据用户的操作适当地更新数据。

例如,如果您正在显示具有关联值的复选框网格,则可能有一个selectedValues列表。为了方便创建示例代码,我们会将它放在组件的状态中,但这可能是作为一个道具,或者是生活在商店中,或者.

代码语言:javascript
复制
getInitialState() {
  return {
    selectedValues: []
  }
},

然后,可以使用所选值的列表导出每个复选框的checked状态:

代码语言:javascript
复制
renderCheckbox(data) {
  var checked = this.state.selectedvalues.indexOf(data) != -1
  return <input type="checkbox" value={data} checked={checked}/>
}

in render(): cellRenderer={this.renderCheckbox}

但是现在您的复选框是只读的,因为您还没有实现对其上的事件进行更改selectedValues,所以让我们这样做:

代码语言:javascript
复制
_onCheckboxChange(e) {
  var {selectedValues} = this.state
  var {checked, value} = e.target
  if (checked) {
    selectedValues.push(value)
  }
  else {
    selectedValues.splice(selectedValues.indexOf(value), 1)
  }
  this.setState({selectedValues})
},

renderCheckbox(data) {
  var checked = this.state.selectedValues.indexOf(data) != -1
  return <input type="checkbox" value={data} checked={checked} onChange={this._onCheckboxChange}/>
}

现在,要实现类似select/取消选择所有切换的操作,您需要实现一个事件处理程序,该处理程序进行适当的数据更改,并导致组件重新呈现:

代码语言:javascript
复制
_onCheckAll(e) {
  var selectedValues
  if (e.target.checked) {
    // Set all the available values as selected - using the rows variable
    // from your question to put something meaningful here.
    selectedValues = rows.reduce((all, row) => all.concat(row))
  }
  else {
    selectedValues = []
  }
  this.setState({selectedValues})
}

我认为这意味着"React“是根据数据来建模UI,而不是您想要看到的最终结果,在这种情况下是”选择了我显示的值中的哪个?“还是“选中哪个复选框?”

票数 1
EN

Stack Overflow用户

发布于 2015-03-17 23:46:19

正如承诺的那样,我有一个基于固定数据表问题中提供的解决方案/解释的工作示例:https://github.com/facebook/fixed-data-table/issues/70

代码语言:javascript
复制
'use strict';

var React = require('react/addons');
var Table = require('fixed-data-table').Table;
var Column = require('fixed-data-table').Column;

var dataKey = 1; // key to store in selected in the sets below it represents the values [b1|b2|b3] as in index 1 

// Fixed data tables (Facebook) requirement:http://facebook.github.io/fixed-data-table/
require('../../styles/fixed-data-table.css');
var TableTester = React.createClass({

  getInitialState: function(){
    return ({
      selected:[],
      rows: [
        ['a1', 'b1', 'c1'],
        ['a2', 'b2', 'c2'],
        ['a3', 'b3', 'c3'],
      ]      
    })
  },

  render: function () {
    var data = this.state.rows;

    return (
      <div>
        <label>Check All</label>&nbsp;<input type="checkbox" onClick={this._toggleAll} />
        <Table rowsCount={data.length} rowGetter={this._rowGetter} onRowClick={this._onRowSelect} width={1000} height={300} headerHeight={50} rowHeight={50}>
          <Column label="Col 1" width={500} dataKey={0} />                                                            
          <Column label="Col 2" width={500} dataKey={dataKey} align="center" 
            cellRenderer={(value) => <input type="checkbox" value={value} checked={this.state.selected.indexOf(value) >= 0} onChange={() => {}} />}/>
        </Table>
      </div>
    );
  },

  _toggleAll:function(e){
    var newSet = [];
    if (e.target.checked) {
      this.state.rows.forEach(function(columns){
        newSet.push( columns[1] );
      });
    }
    this.setState({
      selected: newSet
    });

  },

  _onRowSelect: function(e, index) {
    var value = this.state.rows[index][dataKey];
    var newSet = this.state.selected;
    if ( newSet.indexOf(value) < 0 ) { // does not exist in list
      newSet.push(value);
    } else {
      newSet.splice(newSet.indexOf(value), 1);
    }  
    this.setState({
      selected: newSet
    });

  },  

  _rowGetter: function(rowIndex){
      return this.state.rows[rowIndex];
  }

});

module.exports = TableTester;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29067247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档