Добавление значений из входных данных в виде новой строки таблицы в ReactJS - PullRequest
0 голосов
/ 04 февраля 2020

Я бы хотел получить значения из полей ввода и поместить их в таблицу под ним.

  • crudAdd. js - определяет состояние, обработчики событий, отображает саму форму
  • crudTable. js - отображает предопределенные строки, определенные в mainCrud. js, отображает саму таблицу

Попытка выяснить, как подключить crudAdd. js и crudTable. js, для crudAdd. js в конечном итоге pu sh значения из входов в таблицу.

Ссылка на CodeSandbox (форма находится под кампаниями, dev и вкладки новостей).

MainCrud. js

import React, { useState } from "react";

import CrudIntro from "../crud/crudIntro/crudIntro";
import CrudAdd from "../crud/crudAdd/crudAdd";
import CrudTable from "../crud/crudTable/crudTable";

const MainCrud = props => {
  // Project Data
  const projectData = [
    {
      id: 1,
      name: "Skid Steer Loaders",
      description:
        "To advertise the skid steer loaders at 0% financing for 60 months.",
      date: "February 1, 2022"
    },
    {
      id: 2,
      name: "Work Gloves",
      description: "To advertise the work gloves at $15.",
      date: "February 15, 2022"
    },
    {
      id: 3,
      name: "Telehandlers",
      description: "To advertise telehandlers at 0% financing for 24 months.",
      date: "March 15, 2022"
    }
  ];

  const [projects, setProject] = useState(projectData);

  // Add Project
  const addProject = project => {
    project.id = projectData.length + 1;
    setProject([...projects, project]);
  };

  return (
    <div>
      <section id="add">
        <CrudIntro title={props.title} subTitle={props.subTitle} />
        <CrudAdd addProject={addProject} />
      </section>
      <section id="main">
        <CrudTable projectData={projects} />
      </section>
    </div>
  );
};

export default MainCrud;

CrudAdd. js

import React, { Component } from "react";

import "../crudAdd/crud-add.scss";
import "../../button.scss";

class CrudAdd extends Component {
  state = {
    name: "",
    description: "",
    date: "",
    items: []
  };

  handleInputChange = e => {
    let input = e.target;
    let name = e.target.name;
    let value = input.value;

    this.setState({
      [name]: value
    });
    // console.log(e.target.value);
  };

  handleFormSubmit = e => {
    e.preventDefault();

    let items = [...this.state.items];

    items.push({
      name: this.state.name,
      description: this.state.description,
      date: this.state.date
    });

    this.setState({
      // Clear values
      name: "",
      description: "",
      date: ""
    });

    console.log(this.state.name);
    console.log(this.state.description);
    console.log(this.state.date);
  };

  render() {
    return (
      <div>
        <form onSubmit={this.handleFormSubmit}>
          <input
            name="name"
            type="name"
            placeholder="Name..."
            id="name"
            value={this.state.name}
            onChange={e => this.setState({ name: e.target.value })}
          />
          <input
            name="description"
            type="description"
            placeholder="Description..."
            id="description"
            value={this.state.description}
            onChange={e => this.setState({ description: e.target.value })}
          />
          <input
            name="date"
            type="name"
            placeholder="Date..."
            id="date"
            value={this.state.date}
            onChange={e => this.setState({ date: e.target.value })}
          />
          <button type="submit" className="btn btn-primary">
            Add Project
          </button>
        </form>
      </div>
    );
  }
}

export default CrudAdd;

CrudTable. js

import React, { Component } from "react";

import "../crudTable/crud-table.scss";

class CrudTable extends Component {
  render() {
    const props = this.props;
    return (
      <div>
        <div class="table-responsive">
          <table class="table">
            <thead>
              <tr>
                <th scope="col">Project Name</th>
                <th scope="col">Project Description</th>
                <th scope="col">Date</th>
                <th scope="col">&nbsp;</th>
              </tr>
            </thead>
            <tbody>
              {props.projectData.length > 0 ? (
                props.projectData.map(project => (
                  <tr key={project.id}>
                    <td>{project.name}</td>
                    <td>{project.description}</td>
                    <td>{project.date}</td>
                    <td>
                      <button className="btn btn-warning">Edit</button>
                      <button className="btn btn-danger">Delete</button>
                    </td>
                  </tr>
                ))
              ) : (
                <tr>
                  <td>No projects found. Please add a project.</td>
                </tr>
              )}
            </tbody>
          </table>
        </div>
      </div>
    );
  }
}

export default CrudTable;

1 Ответ

1 голос
/ 04 февраля 2020

Вот код, который сработал для меня в вашей песочнице:

  handleFormSubmit = e => {
    e.preventDefault();

    this.props.addProject({
      name: this.state.name,
      description: this.state.description,
      date: this.state.date
    });

    this.setState({
      name: "",
      description: "",
      date: ""
    });
  };

Вот объяснение:

То, о чем вы говорите, это одноуровневое взаимодействие между компонентами. Есть ряд полезных статей и подходов . По сути, vanilla React хочет, чтобы вы использовали реквизиты в качестве входных данных для ваших компонентов и обрабатывали выходные данные с помощью функций, которые передаются как реквизиты.

Один из способов сделать это - определить данные компонента table в его parent, и напишите метод в родительском компоненте для изменения этих данных. Передайте функцию дочернему компоненту add и передайте данные компоненту table. Затем, когда add вызывает функцию, она изменяет данные в родительском элементе. Изменяемые данные состояния родителя приведут к повторному рендерингу ребенка с новыми данными!

...