Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

selections not working if columns pulled from state? #418

Open
ElixirMike opened this issue Jun 2, 2023 · 1 comment
Open

selections not working if columns pulled from state? #418

ElixirMike opened this issue Jun 2, 2023 · 1 comment

Comments

@ElixirMike
Copy link

In my application, I need to dynamically create the columns and then have the pull the columns from the state. However, when I do this, the code to update the row state does not work. Below is a simplified version, showing the issue. If you run this code, when you select the checkbox, the state does not get updated correctly.

If, however, I change BaseTable and set the columns= the actual array, then the selection process works.

Code that does not work

/* eslint-disable */
import React, { useState,useEffect } from 'react';
import BaseTable, { Column } from 'react-base-table';
import 'react-base-table/styles.css';

const MultiSelectTable = () => {
  const [selectedRows, setSelectedRows] = useState([]);
  const [columns, setColumns] = useState([])


  useEffect(()=>{
    setColumns(
      [
        {
          key:"checkbox",
          title:"",
          width:50,
          selectedRowKeys:{selectedRows},
          cellRenderer:({ rowData }) => (
                <input
                  type="checkbox"
                  checked={selectedRows.includes(rowData.id)}
                  onChange={() => handleRowSelection({ rowData })}
                  />
            )}
          ,
        {key:"name", dataKey:"name", title:"Name", width:200},
        {key:"age", dataKey:"age", title:"Age", width:100}
        ]
    )
  },[])

  const handleRowSelection = ({ rowData }) => {
    const selectedRowKeys = [...selectedRows];
    const rowIndex = selectedRowKeys.indexOf(rowData.id);

    if (rowIndex !== -1) {
      selectedRowKeys.splice(rowIndex, 1);
    } else {
      selectedRowKeys.push(rowData.id);
    }

    setSelectedRows(selectedRowKeys);
    console.log(selectedRowKeys)
  };



  const data = [
    { id: 1, name: 'John Doe', age: 25 },
    { id: 2, name: 'Jane Smith', age: 30 },
    { id: 3, name: 'Bob Johnson', age: 35 },
    // Add more data as needed
  ];

  return (
    <BaseTable
      width={600}
      height={400}
      data={data}
      columns={columns}
      rowKey="id" 
    />
   
  );
};

export default MultiSelectTable;

Code that works:

/* eslint-disable */
import React, { useState,useEffect } from 'react';
import BaseTable, { Column } from 'react-base-table';
import 'react-base-table/styles.css';

const MultiSelectTable = () => {
  const [selectedRows, setSelectedRows] = useState([]);

  const handleRowSelection = ({ rowData }) => {
    const selectedRowKeys = [...selectedRows];
    const rowIndex = selectedRowKeys.indexOf(rowData.id);

    if (rowIndex !== -1) {
      selectedRowKeys.splice(rowIndex, 1);
    } else {
      selectedRowKeys.push(rowData.id);
    }

    setSelectedRows(selectedRowKeys);
    console.log(selectedRowKeys)
  };

  const columns=  [
    {
      key:"checkbox",
      title:"",
      width:50,
      selectedRowKeys:{selectedRows},
      cellRenderer:({ rowData }) => (
            <input
              type="checkbox"
              checked={selectedRows.includes(rowData.id)}
              onChange={() => handleRowSelection({ rowData })}
              />
        )}
      ,
    {key:"name", dataKey:"name", title:"Name", width:200},
    {key:"age", dataKey:"age", title:"Age", width:100}
    ]


  const data = [
    { id: 1, name: 'John Doe', age: 25 },
    { id: 2, name: 'Jane Smith', age: 30 },
    { id: 3, name: 'Bob Johnson', age: 35 },
    // Add more data as needed
  ];

  return (
    <BaseTable
      width={600}
      height={400}
      data={data}
      columns={columns}
      rowKey="id" 
    />
   
  );
};

export default MultiSelectTable;

How can I load the columsn dynamically into state but still have the selection of rows work?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants