【问题标题】:React running a function inside onClick of a button inside parent componentReact 在父组件内的按钮的 onClick 内运行函数
【发布时间】:2019-09-06 07:21:58
【问题描述】:

我有两个组件,一个子组件和一个父组件,所以子组件是一个 div,里面有一个按钮,在父组件里面我用 onclick 属性调用它,里面有函数,这可能吗?

Button.js

import React from "react";

const Button =() => {
  return(
    <div>
      <button> >Hello world</button>
    </div>
  )
}
export default Button;

App.js

import React from "react";
import ReactDOM from "react-dom";
import Button from "./button";
import "./styles.css";

const  handleClick = () => {
  return(<h1>Hello world..!</h1>)

}

function App() {
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
      <Button onClick={handleClick()} />
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

【问题讨论】:

  • 是的,你可以做你正在做的事情,但它不会给出任何结果。

标签: reactjs button


【解决方案1】:

让我们创建一个好的按钮组件,以便在多个页面中使用按钮组件。使用下一个代码为按钮组件创建自己的文件:

import React from "react";

const Button = ({ onClick, title }) => (
  <div>
    <button onClick={onClick}>{title}</button>
  </div>
)

export default Button;

按钮组件有两个道具。它是onClicktitleonClick - 这是一个函数。 title - 它是一个字符串。我们可以使用PropTypes 来检查类型,但现在不行,在这个例子中它不是很重要。

所以,如果你想在多个页面中使用按钮组件,那么只需导入你的按钮组件并将两个道具传递给组件,就像下面的代码一样:

<Button
  onClick={handleClick}
  title=">Hello world"
/>

它非常简单易用。在下一个 sn-p 中包含您的代码的完整示例:

const Button = ({ onClick, title }) => (
  <div>
    <button onClick={onClick}>{title}</button>
  </div>
)

const handleClick = () => {
  console.log('clicked');
};

function App() {
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
      <Button onClick={handleClick} title=">Hello world" />
    </div>
  );
}


ReactDOM.render(
  <App />,
  document.getElementById('container')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="container">
    <!-- This element's contents will be replaced with your component. -->
</div>

【讨论】:

    【解决方案2】:

    错误是 handleClick() 是一个函数处理程序,所以不要在其中返回 JSX 模板,
    这是一个工作示例

       // Button.js
    
        // import React from "react";
    
        const Button = props => (
            <div>
              <button onClick={props.click}>Hello world</button>
            </div>
          )
        // export default Button;
    
        // App.js
    
        // import React from "react";
        // import ReactDOM from "react-dom";
        // import Button from "./button";
        // import "./styles.css";
    
        const  handleClick = () => {
          alert("Hello world")
          // return(<h1>Hello world..!</h1>)
        }
    
        function App() {
          return (
            <div className="App">
              <h1>Hello CodeSandbox</h1>
              <h2>Start editing to see some magic happen!</h2>
              <Button click={() => handleClick()} />
            </div>
          );
        }
    
        const rootElement = document.getElementById("root");
        ReactDOM.render(<App />, rootElement);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
    <div id="root" />

    【讨论】:

    • 谢谢重播
    【解决方案3】:

    您为&lt;Button /&gt; 组件设置的onClick 属性永远不会到达&lt;button&gt; 元素。您必须将 onClick 道具添加到 Button 组件道具:

    import React from "react";
    import PropTypes from 'prop-types';
    
    const Button = ({ onClick }) => {
      return(
        <div>
          <button onClick={onClick}>Hello world</button>
        </div>
      )
    }
    
    Button.defaultProps = {
      onClick: () => null,
    };
    Button.propTypes = {
      onClick: PropTypes.func,
    };
    export default Button;
    

    还要注意,在这种情况下,您应该在父组件中传递不带括号的函数&lt;Button onClick={handleClick} /&gt;。请记住,对于不同的用例,有不同的方法可以做到这一点。

    【讨论】:

    • 那么,如果指定来自 App.js 的道具我想在多个页面和不同的功能中使用我的按钮组件,我该如何做某事?像那样?
    • 我已经更新了使用道具类型的答案,并为 onClick 添加了一个默认道具。这样,您可以在有或没有 onClick 属性的情况下使用此组件。文档在这里 - reactjs.org/docs/typechecking-with-proptypes.html
    猜你喜欢
    • 2020-08-17
    • 1970-01-01
    • 2018-12-11
    • 2015-06-25
    • 2020-11-02
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多