【问题标题】:Deleting elements onClick in ReactJS?在 ReactJS 中删除 onClick 元素?
【发布时间】:2020-01-27 17:52:46
【问题描述】:

我有一个行组件,我正在将它导入到我的 App.js 组件中,显然我,但删除功能似乎没有删除正确的行。即使我删除了第二个,它也会先删除最后一个。所以基本上如果我点击第二行上的删除,它应该删除第二个而不是第三个等等。

我的 App.js 或我的根组件如下所示:-

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

class App extends Component {
   state = {
      rows: [
       {value: 'row1', options:[1,2,3,4,5] },
       {value: 'row2', options:[1,2,3,4,5] },
       {value: 'row3', options:[ 1,2,3,4,5 ]}
     ]
  }

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

addRow = () => {
const rows = [...this.state.rows, {value:'', options: [1,2,3,4,5}];
 this.setState({
    rows,
   });
 }

 deleteRow = (idx) => {
 const copy = [...this.state.rows]
 copy.splice(idx,1)
 this.setState ({
 rows:copy
  })
}

render() {
   return (
      <div>
    {
  this.state.rows.map ( (row,idx) => {
    return (
      <Row 
      key = {idx} 
      value = { row.value } 
      onChange = { (e) => this.updateValue(e,idx) } 
      delete = { this.deleteRow.bind(this,idx) } />
       )
    })
   }
 <button onClick = {this.addRow}> Add </button>
 </div>
     )
   }
} 

 export default App;

我的行组件看起来像这样:-

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

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

export default Row

我昨天问了一个类似的问题link,但当时没有意识到这些项目没有从正确的位置删除?

【问题讨论】:

  • 你不认为你错过了this 即this.props 吗?
  • 您的示例实际上对我来说似乎工作正常。我在Row 组件中注释掉了呈现的选项,但这与删除行不同。
  • 它也适用于我。修复了几个语法错误,它运行正确。

标签: javascript reactjs


【解决方案1】:

试试这个

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

将行传递给您的删除函数

    <Row 
      key = {idx} 
      value = { row.value } 
      onChange = { (e) => this.updateValue(e,idx) } 
      delete = {()=>this.deleteRow(row) } />
       )

如果每一行(对象)都具有唯一的 id,则使用该 id 而不是 value 喜欢-

 let filtered = this.state.rows.filter(row=>row.id!==item.id);

【讨论】:

  • @Somethingwhatever 现在通过更改两个提到的代码来检查
  • 如果多行共享相同的值,这将删除多余的行
  • @khuynh 那你有什么建议呢?因为我的代码似乎没有做预期的事情:|
  • 这是不好的做法。新状态不应该像这样的旧状态。然后你应该使用函数来设置状态
  • 我同意这比拼接状态更好(假设行有一个唯一的 id 可以正确过滤)。但是,我认为将prevProps 参数与setState 一起使用会更好一些。这保证了状态是最新的。
猜你喜欢
  • 2019-11-17
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 2021-01-18
  • 2011-06-22
  • 1970-01-01
  • 2018-06-01
相关资源
最近更新 更多