Search code examples
javascriptreactjsdatatablereact-hooksreact-data-table-component

How to update react datatable ( react-data-table-component library) based on button click


I am using react-data-table-component library to get data from API and show it in a datatable. I have a custom Date filter option where I can update the data array for datatable. I need to refresh the datatable part alone upon updating the data.

 <DataTable key={number} columns={columns} data={filteredItems} title ='SandBox ' subHeader
        subHeaderComponent={subHeaderComponentMemo} pagination
        paginationResetDefaultPage={resetPaginationToggle} nation ltr   fixedHeader  highlightOnHover responsive striped noDataComponent={"No records"}/>

Here filteredItems value I can update on button click but I need to show the updated data on datatable. I cant refresh the page as it will fetch new data from API.


    useEffect(() => {

    fetch( API_LINK)
    .then(res => res.json())
    .then(
      (result) => {
        setIsLoaded(true);
        console.log(result)
        setItems(result); 


      },
      // Note: it's important to handle errors here
      // instead of a catch() block so that we don't swallow
      // exceptions from actual bugs in components.
      (error) => {
        setIsLoaded(true);
        setError(error);
      },
    )
    } ,[currentLimitVal])

if (error) {
  return <div>Error: {error.message}</div>;
} else if (!isLoaded) {
  return <div>Loading...</div>;
} else {
// console.log(items)

if ( items.length > 0 )
{

        var te ='';
        var no_space ='';
        function myFunction(item) 
        {
            var letters = /^[A-Za-z]+$/

            if (item.indexOf(' ') <= 0 && item.indexOf(':') <= 0 && !/\d/.test(item))
            {
                te = te+'item.'+item+' && item.'+item+'.toString().toLowerCase().includes(filterText.toLowerCase()) || ';
                var sel ='row => row.'+item;
                // console.log(sel);
                columns.push(
                    {
                    name : item,
                selector:eval(sel),
                sortable: true 
                    }
                );
            }

 
        }

        // console.log(columns);
        Object.keys(items[0]).forEach(myFunction);
        columnsList = columns.length > 0
            && columns.map((item, i) => {
                if (  item.name.toLowerCase().includes('date') )
            return (
                <option key={i} value={item.name}>{item.name}</option>
            )
        }, this);

      
        te = te.slice(0, -3);
        filteredItems = items.filter(
            item => eval(te),
        );
     
        
  
}

Above is code to get data and add filter conditions.

  
        if (typeof(fromDate) == 'undefined' || typeof(toDate) == 'undefined'  )
        {
            message.error('Choose the Range Please ! ');
        }
        else if (typeof(colmunChoice) == 'undefined')
        {
            message.error('Choose the Date Column  Please ! ');
         }
        else
        {
        var Fdate = new Date(fromDate); 
        var Tdate = new Date(toDate); 
        console.log( colmunChoice);
        const format = ['DD MM YYYY', 'MM DD YYYY', 'YYYY MM DD', 'YYYY DD MM', 'MMM DD YYYY',
        'DD MMM YYYY', 'YYYY MMM DD', 'YYYY DD MMM','MM DD YY']
        const toFormat = 'YYYY MM DD';

        filtered = items.filter(a => {
            if(a[colmunChoice])
            {
            console.log( a[colmunChoice]);
            // var date = new Date(a[colmunChoice]);
            var date1  = a[colmunChoice].replace(/ +/g, '-')        
            var date =  moment(date1, format).format(toFormat);    
            var Fdate =  moment(fromDate, format).format(toFormat);    
            var Tdate =  moment(toDate, format).format(toFormat);    
            console.log( date);
             return (date >= Fdate && date <= Tdate);
            }
          });

          filteredItems =  filtered;
          console.log(filteredItems);
          
        //  I need to update data with filteredItems here 

        }


      } 

Handling a date range search here. I need to push the result of the search to Data table.


Solution

  • The prop filteredItems is a data already fetched, so you shouldn't need to refresh the api.

      const onRowDelete = row => () => {
        const rows = filteredItems.filter(item => item.id !== row.id)
        setFilteredItems(rows)
      }
    

    Assuming you want to delete a row, and filteredItems a state, you can use the above approach to refresh the table. By design, DataTable should refresh the data for you when the data prop changes.