javascript - 在 React JS 中添加和删除 onClick 元素?

标签 javascript reactjs

我是 React JS 的新手,我正在尝试在单击按钮时创建新的组和行。因此,我有一个名为 groups 的数组,它为我提供了 Parent 组件,然后另一个名为 rows 的数组循环并提供了 Row 组件。我有 2 个方法,addRowaddGroup 来动态添加新的父组件和行组件。但是每次我添加或删除一行时,似乎都会从所有组中添加和删除。如何使每个组和行彼此分开?

这就是我的 App.js 文件的样子:-

import React, {Component} from 'react';
import './App.css';
import Parent from './Parent.js'

class App extends Component {
  state = {
    rows: [
      {id:0,value: 'row1', options:[1,2,3,4,5] }
    ],
    groups : [
      { id:0, title: 'New Group' }
    ],
  }

  updateValue = (e, idx) => {
    const rows = [...this.state.rows];
    rows[idx].value = e.target.value;
    this.setState({
      rows,
    });
  }

  addNewGroup = () => {
    const groups = [...this.state.groups, { id:this.state.groups.length, title: 'New Group'}]
    this.setState({
      groups
    })
  }

  addRow = () => {
    const rows = [...this.state.rows, {id: this.state.rows.length ,value:'',options: []}];
    this.setState({
      rows,
    });
  }

  deleteRow = (item) => {
    let filtered = this.state.rows.filter(row => row.id !== item.id);
    this.setState ({
      rows: filtered
    })
  }

  render() {
    return (
      <div className = "App">
      {
        this.state.groups.map ( (group,idx) => {
          return (
            <Parent
            key = {idx}
            title = {group.title }
            rows = { this.state.rows }
            deleteRow = {this.deleteRow.bind(this) }/>
          )
        })
      }
      <button onClick = {this.addRow}> Add </button>
      <button onClick = {this.addNewGroup }>Add Group  </button>
      </div>
    )
  }
}
export default App;

这就是我的父组件的样子:-

import React from 'react'
import Row from './Row.js'

const Parent = (props) => {
  return (
    <div>
    <h4>{ props.title }</h4>
    {
      props.rows.map( (row,idx) => {
        return (
          <Row
          key = {idx}
          index = {idx}
          value = { row.value }
          options = { row.options }
          delete = { () => { props.deleteRow(row) } }/>
        )
      })
    }
    </div>
  )
}

export default Parent;

这是我的行组件:-

import React from 'react'
import './Row.css'

const Row = ( props) => {
  let options = props.options.map(opt => <option key={opt}>{opt}</option>);

  return (
    <div>
    <input></input>
    <select>
    {options}
    </select>
    <button onClick = { () => { props.delete(props.index); } } > Delete </button>
    </div>
  )
}

export default Row

所以基本上 addGroup 应该给我一个新组,我应该能够单独添加和删除行,而不影响其他组中的行。谢谢。

最佳答案

我对你的内容进行了一些修改。它的要点是每个组都拥有一个行数组,它们并不像您在示例中那样是分开的。当你想修改一个组时,传入它的id,当你想修改一行时,传入它的组的id和它的(行)id。在完美的世界中,您将为每个行生成 UUID,因此您只需传入行的 id 即可更新/删除它。 React 的一个很酷的事情是组件结构最终应该镜像数据结构。 <App> ->很多<Group> s -> 每个组有很多<Row> s。

const { Component } = React;
const options = [1, 2, 3, 4, 5];

class App extends Component {
  state = {
    groups : [
      { id: 0, title: 'New Group', rows: [{ id: 0,value: 'row1', options }] }
    ],
  }

  // this isn't hooked up to anything yet
  updateValue = (e, rowId, groupId) => {
    let groups = [...this.state.groups];

    groups = groups.map(group => {
      if (group.id === groupId) {
        group.rows = group.rows.map(row => {
          if (row.id === rowId) {
            row.value = e.target.value;
          }

          return row
        })
      }

      return group;
    });

    this.setState({ groups });
   }

   addNewGroup = () => {
    const groups = [...this.state.groups, { id:this.state.groups.length, title: 'New Group', rows: [] }]
    this.setState({ groups });
  }
  
  removeGroup = (groupId) => {
    const groups = this.state.groups.filter(group => group.id !== groupId);
    
    this.setState({ groups });
  }

  addRow = (groupId) => {
    let groups = [...this.state.groups];

    groups = groups.map(group => {
      if (group.id === groupId) {
        const id = group.rows.length;
        group.rows.push({ id, value: `row${id}`, options })
      }

      return group;
    });

      this.setState({ groups });
   };

  deleteRow = (rowId, groupId) => {
    let groups = [...this.state.groups];

    groups = groups.map(group => {
    console.log(group, rowId)
      if (group.id === groupId) {
        group.rows = group.rows.filter(row => row.id !== rowId)
      }

      return group;
    });

    this.setState ({ groups });
  }

render() {
  return (
    <div className = "App">
     {this.state.groups.map ( (group, idx) => (
       <div>
          <Parent
            key={idx}
             title={group.title}
             group={group}
             removeGroup={this.removeGroup.bind(this)}
           />
           <button onClick = {() => this.addRow(group.id)}> Add Row </button>
           <button onClick = {() => this.removeGroup(group.id)}> Remove Group </button>
       </div>
      ))}
      
      <button onClick = {this.addNewGroup }>Add Group  </button>
   </div>
    )
  }
}

const Parent = (props) => {
  return (
     <div>
       <h4>{ props.title }</h4>
       {props.group.rows.map((row, idx) => (
           <Row
             key={idx}
             index={idx}
             value={ row.value }
             options={ row.options }
             delete={() => { props.deleteRow(row.id, props.group.id) }}
           />
         ))
       }
     </div>
    )
}

const Row = ( props) => {
  let options = props.options.map(opt => <option key={opt}>{opt}</option>);

  return (
     <div>
      <input></input>
      <select>
          {options}
      </select>
      <button onClick={props.delete}> Delete </button>
     </div>
    )
}


ReactDOM.render(
  <App />,
  document.getElementById('root')
);
<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="root"></div>

关于javascript - 在 React JS 中添加和删除 onClick 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59959451/

相关文章:

javascript - 使父 div 与子 div 一样大

javascript - Highcharts - 关于完整图表宽度的问题

javascript - 将javascript对象转换为 Backbone 模型

reactjs - 如何防止输入键触发提交

javascript - React 组件内的构造函数

javascript - 如何在 React Native 中正确地将组件导入到我的导航器中?

javascript - jQuery .hide() -- 向左滑动元素

javascript - 如何在node.js中使用Sinon/Mocha模拟变量

javascript - React Redux mapDispatchToProps 与 this.props.dispatch

javascript - 如何清除React中的TextField?