Передача функции - PullRequest
       11

Передача функции

0 голосов
/ 25 октября 2019

Все еще изучаю Java и функции. Писал какой-то код, но был озадачен.

В моем классе App.js у меня есть строка кода в выражении return следующим образом:

<Toolbar drawerClickHandler ={props.drawerToggleClickHandler}/>

В моем классе панели инструментов это будетактивировать с помощью «щелчка» следующим образом:

<DrawerToggleButton click={props.drawerClickHandler}/>

Который в последний раз будет подключен к другому классу DrawerToggleButton в следующем коде:

<button className="toggle-button" onClick={props.click}>

Класс Toolbas и DrawerToggleButton не имеют проблемс передачей, но props.drawerToggleClickHandler не работает, говорит «Неразрешенная переменная boxToggleClickHandler».

Как это исправить? Полный код ниже:

App.js:

import React, { useState, useEffect } from "react";
// import logo from './logo.svg';
import './App.css';
import Routes from "./Routes";
import { Auth } from "aws-amplify";
import { Link, withRouter } from "react-router-dom";
// import { Navbar } from "react-bootstrap";
import  Toolbar from './components/Toolbar/Toolbar';
import SideDrawer from './components/SideDrawer/SideDrawer';
import Backdrop from './components/Backdrop/Backdrop';


function App(props) {
  const [isAuthenticated, userHasAuthenticated] = useState(false);
  const [isAuthenticating, setIsAuthenticating] = useState(true);
  const [sideDrawerOpen, setIsSideDrawerOpen] = useState(false);

  useEffect(() => {
    onLoad();
  }, []);

  async function onLoad() {
    try {
      await Auth.currentSession();
      userHasAuthenticated(true);
    }
    catch(e) {
      if (e !== 'No current user') {
        alert(e);
      }
    }
    setIsAuthenticating(false);
  }

  function handleLogout() {
    userHasAuthenticated(false);
    props.history.push("/login");
  }

  function drawerToggleClickHandler(){
    if(sideDrawerOpen){
      return {setIsSideDrawerOpen: false};
    }
    else{
      return {setIsSideDrawerOpen: true};
    }

  }

  let sideDrawer;
  let backdrop;
  let toolBar;

  if(userHasAuthenticated === true){
    toolBar = <Toolbar drawerClickHandler ={props.drawerToggleClickHandler}/>
  }
  if (userHasAuthenticated === true && sideDrawerOpen === true){
    sideDrawer = <SideDrawer/>;
    backdrop = <Backdrop/>
  }
  return (
    <div className="App container" style={{height: '100%'}}>
      {toolBar}
      {sideDrawer}
      {backdrop}
      {/*<Toolbar/>*/}
      {/*<SideDrawer/>*/}
      {/*<Backdrop/>*/}
      <Routes appProps={{ isAuthenticated, userHasAuthenticated }} />
    </div>
  );
}

export default withRouter(App);

Toolbar.js:

import React from 'react';
import './Toolbar.css';
import  DrawerToggleButton from '../SideDrawer/DrawerToggleButton'
import '../SideDrawer/DrawerToggleButton';
import sideDrawer from "../SideDrawer/SideDrawer";

const toolbar = props =>(
<header className="toolbar">
    <nav className="toolbar_navigation">
        <div>
            <DrawerToggleButton click={props.drawerClickHandler}/>
        </div>
        <div className="toolbar_logo"><a href="/">Kleen Portal</a></div>
        <div className="spacer" />
        <div className="toolbar_navigation-items">
            <ul>
                <li><a href="/">Logout</a></li>
            </ul>
        </div>
    </nav>
</header>
);

export default toolbar;

DrawerToggleButton.js:

import React from 'react';
import './DrawerToggleButton.css'

const drawerToggleButton = props => (
  <button className="toggle-button" onClick={props.click}>
    <div className="toggle-button_line" />
    <div className="toggle-button_line" />
    <div className="toggle-button_line" />
  </button>
);

 export default drawerToggleButton;

1 Ответ

1 голос
/ 25 октября 2019

Вы не меняете состояние: вам нужно изменить свою функцию на эту (и я бы предложил переименовать setState в setsIsSideDrawerOpen)

function drawerToggleClickHandler(){
  if(sideDrawerOpen){
    setState(false)
  }
  else{
    setState(true)
  }

}

Изменить

toolBar = <Toolbar drawerClickHandler ={props.drawerToggleClickHandler}/>

до

toolBar = <Toolbar drawerClickHandler ={drawerToggleClickHandler}/>

drawerToggleClickHandler не является опорой

[Также app.js не является классом, это функциональный компонент]

, чтобы ответить на вашвопрос второго комментария Я бы не назначил ваш компонент переменной, просто сделайте это встроенным:

<div className="App container" style={{height: '100%'}}>
{userHasAuthenticated && <Toolbar drawerClickHandler =props.drawerToggleClickHandler}/>
  }

...

...