首页 > 解决方案 > ReactJS - 在特定表行上添加值

问题描述

我创建了一个 react js 应用程序并有一个表格,当我单击它时,它包含一个按钮“添加可用日期”,其中显示天数的复选框,当我选择一天时,它会自动放入表格中,但是不会更新特定行,更改应用于所有行。我想要发生的事情是,例如,我在第一行单击添加可用日期,然后必须更新第一行数据而不是第二行和第三行

这是我的代码:

import React from 'react';
import { Table, Button } from 'react-bootstrap';

const personData = [
    { id: 1, firstName: 'test1', lastName: 'test', day: [] },
    { id: 2, firstName: 'Jane', lastName: 'Doe', day: [] },
    { id: 3, firstName: 'John', lastName: 'Doe', day: [] },
    { id: 4, firstName: 'Clint', lastName: 'test', day: [] }
]

export default class App extends React.Component {
    constructor() {
        super();
        this.state = {
            day: [],
            isSelectDay: false,
            person: personData
        }
    }
    

    handleSelectDay = (event) => {
        let dayArr = [...this.state.day]
        const value = event.target.value
        const index = dayArr.findIndex(day => day === value);
        if (index > -1) {
            dayArr = [...dayArr.slice(0, index), ...dayArr.slice(index + 1)]
        } else {
            dayArr.push(value)
        }
        this.setState({ day: dayArr });
    }

    handleAddDay = () => {
        this.setState({ isSelectDay: true })
    }

    render() {
        const { isSelectDay, day } = this.state
        


        const dayOptions = ["Monday, ", "Tuesday, ", "Wednesday", "Thursday, ", "Friday"].map((cur, ind) => {
                return (
                    <div key={ind} className="checks" >
                        <label>
                            <input type="checkbox" name={cur} value={cur}
                                onChange={this.handleSelectDay} />{cur}
                        </label>
                    </div>
                )
            })

        return (
            <>
                <Table striped bordered hover>
                    <thead>
                        <tr>
                            <th>First Name</th>
                            <th>Last Name</th>
                            <th>Days Available</th>
                        </tr>
                    </thead>
                    <tbody>
                        {this.state.person.length > 0 ? (
                            this.state.person.map((person) => (
                                <tr key={person.id}>
                                    <td>{person.firstName}</td>
                                    <td>{person.lastName}</td>
                                    <td>{day}<Button variant="success" onClick={this.handleAddDay}>Add Available Day</Button></td>
                                </tr>
                            ))
                        ) : (
                                <tr>
                                    <td colSpan={3}>No Data</td>
                                </tr>
                            )}
                    </tbody>

                </Table>
                <div style={{ display: isSelectDay ? 'block' : 'none' }}>
                    {dayOptions}
                </div>
            </>
        )
    }
}

标签: reactjs

解决方案


这是你追求的东西吗?

演示

完整代码

我更改isSelectDay为,personSelected因此当您单击“添加可用日期”时,它会从 切换到正确的人员对象personData。然后我用它来更新people状态中的对象(的副本)以从数组personData中添加/删除天数。day然后使用该day数组输出天数。

import React from "react";
import { Table, Button } from "react-bootstrap";

var personData = [
  { id: 1, firstName: "test1", lastName: "test", day: [] },
  { id: 2, firstName: "Jane", lastName: "Doe", day: [] },
  { id: 3, firstName: "John", lastName: "Doe", day: [] },
  { id: 4, firstName: "Clint", lastName: "test", day: [] }
];

export default class App extends React.Component {
  constructor() {
    super();
    this.state = {
      personSelected: null,
      people: personData
    };
  }

  handleSelectDay = (event) => {
    let dayArr = [...this.state.personSelected.day];
    const value = event.target.value;
    const index = dayArr.findIndex((day) => day === value);
    if (index > -1) {
      dayArr = [...dayArr.slice(0, index), ...dayArr.slice(index + 1)];
    } else {
      dayArr.push(value);
    }

    let newPeople = this.state.people;
    newPeople.find((x) => x === this.state.personSelected).day = dayArr;

    this.setState({ people: newPeople });
  };

  handleAddDay = (person) => {
    this.setState({ personSelected: person });
    document
      .querySelectorAll("input[type=checkbox]")
      .forEach((el) => (el.checked = false));
  };

  render() {
    const { personSelected } = this.state;

    const dayOptions = [
      "Monday, ",
      "Tuesday, ",
      "Wednesday",
      "Thursday, ",
      "Friday"
    ].map((cur, ind) => {
      return (
        <div key={ind} className="checks">
          <label>
            <input
              type="checkbox"
              name={cur}
              value={cur}
              onChange={this.handleSelectDay}
            />
            {cur}
          </label>
        </div>
      );
    });

    return (
      <>
        <Table striped bordered hover>
          <thead>
            <tr>
              <th>First Name</th>
              <th>Last Name</th>
              <th>Days Available</th>
            </tr>
          </thead>
          <tbody>
            {this.state.people.length > 0 ? (
              this.state.people.map((person) => (
                <tr key={person.id}>
                  <td>{person.firstName}</td>
                  <td>{person.lastName}</td>
                  <td>
                    {person.day}
                    <Button
                      variant="success"
                      onClick={() => this.handleAddDay(person)}
                    >
                      Add Available Day
                    </Button>
                  </td>
                </tr>
              ))
            ) : (
              <tr>
                <td colSpan={3}>No Data</td>
              </tr>
            )}
          </tbody>
        </Table>
        {personSelected !== null && (
          <div style={{ display: "block" }}>{dayOptions}</div>
        )}
      </>
    );
  }
}

推荐阅读