【问题标题】:React Hooks onClick event: call child function before calling parent functionReact Hooks onClick事件:在调用父函数之前调用子函数
【发布时间】:2021-04-14 08:08:35
【问题描述】:

在我下面的代码中,如何在执行父函数togglePage之前调用executeBeforeToggle函数?

import * as React from "react";
import { useState } from "react";
import { render } from "react-dom";

const Page1 = (props) => {  

  //how to call this function before toggling?
  const executeBeforeToggle = () => {
    alert('HOORAY')
  }

  return (
      <div>
        <h1>I am Page 1</h1>
        <button onClick={() => props.togglePage()}>Toggle</button>
      </div>      
    )
};

const Page2 = (props) => {
  return (
    <div>
      <h1>I am Page 2</h1>
      <button onClick={() => props.togglePage()}>Toggle</button>
    </div>      
  )
}

const App = () => {
  const [page, setPage] = useState(false)

  const togglePage = () => {    
    setPage(!page)
  }


  if(page === false) return <Page1 togglePage={togglePage} />
  else return <Page2 togglePage={togglePage}  />
}



render(<App />, document.getElementById("root"));

【问题讨论】:

    标签: javascript node.js react-hooks


    【解决方案1】:

    不确定我是否正确理解了您的问题,但实际上这很简单:

    const Page1 = (props) => {  
    
      const executeBeforeToggle = () => {
        alert('HOORAY')
      }
    
      const handleClick = () => { // click handler which exec both funcs
        executeBeforeToggle();
        props.togglePage();
      }
    
      return (
          <div>
            <h1>I am Page 1</h1>
            <button onClick={handleClick}>Toggle</button>
          </div>      
        )
    };
    

    所以主要思想是你的点击处理程序应该是一个函数,它按照你需要的顺序执行executeBeforetogglePage 函数。您可以在按钮 onClick 内直接写,或者(如上)创建单独的函数并将其传递给 onClick,这会使代码更具可读性。

    【讨论】:

    • 如何添加一个异步函数const executeBeforeToggle = async() =&gt; { alert('HOORAY') } 然后使用executeBeforeToggle().then(()=&gt;{props.togglePage()}) 只是为了确保函数按照OP 想要的顺序执行?
    • 谢谢,这行得通。实际上,在我的实际代码中,我使用的是打字稿,只是试图创建一个类似的场景。
    • @AtaurRahmanMunna 可以工作,但实际上没有任何意义,因为没有异步功能:) 此外,它会返回一个承诺,所以所有的 es/ts linters 可能会抱怨有未处理的承诺传递给点击处理程序。
    • 接受了答案。对不起,菜鸟的错误,在我的打字稿实际代码中,我只需要将类型从saveDataOrReturn: React.MouseEventHandler&lt;HTMLDivElement&gt;更改为saveDataOrReturn: () =&gt; void。这与我的帖子无关,但您的回复帮助我查明我做错了什么。我认为还有其他方法可以解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-12-29
    • 2016-06-15
    • 2017-04-06
    • 2017-04-15
    • 2011-05-13
    • 1970-01-01
    • 2014-10-15
    相关资源
    最近更新 更多