Как видно из названия, это не так.
У меня есть компонент класса 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? А может есть способ попроще, о котором я не думал?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


menuList.map(item) в родительском и перейдите в Меню а
обратный вызов, который будет вызываться при наведении курсора на элемент. Этот
callBack будет иметь элемент в качестве параметра.Menu, чтобы отображать только один пункт меню. При наведении указателя мыши на этот элемент будет вызван обратный вызов с элементом в качестве параметра. Задайте переменную состояния, которая будет содержать этот элемент.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>
);
Этот! Я был буквально в одном слове от того, чтобы решить эту проблему сам. Я забыл передать аргумент «имя» (да). Спасибо! :)
@NorweskiDrwal приятно, пожалуйста, проголосуйте за него. если он работает на вас
имхо,
reduxсделает это.