【问题标题】:How to pass a delete function as props in ReactJS如何在 ReactJS 中将删除函数作为道具传递
【发布时间】:2020-04-25 20:47:04
【问题描述】:

我正在构建一个食谱应用,但在使用删除功能时遇到了问题。

它的工作原理是单击“添加食谱”按钮,然后会弹出一个模式,让您可以为新食谱填写一些输入字段。在该表单中是一个成分字段和一个“添加成分”按钮。您单击“添加”,该成分将添加到成分列表中。它的行为与待办事项列表完全相同,但它位于表单组件内部。我还希望能够去除一种成分。

我的应用组件结构如下:

  • RecipeBook.js(父)
  • RecipeCardForm.js(子)

这是位于组件中的表单组件:

<RecipeCardForm
handleRemoveIngredients={this.handleRemoveIngredients}
/>

parent 组件中还有removeIngredient 函数:

handleRemoveIngredient = id => {
  const filteredIngredientList =  this.state.ingredientList.filter(ingredient => id !== ingredient.id);
  this.setState({ingredientList: filteredIngredientList})
  }

child 组件中,这是在 &lt;ul&gt; 中返回的,它显示了成分列表:

{this.props.ingredientList.map(ingredient => {

              return (
                <li key={ingredient.id}>
                    <span>{ingredient.amount}</span>
                    <span>{ingredient.ingredient}</span>
                    <span ><button type='button' className='btn btn-danger' 
                    onClick={ this.props.removeIngredient }>X</button></span>
                </li>
              )
            })}

由于它的结构,我无法弄清楚如何传递通常会在父组件中删除道具的删除函数中传递的 id。

通常,我会这样做:

this.state.items.map(item => {
<List
handleRemoveItem={() => this.handleRemoveItem(item.id)} />

但由于父组件中没有映射任何内容,因此我无法传递 id。

因此,当我在 removeIngredient 函数中记录 id 时,它显示为未定义。我知道它在那里。当我在添加函数中记录它时,有一个 id,当我在映射子组件中的每个成分时记录它时,它也在那里。我什至可以在删除成分按钮的 onClick 中访问它:

<button 
 type='button' 
 className='btn btn-danger' 
 onClick={ () => console.log(ingredient.id)}>Delete</button>

这也给了我 id。

我只是想不通如何在没有映射到父组件的情况下传递它,但实际上在父组件中没有什么可以映射的。当然,传递“this.state.id”只会给我一个空字符串的初始状态。

非常感谢任何帮助我了解如何做到这一点。提前致谢!

【问题讨论】:

    标签: javascript reactjs jsx


    【解决方案1】:

    我认为解决您的问题的方法是将 ID 传递给 this.props.handleRemoveIngredient 函数,如下所示:

    onClick={this.props.handleRemoveIngredient(ingredient.id)}
    

    在您的示例中,您没有将成分 id 交给函数,而是调用了 this.props.removeIngredient 函数,该函数不是道具/函数的正确名称。

    【讨论】:

    • 非常感谢您发现错误的功能问题。当我将成分.id 传递给这个函数时,它给了我一个错误......“警告:在现有状态转换期间无法更新(例如在render 内)。渲染方法应该是道具和状态的纯函数。”
    • 你是否在父组件中绑定了handleRemoveIngredient函数?
    【解决方案2】:

    没关系,只是想通了。

    解决方案确实是onClick={ () =&gt; this.props.removeIngredient(ingredient.id) }

    我的问题是当我将道具传递给子组件 handleRemoveIngredient={this.handleRemoveIngredient} 时,我将它作为没有参数的函数传递 handleRemoveIngredient={() =&gt; this.handleRemoveIngredient()} 并且由于某种原因导致 id 返回未定义。

    感谢您的帮助!

    【讨论】:

      【解决方案3】:
      {this.props.ingredientList.map(ingredient => {
      
                return (
                  <li key={ingredient.id}>
                      <span>{ingredient.amount}</span>
                      <span>{ingredient.ingredient}</span>
                      <span ><button type='button' className='btn btn-danger' 
                      onClick={ () => this.props.removeIngredient(ingredient.id) }>X</button></span>
                  </li>
                )
              })}
      

      【讨论】:

      • 没有解释的代码不是很有帮助。为什么这段代码是解决方案?
      • 感谢您的建议!刚刚尝试过,它没有用..它甚至没有给我一个错误。这正是我认为的解决方案应该是的。我不知道为什么它不起作用。
      猜你喜欢
      • 2019-11-13
      • 1970-01-01
      • 2020-10-10
      • 2020-11-19
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多