Вложенная функция возвращает неожиданный результат

У меня есть компонент меню в моем компоненте заголовка. Компонент заголовка передает функцию компоненту меню => компоненту меню по умолчанию. Это работает, но функция возвращает нежелательные данные.

путь, по которому проходит моя функция: домашняя страница => заголовок => меню => меню по умолчанию

Функция:

changeBodyHandler = (newBody) => {
    console.info(newBody)
    this.setState({
      body: newBody
    })
}

Я передаю функцию с домашней страницы => заголовок следующим образом:

<HeaderDiv headerMenuClick = {() => this.changeBodyHandler}/>

затем через заголовок => меню => defaultMenu, используя:

<Menu MenuClick = {this.props.headerMenuClick} />

//==================== КОДЫ КОМПОНЕНТОВ ========================== //

домашняя страница:

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

        this.state = {
            body: "Homepage"
        }

    this.changeBodyHandler = this.changeBodyHandler.bind(this)
    }

    changeBodyHandler = (newBody) => {
        console.info(newBody)
        this.setState({
            body: newBody
        })
    }

    render() {
        return (
            <div>
            <HeaderDiv headerMenuClick = {() => this.changeBodyHandler}/>
            { this.state.body === "Homepage" ?
              <HomepageBody />
              :  (<div> </div>)}
            </div>
        );
    }
}

заголовок:

class HeaderDiv extends Component {

  constructor(props) {
      super(props);
      this.state = {
          showMenu: 'Default',
      }
  }

    render(){
      return (
                <Menu MenuClick = {this.props.headerMenuClick}/>
      );
    }
}

меню:

import React, { Component } from 'react';
import DefaultMenu from './SubCompMenu/DefaultMenu';
import LoginCom from './SubCompMenu/LoginCom';
import SingupCom from './SubCompMenu/SingupCom';

class Menu extends Component {
//==================================================================
  constructor(props){
    super(props);
    this.state = {
      show: this.props.shows
    };
    this.getBackCancelLoginForm = this.getBackCancelLoginForm.bind(this);
  }
//===============================================================
//getBackCancelLoginForm use to hindle click event singin & singup childs
//===============================================================
  getBackCancelLoginForm(e){
    console.info("Hi")
      this.setState({
          show : "Default"
      })
  }
//=================================================================
// getDerivedStateFromProps changes state show when props.shows changes
//===============================================================
componentWillReceiveProps(nextProps) {
  if (this.props.show != this.nextProps){
      this.setState({ show: nextProps.shows });
  }
}
//======================================================================
  render() {
    return (
      <div>
        { this.state.show === "Singin" ?
          <LoginCom
            cencelLogin = {this.getBackCancelLoginForm.bind(this)}
          />
        : (<div> </div>)}

        { this.state.show === "Singup" ?
          <SingupCom
            cencelLogin = {this.getBackCancelLoginForm.bind(this)}
          />
        : (<div> </div>)}

        { this.state.show === "Default" ?
          <DefaultMenu MenuClicks = {this.props.MenuClick}/> : (<div> </div>)}

      </div>

    );
  }
}

Меню по умолчанию:

class DefaultMenu extends Component {
  render() {
    return (
          <div className = "box11" onClick = {this.props.MenuClicks("Homepage")}>
            <h3 className = "boxh3" onClick = {this.props.MenuClicks("Homepage")}>HOME</h3>

    );
  }
}

//================ Опишите ожидаемые и фактические результаты. ================//

Я ожидаю, что строка «Домашняя страница» будет назначена моему состоянию «тело»

но console.info показывает:

Class {dispatchConfig: {…}, _targetInst: FiberNode, nativeEvent: MouseEvent, type: "click", target: div.box11, …}

вместо "Главная"

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
15
1

Ответы 1

Используйте функции стрелок в прослушивателе onClick, в приведенном выше вопросе Изменить DefaultMenu как:

class DefualtMenu extends Component {
    render() {
      return (
            <div className = "box11" onClick = {() => this.props.MenuClicks("Homepage")}>
              <h3 className = "boxh3">HOME</h3>
            </div>
      );
    } }

Для стрелочных функций узнайте из Функции стрелок Mozilla
Надеюсь, это поможет.

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