带挂钩的提升状态(来自映射数组)

时间:2019-04-17 03:06:47

标签: reactjs react-hooks react-state-management

我对应该如何使用钩子(或无状态组件)从子组件引发事件感到困惑。也许我想得太多了。还是不够!我建立了一个简单的例子来说明我的困惑。

假设我们有一个包含一些数据的父组件

import React, { useState } from "react";
import ReactDOM from "react-dom";

const Parent = () => {
  const data = [
    {
      thing: 1,
      info: "this is thing 1"
    },
    {
      thing: 2,
      info: "this is thing 1"
    },
    {
      thing: 3,
      info: "this is thing 3"
    }
  ];

  function handleClick(item) {
    console.log(item);
  }

  return (
    <div> 
    <h1> This is the Parent </h1> 
    <Child data={data} onShowClick={handleClick} /> 
    </div>
  )
};

以及通过映射数据创建的子组件

const Child = (data, {onShowClick}) => {
  return (
    <ul> 
      { data.data.map(item => {return (
        <li key={item.thing}>{item.info}
        <button onClick={() => onShowClick}>Click</button>  
        </li>
      )})}
    </ul> 
  )
}

如果全部都在同一组件中找到,我会做类似的事情

onClick={() => handleClick(item)}

但是您不能通过prop传递参数。

onClick={(item) => onShowClick}
// Or
onClick={onShowClick(item)}

也许钩子使我感到困惑。任何方向将不胜感激。

4 个答案:

答案 0 :(得分:1)

我认为您想结合使用2。

onClick={(item) => onShowClick(item)}

在将函数发送给子级或使其在父级this之外成为常量时,还需要添加onShowClick={this.handleClick}

答案 1 :(得分:0)

onClick={() => onShowClick}是一个错误,没有调用onShowClick函数。

如果需要使用范围内的值,则为:

  { data.data.map(item => (
    <li key={item.thing}>{item.info}
    <button onClick={() => onShowClick(item)}>Click</button>  
    </li>
  ))}

答案 2 :(得分:0)

这很容易。检查下面的代码。我只是在您的代码中做了一些更改。

const Parent = () => {
    const data = [
        {
            thing: 1,
            info: "this is thing 1"
        },
        {
            thing: 2,
            info: "this is thing 2"
        },
        {
            thing: 3,
            info: "this is thing 3"
        }
    ];

    const handleClick = (item) => {
        console.log(item);
    }

    return (
        <div>
            <h1> This is the Parent </h1>
            <Child data={data} onShowClick={handleClick} />
        </div>
    )
};

const Child = (props) => {
    return (
        <ul>
            {props.data.map(item => {
                return (
                    <li key={item.thing}>{item.info}
                        <button onClick={() => props.onShowClick(item)}>Click</button>
                    </li>
                )
            })}
        </ul>
    )
}

希望这会有所帮助。

答案 3 :(得分:0)

这与hooks无关。

您应该查看有关如何将参数传递给事件处理程序的文档: https://reactjs.org/docs/handling-events.html#passing-arguments-to-event-handlers

这是文档中的示例。

<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>

但是由于您不需要e,因此只需通过item

{
  data.data.map(item => (
    <li key={item.thing}>{item.info}
      <button onClick={() => onShowClick(item)}>Click</button>
    </li>
  ))
}