Select row on click react-table

后端 未结 7 899
广开言路
广开言路 2020-12-08 06:29

I am trying to find the best table to use with my react apps, and for now, the react-table offers everything I need (pagination, server-side control, filtering, sorting, foo

相关标签:
7条回答
  • 2020-12-08 06:48

    Multiple rows with checkboxes and select all using useState() hooks. Requires minor implementation to adjust to own project.

        const data;
        const [ allToggled, setAllToggled ] = useState(false);
        const [ toggled, setToggled ] = useState(Array.from(new Array(data.length), () => false));
        const [ selected, setSelected ] = useState([]);
    
        const handleToggleAll = allToggled => {
            let selectAll = !allToggled;
            setAllToggled(selectAll);
            let toggledCopy = [];
            let selectedCopy = [];
            data.forEach(function (e, index) {
                toggledCopy.push(selectAll);
                if(selectAll) {
                    selectedCopy.push(index);
                }
            });
            setToggled(toggledCopy);
            setSelected(selectedCopy);
        };
    
        const handleToggle = index => {
            let toggledCopy = [...toggled];
            toggledCopy[index] = !toggledCopy[index];
            setToggled(toggledCopy);
            if( toggledCopy[index] === false ){
                setAllToggled(false);
            }
            else if (allToggled) {
                setAllToggled(false);
            }
        };
    
    ....
    
    
                    Header: state => (
                        <input
                            type="checkbox"
                            checked={allToggled}
                            onChange={() => handleToggleAll(allToggled)}
                        />
                    ),
                    Cell: row => (
                        <input
                            type="checkbox"
                            checked={toggled[row.index]}
                            onChange={() => handleToggle(row.index)}
                        />
                    ),
    
    ....
    
    <ReactTable
    
    ...
                        getTrProps={(state, rowInfo, column, instance) => {
                            if (rowInfo && rowInfo.row) {
                                return {
                                    onClick: (e, handleOriginal) => {
                                        let present = selected.indexOf(rowInfo.index);
                                        let selectedCopy = selected;
    
                                        if (present === -1){
                                            selected.push(rowInfo.index);
                                            setSelected(selected);
                                        }
    
                                        if (present > -1){
                                            selectedCopy.splice(present, 1);
                                            setSelected(selectedCopy);
                                        }
    
                                        handleToggle(rowInfo.index);
                                    },
                                    style: {
                                        background: selected.indexOf(rowInfo.index)  > -1 ? '#00afec' : 'white',
                                        color: selected.indexOf(rowInfo.index) > -1 ? 'white' : 'black'
                                    },
                                }
                            }
                            else {
                                return {}
                            }
                        }}
    />
    
    0 讨论(0)
  • 2020-12-08 06:49

    Another mechanism for dynamic styling is to define it in the JSX for your component. For example, the following could be used to selectively style the current step in the React tic-tac-toe tutorial (one of the suggested extra credit enhancements:

      return (
        <li key={move}>
          <button style={{fontWeight:(move === this.state.stepNumber ? 'bold' : '')}} onClick={() => this.jumpTo(move)}>{desc}</button>
        </li>
      );
    

    Granted, a cleaner approach would be to add/remove a 'selected' CSS class but this direct approach might be helpful in some cases.

    0 讨论(0)
  • 2020-12-08 06:58

    I am not familiar with, react-table, so I do not know it has direct support for selecting and deselecting (it would be nice if it had).

    If it does not, with the piece of code you already have you can install the onCLick handler. Now instead of trying to attach style directly to row, you can modify state, by for instance adding selected: true to row data. That would trigger rerender. Now you only have to override how are rows with selected === true rendered. Something along lines of:

    // Any Tr element will be green if its (row.age > 20) 
    <ReactTable
      getTrProps={(state, rowInfo, column) => {
        return {
          style: {
            background: rowInfo.row.selected ? 'green' : 'red'
          }
        }
      }}
    />
    
    0 讨论(0)
  • 2020-12-08 07:00

    I found the solution after a few tries, I hope this can help you. Add the following to your <ReactTable> component:

    getTrProps={(state, rowInfo) => {
      if (rowInfo && rowInfo.row) {
        return {
          onClick: (e) => {
            this.setState({
              selected: rowInfo.index
            })
          },
          style: {
            background: rowInfo.index === this.state.selected ? '#00afec' : 'white',
            color: rowInfo.index === this.state.selected ? 'white' : 'black'
          }
        }
      }else{
        return {}
      }
    }
    

    In your state don't forget to add a null selected value, like:

    state = { selected: null }
    
    0 讨论(0)
  • 2020-12-08 07:05

    if u want to have multiple selection on select row..

    import React from 'react';
    import ReactTable from 'react-table';
    import 'react-table/react-table.css';
    import { ReactTableDefaults } from 'react-table';
    import matchSorter from 'match-sorter';
    
    
    class ThreatReportTable extends React.Component{
    
    constructor(props){
      super(props);
    
      this.state = {
        selected: [],
        row: []
      }
    }
    render(){
    
      const columns = this.props.label;
    
      const data = this.props.data;
    
      Object.assign(ReactTableDefaults, {
        defaultPageSize: 10,
        pageText: false,
        previousText: '<',
        nextText: '>',
        showPageJump: false,
        showPagination: true,
        defaultSortMethod: (a, b, desc) => {
        return b - a;
      },
    
    
      })
    
        return(
        <ReactTable className='threatReportTable'
            data= {data}
            columns={columns}
            getTrProps={(state, rowInfo, column) => {
    
    
            return {
              onClick: (e) => {
    
    
                var a = this.state.selected.indexOf(rowInfo.index);
    
    
                if (a == -1) {
                  // this.setState({selected: array.concat(this.state.selected, [rowInfo.index])});
                  this.setState({selected: [...this.state.selected, rowInfo.index]});
                  // Pass props to the React component
    
                }
    
                var array = this.state.selected;
    
                if(a != -1){
                  array.splice(a, 1);
                  this.setState({selected: array});
    
    
                }
              },
              // #393740 - Lighter, selected row
              // #302f36 - Darker, not selected row
              style: {background: this.state.selected.indexOf(rowInfo.index) != -1 ? '#393740': '#302f36'},
    
    
            }
    
    
            }}
            noDataText = "No available threats"
            />
    
        )
    }
    }
    
    
      export default ThreatReportTable;
    
    0 讨论(0)
  • 2020-12-08 07:10

    There is a HOC included for React-Table that allows for selection, even when filtering and paginating the table, the setup is slightly more advanced than the basic table so read through the info in the link below first.




    After importing the HOC you can then use it like this with the necessary methods:

    /**
    * Toggle a single checkbox for select table
    */
    toggleSelection(key: number, shift: string, row: string) {
        // start off with the existing state
        let selection = [...this.state.selection];
        const keyIndex = selection.indexOf(key);
    
        // check to see if the key exists
        if (keyIndex >= 0) {
            // it does exist so we will remove it using destructing
            selection = [
                ...selection.slice(0, keyIndex),
                ...selection.slice(keyIndex + 1)
            ];
        } else {
            // it does not exist so add it
            selection.push(key);
        }
        // update the state
        this.setState({ selection });
    }
    
    /**
    * Toggle all checkboxes for select table
    */
    toggleAll() {
        const selectAll = !this.state.selectAll;
        const selection = [];
    
        if (selectAll) {
            // we need to get at the internals of ReactTable
            const wrappedInstance = this.checkboxTable.getWrappedInstance();
            // the 'sortedData' property contains the currently accessible records based on the filter and sort
            const currentRecords = wrappedInstance.getResolvedState().sortedData;
            // we just push all the IDs onto the selection array
            currentRecords.forEach(item => {
                selection.push(item._original._id);
            });
        }
        this.setState({ selectAll, selection });
    }
    
    /**
    * Whether or not a row is selected for select table
    */
    isSelected(key: number) {
        return this.state.selection.includes(key);
    }
    
    <CheckboxTable
        ref={r => (this.checkboxTable = r)}
        toggleSelection={this.toggleSelection}
        selectAll={this.state.selectAll}
        toggleAll={this.toggleAll}
        selectType="checkbox"
        isSelected={this.isSelected}
        data={data}
        columns={columns}
    />
    

    See here for more information:
    https://github.com/tannerlinsley/react-table/tree/v6#selecttable

    Here is a working example:
    https://codesandbox.io/s/react-table-select-j9jvw

    0 讨论(0)
提交回复
热议问题