React拼接子组件麻烦

Posted

技术标签:

【中文标题】React拼接子组件麻烦【英文标题】:React splice child component trouble 【发布时间】:2020-06-20 18:31:31 【问题描述】:

我有(例如)2 个组件。当然,其中 1 个是 Parent,另一个是 Parent 的 Child。 我的目标是按按钮删除组件,但是当我按下子组件内的删除按钮时,删除下一​​个组件的功能。也许我忘记了什么?

示例: [[1],[2],[3]] - 即嵌套数组与另一个数组。我想删除 [2] (parentArray[1])。但是删除函数删除[3](parentArray [2]),我有[[1],[2]]。那是我的麻烦。

父组件:

import React from 'react'
import classes from './Kanban.module.scss'
import Card from './Card/Card.js'

export default class Kanban extends React.Component 

  constructor(props) 
    super(props);

    this.state = 
      cards: [
      ]
    

    this.createCardHandler = this.createCardHandler.bind(this);
    this.deleteCardHandler = this.deleteCardHandler.bind(this);
  

  createCardHandler() 

    this.setState(
      cards: this.state.cards.concat( id: this.state.cards.length )
    )

  

  deleteCardHandler(index) 

    this.setState(prevState => 

      let cards = [...prevState.cards]

      cards.splice(index, 1)

      return 
        cards: cards
      

    )

  

  render() 
    let cards = null;

    cards = this.state.cards.map((cards, id) => 


      return (
        <Card
          index=cards.id
          id=cards.id
          onDelete=this.deleteCardHandler.bind(this, id)
        />
      )
    )

    return (
      <>
        <div>
          <button className=classes.CreateCardButton onClick=this.createCardHandler>+</button>
          cards

        </div>
      </>
    )
  


子组件:

import React from 'react'
import classes from './Card.module.scss'
import List from './List/List.js'

export default class Card extends React.Component 

  constructor(props) 
    super(props);

    this.state = 
      lists: []
    

    this.CreateListButton = this.CreateListButton.bind(this);
  

  CreateListButton() 

    this.setState(
      lists: this.state.lists.concat('List')
    )

  

  deleteListHandler(index) 
    let lists = [...this.state.lists]

    lists.splice(index, 1)

    this.setState(
      lists
    )
  

  render() 
    let lists = null

    lists = this.state.lists.map((lists, index) => 
      return (
        <List
          index=this.state.lists.length - 1
          onDelete=this.deleteListHandler.bind(this, index)
        />
      )
    )
    return (

      <div className=classes.Card>

        <button className=classes.DeleteCardButton onClick=this.props.onDelete>✖</button>

        <input maxLength='18' autoFocus className=classes.InputTitleInCard></input>

        lists

        <button className=classes.CreateNewListButton onClick=this.CreateListButton>CREATE NEW LIST</button>

      </div>

    )
  




【问题讨论】:

【参考方案1】:

请为您的子组件添加一个索引道具

cards = this.state.cards.map((card, index) => 
  return (
    <Card
      index=card.id
      id=card.id
      //Here i giving child component function from parent component
      onDelete=this.deleteCardHandler.bind(this, index)
    />
  )
)

【讨论】:

您好!我明白了,但我需要更改删除卡的功能,而不是列表。我认为看板组件中的所有问题都包含卡片组件。所以要理解结构:看板->卡片->列表。看板可以包含:看板 -> 卡片 |卡 |卡片。我需要了解如何正常删除卡。如果有人可以向我解释这一点,我只是更改列表删除方法:)(对不起英语,我是俄罗斯人:)) 请将index prop添加到您的子组件 谢谢帮忙,我在里面加了props,还是不行=( 你能用更新的代码更新你的问题吗【参考方案2】:

问题在于您删除处理程序。最初,看板类的状态是 []。然后,假设你添加 4 张卡,它会变成 [id: 0, id: 1, id: 2, id: 3] 所以,如果你删除说第二张卡,你的新状态就变成了,

[id: 0, id: 2, id: 3]

现在,如果您尝试删除第三张卡片,即 id=2,您的处理程序会从状态中删除索引为 2 的元素,即 id 为 3 的元素。因此,您单击的元素,下一个元素将被删除。 不要依赖数组索引(一旦您删除任何卡片,此映射将不起作用),请依赖您为卡片创建的 id。您编写删除处理程序的方式不正确。这是一个解决方案,这应该可以解决问题。

deleteCardHandler(index) 
    this.setState(previousState => previousState.filter(card => card.id !== index))

这基本上返回一个包含所有元素的数组,除了您单击删除的元素。希望对你有帮助!!!

【讨论】:

【参考方案3】:

当你设置状态时,使用它对我有用的扩展运算符。

this.setState(
    lists
)

改成这样

this.setState(
    [...lists]
)

【讨论】:

以上是关于React拼接子组件麻烦的主要内容,如果未能解决你的问题,请参考以下文章

React Hook useState 视图不更新

React Native - 将父母的状态传递给孩子的麻烦

React的Context对象解决props传递数据的烦恼!

兄弟组件之间传值

redux基础

redux入门