Подъемное состояние с помощью крюков (из сопоставленного массива) - PullRequest
0 голосов
/ 17 апреля 2019

Я запутался в том, как я должен вызывать события из дочернего компонента с помощью хуков (или, скорее, компонентов без состояния). Может быть, я слишком много думаю. Или не достаточно! Я построил простой пример, иллюстрирующий мое замешательство.

Скажем, у нас есть родительский компонент с некоторыми данными

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)}

Но вы не можете передать аргумент с опорой.

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

Может, крючки меня смущают Любое направление будет оценено.

Ответы [ 4 ]

1 голос
/ 17 апреля 2019

Это не имеет ничего общего с 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>
  ))
}
1 голос
/ 17 апреля 2019

Я думаю, что вы хотите объединить 2.

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

Вам также нужно добавить this при отправке функции ребенку или сделать ее константой вне родительского элемента, onShowClick={this.handleClick}

0 голосов
/ 17 апреля 2019

Это просто приятель.проверьте ниже код.Я только что внес в ваш код некоторые изменения.

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>
    )
}

Надеюсь, это полезно.

0 голосов
/ 17 апреля 2019

onClick={() => onShowClick} - ошибка, onShowClick функция не вызывается.

Если необходимо использовать значение из окружающей области, это:

  { data.data.map(item => (
    <li key={item.thing}>{item.info}
    <button onClick={() => onShowClick(item)}>Click</button>  
    </li>
  ))}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...