Как обновить состояние в родительском компоненте данными, взятыми из дочернего в React

Как видно из названия, это не так.

У меня есть компонент класса MenuContainer с таблицей элементов menuList, которые я передаю в качестве реквизита дочернему функциональному компоненту, который сопоставляет его с другим дочерним элементом, который выводит меню. Ничего особенного. Меню отображает только {icon} из props.
В этом родительском контейнере у меня также есть еще один дочерний элемент с именем ItemName, который должен передавать реквизиты itemName из состояния (по умолчанию пустая строка).

Сложность заключается в том, что значение this.state.itemName должно быть обновлено с помощью {name} любого пункта меню, на который я наводил указатель мыши в компоненте Menu / MenuItem. Таким образом, компоненты MenuItem отображаются только с помощью значков, и когда я нахожу на них курсор, мне нужно, чтобы {name} (из таблицы menuList) отображалось в компоненте ItemName.

Родительский - MenuContainer

class MenuContainer extends Component {
  constructor(props) {
    super(props);

    this.state = {
      itemName: ''
    };
  };

  menuList = [
    {name: 'chat', icon: 'talking-heads'},
    {name: 'people', icon: 'loads-of-heads'},
    {name: 'settings', icon: 'cogwheel'},
    {name: 'potatoes', icon: 'one-huge-potato'}
  ];

  getItemName = () => {
    this.setState({ itemName: *menuList.name of the menu item that I hover over* })
  }

  render() {
    return(
      <>
        <Menu menuList = {this.menuList} />
        <ItemName itemName = {this.state.itemName} />
      </>
    )
  }
}

Ребенок 1 - Меню

const menu = (menuList) => (
  <>
    {menuList.map((item) => (
      <MenuItem {...item} menuList = {menuList} key = {item.name} />
    ))}
  </>
);

Дочерний 2 - MenuItem

const menuItem = ({ name, icon }) => (
  <div data-item-name = {name}>
    {icon}
  </div>
);

Дочерний 3 - ItemName

const itemName = (itemName) => (
  <p>{ itemName }</p>
);

Моя идея заключалась в том, что мне, вероятно, следует сделать MenuItem компонентом класса и внутри него создать метод, который передал бы {name} родительскому элементу, где он был бы перехвачен методом getItemName, который затем обновил бы состояние, но я закончились идеи о том, как этого добиться.

Должен ли я делать это с Redux? А может есть способ попроще, о котором я не думал?

имхо, redux сделает это.

Ali Ghanavatian 04.04.2018 12:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  1. Сделайте menuList.map(item) в родительском и перейдите в Меню а обратный вызов, который будет вызываться при наведении курсора на элемент. Этот callBack будет иметь элемент в качестве параметра.
  2. Измените Menu, чтобы отображать только один пункт меню. При наведении указателя мыши на этот элемент будет вызван обратный вызов с элементом в качестве параметра. Задайте переменную состояния, которая будет содержать этот элемент.
  3. menuItem будет вызываться с этой переменной состояния.
Ответ принят как подходящий

МенюКонтейнер

class MenuContainer extends Component {

  onMouseOverEvent(name){
    this.setState({ itemName: name })
  }
  render() {
    return(
      <>
        <Menu
 menuList = {this.menuList}  
onMouseOverEvent = {this.onMouseOverEvent}/> //passed event hanlder onMouseOverEvent
            <ItemName itemName = {this.state.itemName} />
          </>
        )
      }
    }

Меню

    const Menu = ({menuList,onMouseOverEvent}) => (
      <>
        {menuList.map((item) => (
          <MenuItem {...item} menuList = {menuList} key = {item.name}  
onMouseOverEvent = {onMouseOverEvent}/> //passed onMouseOverEvent as it is here 
        ))}
      </>
    );

Пункт меню

    const MenuItem = ({ name, icon ,onMouseOverEvent}) => (
      <div data-item-name = {name}
 onMouseOver = {()=>onMouseOverEvent(name)}>//used to call onMouseOver Event
        {icon}
      </div>
    );

Этот! Я был буквально в одном слове от того, чтобы решить эту проблему сам. Я забыл передать аргумент «имя» (да). Спасибо! :)

Norweski Drwal 04.04.2018 13:29

@NorweskiDrwal приятно, пожалуйста, проголосуйте за него. если он работает на вас

RIYAJ KHAN 04.04.2018 13:42

Другие вопросы по теме