Неопределенный идентификатор в ReactJS через Mui Datatable

#javascript #reactjs #datatable

#javascript #reactjs #datatable

Вопрос:

Я пытаюсь добиться добавления кнопки редактирования и удаления через MUI Datatable, она уже применяется, но всякий раз, когда я нажимал кнопку редактирования, URL-адрес указывает на неопределенный. Вот изображение и мой код. Спасибо за вашу помощь, действительно ценю это.

введите описание изображения здесь как вы можете видеть, там написано / client / edit / undefined, тогда как должен быть идентификатор

Код:

  import React, { Component } from "react";
    import { Link } from "react-router-dom";
    import axios from "axios";
    import MUIDataTable from "mui-datatables";
    
    const Client = (props) => (
      <>
        <Link to={"client/edit/"   props.client._id} className="btn btn-primary">
          Edit
        </Link>
        amp;nbsp;
        <a
          href="client"
          onClick={() => {
            props.deleteClient(props.client._id);
          }}
          className="btn btn-danger"
        >
          Delete
        </a>
      </>
    );
    
    export default class ClientsList extends Component {
      constructor(props) {
        super(props);
    
        this.deleteClient = this.deleteClient.bind(this);
    
        this.state = { clients: [] };
      }
    
      componentDidMount() {
        axios
          .get("http://localhost:5000/clients/")
          .then((response) => {
            this.setState({ clients: response.data });
          })
          .catch((error) => {
            console.log(error);
          });
      }
    
      deleteClient(id) {
        axios.delete("http://localhost:5000/clients/"   id).then((response) => {
          console.log(response.data);
        });
    
        this.setState({
          clients: this.state.clients.filter((el) => el._id !== id),
        });
      }
    
      clientList(currentclient) {
        return (
          <Client
            client={currentclient}
            deleteClient={this.deleteClient}
            key={currentclient[0]}
          />
        );
      }
    
      render() {
        const columns = [
          {
            name: "_id",
            options: {
              display: false,
            },
          },
          {
            name: "name",
            label: "Name",
            options: {
              filter: true,
              sort: true,
            },
          },
          {
            name: "address",
            label: "Address",
            options: {
              filter: true,
              sort: true,
            },
          },
          {
            name: "mobile",
            label: "Mobile",
            options: {
              filter: true,
              sort: true,
            },
          },
          {
            name: "email",
            label: "Email",
            options: {
              filter: true,
              sort: true,
            },
          },
          {
            name: "gender",
            label: "Gender",
            options: {
              filter: true,
              sort: true,
            },
          },
          {
            name: "birthday",
            label: "Birthday",
            options: {
              filter: true,
              sort: true,
            },
          },
          {
            name: "facebookPage",
            label: "Facebook Page",
            options: {
              filter: true,
              sort: true,
            },
          },
          {
            name: "facebookName",
            label: "Facebook Name",
            options: {
              filter: true,
              sort: true,
            },
          },
          {
            name: "existing",
            label: "Existing",
            options: {
              filter: true,
              sort: true,
            },
          },
          {
            name: "remarks",
            label: "Remarks",
            options: {
              filter: true,
              sort: true,
            },
          },
          {
            name: "Action",
            options: {
              customBodyRender: (value, tableMeta, updateValue) => {
                return <>{this.clientList(tableMeta.rowData)}</>;
              },
            },
          },
        ];
        const { clients } = this.state;
    
        return (
          <>
            <br />
            <br />
            <br />
            <div style={{ margin: "10px 15px", overflowX: "auto" }}>
              <Link to={"client/create/"} className="btn btn-primary pull-right">
                Add Client Data
              </Link>
              <br />
              <br />
              <br />
              <MUIDataTable data={clients} columns={columns} />
            </div>
          </>
        );
      }
    }
  

Комментарии:

1. Есть ли props.client. _id в клиентском компоненте в реквизитах?

2. Да, в клиентском компоненте есть props.client_id

3. @Lukas давайте пообщаемся в чате stackoverflow?

Ответ №1:

Все, данные таблицы транспонированы в массив, это мой код, если вы хотите иметь кнопку редактирования и удаления с использованием mui datatables.

 import React, { Component } from "react";
import { Link } from "react-router-dom";
import axios from "axios";
import MUIDataTable from "mui-datatables";

const Client = (props) => (
  <>
    {console.log("Client Props", props)}
    <Link to={"client/edit/"   props.client[0]} className="btn btn-primary">
      Edit
    </Link>
    amp;nbsp;
    <a
      href="client"
      onClick={() => {
        props.deleteClient(props.client[0]);
      }}
      className="btn btn-danger"
    >
      Delete
    </a>
  </>
);

export default class ClientsList extends Component {
  constructor(props) {
    super(props);

    this.deleteClient = this.deleteClient.bind(this);

    this.state = { clients: [] };
  }

  componentDidMount() {
    axios
      .get("http://localhost:5000/clients/")
      .then((response) => {
        this.setState({ clients: response.data });
      })
      .catch((error) => {
        console.log(error);
      });
  }

  deleteClient(id) {
    axios.delete("http://localhost:5000/clients/"   id).then((response) => {
      console.log(response.data);
    });

    this.setState({
      clients: this.state.clients.filter((el) => el._id !== id),
    });
  }

  clientList(currentclient) {
    return (
      <Client
        client={currentclient}
        deleteClient={this.deleteClient}
        key={currentclient[0]}
      />
    );
  }

  render() {
    const columns = [
      {
        name: "_id",
        options: {
          display: false,
        },
      },
      {
        name: "name",
        label: "Name",
        options: {
          filter: true,
          sort: true,
        },
      },
      {
        name: "address",
        label: "Address",
        options: {
          filter: true,
          sort: true,
        },
      },
      {
        name: "mobile",
        label: "Mobile",
        options: {
          filter: true,
          sort: true,
        },
      },
      {
        name: "email",
        label: "Email",
        options: {
          filter: true,
          sort: true,
        },
      },
      {
        name: "gender",
        label: "Gender",
        options: {
          filter: true,
          sort: true,
        },
      },
      {
        name: "birthday",
        label: "Birthday",
        options: {
          filter: true,
          sort: true,
        },
      },
      {
        name: "facebookPage",
        label: "Facebook Page",
        options: {
          filter: true,
          sort: true,
        },
      },
      {
        name: "facebookName",
        label: "Facebook Name",
        options: {
          filter: true,
          sort: true,
        },
      },
      {
        name: "existing",
        label: "Existing",
        options: {
          filter: true,
          sort: true,
        },
      },
      {
        name: "remarks",
        label: "Remarks",
        options: {
          filter: true,
          sort: true,
        },
      },
      {
        name: "Action",
        options: {
          customBodyRender: (value, tableMeta, updateValue) => {
            return <>{this.clientList(tableMeta.rowData)}</>;
          },
        },
      },
    ];
    const { clients } = this.state;

    return (
      <>
        <br />
        <br />
        <br />
        <div style={{ margin: "10px 15px", overflowX: "auto" }}>
          <Link to={"client/create/"} className="btn btn-primary pull-right">
            Add Client Data
          </Link>
          <br />
          <br />
          <br />
          <MUIDataTable data={clients} columns={columns} />
        </div>
      </>
    );
  }
}