添加第二列的新行时,第一行是 react.js 中的行跨度

When add new row of 2nd column , 1st row is row span in react.js

当点击第 2 列的添加按钮时,想要使第 1 列成为 rowspan 而当点击第 4 列的添加按钮时,想要 rowspan 第 1 和第 2 列。请有人可以帮助我.. 我尝试了 2 天,但我不知道我需要哪里..我第一次使用 reactjs

当前结果:

预期结果:

addNewRow = (e) => {
        this.setState((prevState) => ({
            taskList: [...prevState.taskList, { index: Math.random(), softwareTable: "", task: "", taskNotes: "", taskStatus: "" }],
        }));
    }

return (
        props.taskList.map((val, idx) => {
            let softwareTable = `softwareTable-${idx}`, task = `task-${idx}`, taskNotes = `taskNotes-${idx}`, taskStatus = `taskStatus-${idx}`
            return (
                <tr key={val.index}>
                    <td>
                        <textarea name="softwareTable" data-id={idx} id={softwareTable} className="form-control " />
                        <button onClick={()=>props.add()} type="button" className="btn btn-primary text-center">+</button>
                        <button className="btn btn-danger" onClick={(() => props.delete(val))} >-</button>
                    </td>
                    <td>
                        <textarea name="task" id={task} data-id={idx} className="form-control " />
                        <button onClick={()=>props.add()} type="button" className="btn btn-primary text-center">+</button>
                        <button className="btn btn-danger" onClick={(() => props.delete(val))} >-</button>
                    </td>
                    <td>
                        <textarea name="taskNotes" id={taskNotes} data-id={idx} className="form-control"></textarea>
                        <button onClick={()=>props.add()} type="button" className="btn btn-primary text-center">+</button>
                        <button className="btn btn-danger" onClick={(() => props.delete(val))} >-</button>
                    </td>
                    <td>
                        <select name="taskStatus" id={taskStatus} data-id={idx} className="form-control" >
                            <option value="pending">Pending</option>
                            <option value="In Progress">In progress</option>
                        </select>
                    </td>

                </tr >
            )
        })
    )

render(){
return (

<tbody>
                                        <TaskList add={this.addNewRow} delete={this.clickOnDelete.bind(this)} taskList={taskList} />
                                        </tbody>
)
}

你这里显然有一个数据层次结构(项目 -> 任务 -> 笔记)。

这是如何在 table 中呈现它的基本思路。

将你的+/-按钮放入单元格中,点击insert/delete相应的对象,然后重新渲染组件。 祝你好运:)

const tableData = {
  projects: [
    {
      name: 'Project A',
      tasks: [
        {
          name: 'Task A1',
          notes: ['Note A1.1', 'Note A1.2']
        },
        {
          name: 'Task A2',
          notes: ['Note A2.1', 'Note A2.2', 'Note A2.3']
        },
        {
          name: 'Task A3',
          notes: ['Note A3.1']
        },
      ]
    },
    {
      name: 'Project B',
      tasks: [
        {
          name: 'Task B1',
          notes: ['Note B1.1']
        }
      ]
    }
  ]
}

const mapTask = task => {
    const notes = task.notes.map((note, index) => ({name: note, firstInTask: index === 0 ? task : null}));
  return {...task, notes};
}

const mapProject = project => {
    const tasks = project.tasks.map(mapTask);
  const projectNotes = tasks.reduce((all, task) => [...all, ...task.notes], []);
  const notes = projectNotes.map((note, index) => ({...note, firstInProject: index === 0 ? {...project, count: projectNotes.length} : null}));
  return {...project, tasks, notes};
}

const mapData = data => {
  const projects = data.projects.map(mapProject);
    const notes = projects.reduce((all, project) => [...all, ...project.notes], []);
  return {...data, projects, notes};
};

const Table = ({data}) => {
    const mappedData = mapData(data);
  console.log('MD: ', mappedData);
  
    return (
    <table cellSpacing="10" cellPadding="5">
     <tbody>
      {mappedData.notes.map(note => (
        <tr key={note.name}>
        {note.firstInProject && 
            <td rowSpan={note.firstInProject.count}>
            <span>{note.firstInProject.name}</span>
          </td>}
       {note.firstInTask && <td rowSpan={note.firstInTask.notes.length}>{note.firstInTask.name}</td>}
         <td>{note.name}</td>
        </tr>
      ))}
      </tbody>
    </table>
  );
}

ReactDOM.render(<Table data={tableData} />, document.getElementById('container'));
td {
  border: 1px solid gray;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="container">
</div>