在props中将函数传递给React组件

时间:2019-08-15 09:07:07

标签: javascript reactjs next.js

我同时检查了other questionsdocs,但无法使其正常工作。我想将处理函数传递给其道具内的子组件,以在主题之间进行更改。

我在父组件和设置新状态的处理程序中定义了一个状态。我尝试了有无参数。

这是父母

class MyApp extends App {

  constructor(props) {
    super(props);
    this.state = {
      colorScheme: "light"
    };
    this.handleColorScheme = this.handleColorScheme.bind(this);
  }

  handleColorScheme = scheme => {
    this.setState({ colorScheme: scheme });
  };

  render() {
    const { Component, pageProps } = this.props;

    const props = {
      ...pageProps,
      schemeHandler: this.handleColorScheme
    };
    return (
      <Container>
         <ThemeProvider
            theme={this.state.colorScheme === "light" ? theme : themeDark}
          >
            <Component {...props} />
          </ThemeProvider>
      </Container>
    );
  }
}

export default MyApp;

这是子组件

export default function Layout(props) {
  const [theme, setTheme] = useState({
    palette: {
      type: "light"
    }
  });

  const toggleDarkTheme = () => {
    let newPaletteType = theme.palette.type === "light" ? "dark" : "light";    
    props.schemeHandler(newPaletteType);
  };

  return (
   <div>
      <CssBaseline />
      <div className={classes.root}>
        <AppBar
          position="absolute"
          color={"default"}
          className={classes.appBar}
        >
          <Toolbar>
              <IconButton onClick={toggleDarkTheme}>
                <Dark />
              </IconButton>            
          </Toolbar>
        </AppBar>
        <main className={classes.content}>          
          {props.children}
        </main>
      </div>
    </div>
  );
}

当我单击按钮时,它说toggleDarkTheme不是函数。使用开发工具进行调试时,我看不到父函数。该函数如何在props中传递?

2 个答案:

答案 0 :(得分:1)

  1. 您不应该在父级和子级中都使用状态,这会使您的逻辑变得复杂。您可以将状态放置在父级中,并将修饰符函数作为prop传递给子级(子级变成哑组件)。

  2. 无需绑定修饰符功能。

  3. 父组件可以成为函数而不是类。

示例: https://codesandbox.io/embed/passing-react-func-as-props-kf8lr

答案 1 :(得分:0)

我怀疑是因为语法。

<IconButton onClick={() => toggleDarkTheme() }>

在子组件中更改此行应该可以解决问题。 Cant确实知道,没有一些最少的代码即可测试运行