reactjs MDB El componente Datatable(con casillas de verificación) no funciona cuando se re-render

Trato de hacer una tabla simple que puede seleccionar las filas de la tabla y eliminarlas al hacer clic en el botón eliminar.

Así que... uso el componente MDBDataTableV5.

Si no pongo la casilla de verificación en la tabla entonces esto está funcionando perfectamente (cuando datos de actualización de la tabla). Y Si establezco los datos de la tabla como estadísticamente cuando el primer tiempo de carga entonces esto está funcionando bien incluso puse la casilla de verificación en la tabla.

Pero en este caso, Si establezco los datos de la tabla como estado dinámicamente entonces esto no está funcionando. Recibo este error cuando re-render (cuando obtengo datos de los padres).

mdbreact.esm.js:1 Uncaught TypeError: Cannot read property 'checked' of undefined
at n.value .......

Aquí está mi código.

const headCells = [
    {
        label: 'id',
        field: 'user_id',
        width: 150,
        attributes: {
          'aria-controls': 'DataTable',
          'aria-label': 'id',
        },
    },
    {
        label: 'name',
        field: 'user_name',
        width: 200,
    },
    {
        label: 'email',
        field: 'user_email',
        width: 400,
    },
    {
        label: 'level',
        field: 'user_level',
        width: 100
    }
]

export default function WithCheckBoxes(props) {
    const [datatable, setDatatable] = React.useState({
        columns: headCells,
        rows: [],
    });

    useEffect(()=>{
        setDatatable({
            columns: headCells,
            rows: props.user_list
        })
    }, [props]);

  return (
    <>
       {

        }}
      />
    
  );
}

¿Qué pasa en mi código?

Uso "Con mesa de cheques" en este enlace. https://mdbootstrap.com/docs/react/tables/datatables/

Pregunta hecha hace 3 años, 4 meses, 29 días - Por codemasterx


2 Respuestas:

  • El error que estás experimentando se debe a que al re-renderizar el componente, el estado de las casillas de verificación se pierde y por lo tanto el sistema no puede acceder a la propiedad 'checked' de las casillas. Para solucionar este problema, necesitas mantener un estado separado para el estado de las casillas de verificación y sincronizarlo con el estado de la tabla.

    Aquí tienes una manera de hacerlo:

    jsx
    import React, { useState, useEffect } from 'react';
    import { MDBDataTableV5 } from 'mdbreact';
    
    const headCells = [
        {
            label: 'id',
            field: 'user_id',
            width: 150,
            attributes: {
              'aria-controls': 'DataTable',
              'aria-label': 'id',
            },
        },
        {
            label: 'name',
            field: 'user_name',
            width: 200,
        },
        {
            label: 'email',
            field: 'user_email',
            width: 400,
        },
        {
            label: 'level',
            field: 'user_level',
            width: 100
        }
    ]
    
    export default function WithCheckBoxes(props) {
        const [datatable, setDatatable] = useState({
            columns: headCells,
            rows: [],
        });
        const [selectedRows, setSelectedRows] = useState([]);
    
        useEffect(() => {
            setDatatable({
                columns: headCells,
                rows: props.user_list.map(row => ({
                    ...row,
                    checkbox:  toggleCheckbox(row.user_id)} checked={selectedRows.includes(row.user_id)} />
                })
            });
        }, [props, selectedRows]);
    
        const toggleCheckbox = (id) => {
            setSelectedRows(prev => prev.includes(id) ? prev.filter(item => item !== id) : [...prev, id]);
        }
    
        const handleDelete = () => {
            // Aquí puedes implementar la lógica para eliminar las filas seleccionadas
        }
    
        return (
            <>
                 toggleCheckbox(e)}
                    headCheckboxID='id'
                    data={datatable}
                    entries={5}
                    entriesOptions={[5, 10, 15]}
                    pagesAmount={4}
                />
                
            
        );
    }
    

    En esta versión del código, cada fila de la tabla incluye una casilla de verificación que está vinculada a un estado selectedRows que almacena los ids de las filas seleccionadas. El método toggleCheckbox se encarga de actualizar este estado cuando se cambia el estado de la casilla de verificación.

    Espero que esta solución te ayude a resolver el problema y a implementar la funcionalidad deseada en tu tabla con casillas de verificación. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 19, 2020 a las 02:43 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Problema:

    El error que recibes indica que estás intentando acceder a la propiedad checked de un valor indefinido. Esto sugiere que el componente MDBDataTableV5 no se está inicializando correctamente cuando los datos de la tabla se actualizan dinámicamente.

    Solución:

    Para resolver este problema, debes asegurarte de que el componente MDBDataTableV5 se vuelva a representar cuando los datos de la tabla cambien dinámicamente. Puedes hacer esto usando el ciclo de vida de React useEffect.

    Código actualizado:

    javascript
    import { useEffect, useState } from "react";
    import MDBDataTableV5 from "mdbreact/dist/mdbreact.js";
    
    const headCells = [
      {
        label: "id",
        field: "user_id",
        width: 150,
        attributes: {
          "aria-controls": "DataTable",
          "aria-label": "id",
        },
      },
      // ... Resto de las celdas
    ];
    
    export default function WithCheckBoxes(props) {
      const [datatable, setDatatable] = useState({
        columns: headCells,
        rows: [],
      });
    
      useEffect(() => {
        // Actualiza el estado de la tabla cuando los datos de props cambian
        setDatatable({
          columns: headCells,
          rows: props.user_list,
        });
      }, [props]);
    
      return (
        <>
           {}}
            headcheckboxid="id"
            hover
            pagesamount={4}
          >
            {/ Contenido de la tabla /}
          
        
      );
    }
    

    Explicación:

    El ciclo de vida de useEffect se utilizará para actualizar el estado de la tabla cuando los datos de props.user_list cambien. Esto asegurará que el componente MDBDataTableV5 se vuelva a representar con los nuevos datos, lo que evitará el error de propiedad indefinida.

    Respondida el Dec 19, 2020 a las 02:43 - por Gemini

    Votos positivos: 0 | Votos negativos: 0