Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 在React的onClick事件处理程序中使用curry函数模式的优点和理解_Reactjs - Fatal编程技术网

Reactjs 在React的onClick事件处理程序中使用curry函数模式的优点和理解

Reactjs 在React的onClick事件处理程序中使用curry函数模式的优点和理解,reactjs,Reactjs,我需要一些帮助来理解onClick EventHandler的以下工作代码。在理解为什么一个函数在这里返回另一个函数时,需要进行详细的解释 const MyComponent = (props) => { const onClickHandler = (somearg) => (e) => { console.log(`somearg passed successfully is ${somearg}`) }; return ( <di

我需要一些帮助来理解onClick EventHandler的以下工作代码。在理解为什么一个函数在这里返回另一个函数时,需要进行详细的解释

const MyComponent = (props) => {
  const onClickHandler = (somearg) => (e) => {
       console.log(`somearg passed successfully is ${somearg}`)
  };

  return (
    <div onClick={onClickHandler(somearg)}>
    </div>
  );
};



export default MyComponent;

这就是发生的事情 当代码第一次运行时

const MyComponent = (props) => {
  const onClickHandler = (somearg) => (e) => {
       console.log(`somearg passed successfully is ${somearg}`)
  };

  return (
    <div onClick={onClickHandler('some args')}>
    </div>
  );
};
现在当我们点击div时,上面的函数将被调用

要确保这是实际发生的情况,请参见下文

您将看到时间不同,这意味着单击时间和函数创建时间不同

所以,若在onClick中放入一个函数,它将随着代码的执行而执行,并且不会响应您的单击

const MyComponent = (props) => {
    const onClickHandler = (e) => {
       console.log(`somearg passed successfully is`, new Date().getTime())
    };

    return (
       <div onClick={onClickHandler(new Date().getTime())}>
          div
     </div>
    );
};

这就是发生的事情 当代码第一次运行时

const MyComponent = (props) => {
  const onClickHandler = (somearg) => (e) => {
       console.log(`somearg passed successfully is ${somearg}`)
  };

  return (
    <div onClick={onClickHandler('some args')}>
    </div>
  );
};
现在当我们点击div时,上面的函数将被调用

要确保这是实际发生的情况,请参见下文

您将看到时间不同,这意味着单击时间和函数创建时间不同

所以,若在onClick中放入一个函数,它将随着代码的执行而执行,并且不会响应您的单击

const MyComponent = (props) => {
    const onClickHandler = (e) => {
       console.log(`somearg passed successfully is`, new Date().getTime())
    };

    return (
       <div onClick={onClickHandler(new Date().getTime())}>
          div
     </div>
    );
};

你所指的模式叫做咖喱。我将在后面的答案中解释为什么该模式会有用,但首先让我们尝试确切地了解发生了什么

正如您已经确定的,onClickHandler函数返回一个新函数,它实际上并没有在该函数之外添加太多内容。这意味着当组件呈现时,将立即调用onClickHandler。所以写这篇文章:

最终将返回以下内容:

{console.log`somearg已成功传递为${somearg}`}> 这就是为什么这里允许您在JSX中调用函数的原因,尽管正如您指出的,您在其他大多数时候不能这样做。原因是,返回的函数将实际处理单击

现在,让我们进一步讨论为什么此模式很有用。有些东西是模糊的,但我们会坚持到现在,直到我们得到其他好处

currying使用排序来冻结somearg的值,以供返回的函数使用。查看上面返回函数的示例,somearg似乎不存在。但是,使用闭包时,somearg不仅可用,而且还将保留“test”的值

那么为什么要使用这种模式呢? 此模式允许您以其他不可能的方式重用函数。考虑一个用例,我们有2个DIV应该是可点击的。它们都应该做相同的事情,但是能够区分单击哪个div以完成该操作可能会有所帮助

为了简单起见,假设我们有两个div,当单击时,我们希望每个div都记录它们的顺序

以下是你如何做到这一点而不去讨好:

常量示例==>{ const onClickHandler1=e=>{ console.logI am 1分区。; }; const onClickHandler2=e=>{ console.logI am 2分区。; }; 回来 1. 2. ; } ReactDOM.render,document.getElementById'root';
你所指的模式叫做咖喱。我将在后面的答案中解释为什么该模式会有用,但首先让我们尝试确切地了解发生了什么

正如您已经确定的,onClickHandler函数返回一个新函数,它实际上并没有在该函数之外添加太多内容。这意味着当组件呈现时,将立即调用onClickHandler。所以写这篇文章:

最终将返回以下内容:

{console.log`somearg已成功传递为${somearg}`}> 这就是为什么这里允许您在JSX中调用函数的原因,尽管正如您指出的,您在其他大多数时候不能这样做。原因是,返回的函数将实际处理单击

现在,让我们进一步讨论为什么此模式很有用。有些东西是模糊的,但我们会坚持到现在,直到我们得到其他好处

currying使用排序来冻结somearg的值,以供返回的函数使用。查看上面返回函数的示例,somearg似乎不存在。但是,使用闭包时,somearg不仅可用,而且还将保留“test”的值

那么为什么要使用这种模式呢? 此模式允许您以其他不可能的方式重用函数。考虑一个用例,我们有2个DIV应该是可点击的。它们都应该做相同的事情,但是能够区分单击哪个div以完成该操作可能会有所帮助

为了简单起见,假设我们有两个div,当单击时,我们希望每个div都记录它们的顺序

以下是你如何做到这一点而不去讨好:

常量示例==>{ const onClickHandler1=e=>{ console.logI am 1分区。; }; const onClickHandler2=e=>{ console.logI am 2分区。; }; 复述 N 1. 2. ; } ReactDOM.render,document.getElementById'root';
好啊我的错。我没有特别提到我在寻找什么?我想了解为什么我们要在事件处理程序中传递两个函数。为什么以下事件处理程序代码不能工作?const onClickHandler=somearg=>{console.logsomearg成功传递为${somearg},new Date.getTime}。我的理解是,我们不应该在呈现生命周期内的任何事件处理程序中调用函数,我们应该只像onClick={this.onClickHandler}那样调用它的引用。这里我们调用函数onClick={this.onClickHandler}如果我只传递一个函数,我非常清楚单击不会被执行。但这就是我挠头的地方?另外,为什么我们默认将事件对象作为参数传递给onClick处理程序?此外,我们不应该在render lifecycle方法中调用函数。但是我们在这里调用函数。请参阅为什么每次组件呈现时都调用我的函数?在官方文件中。我仍然在寻找对这个问题的最佳解释。好的。我的错。我没有特别提到我在寻找什么?我想了解为什么我们要在事件处理程序中传递两个函数。为什么以下事件处理程序代码不能工作?const onClickHandler=somearg=>{console.logsomearg成功传递为${somearg},new Date.getTime}。我的理解是,我们不应该在呈现生命周期内的任何事件处理程序中调用函数,我们应该只像onClick={this.onClickHandler}那样调用它的引用。这里我们调用函数onClick={this.onClickHandler}如果我只传递一个函数,我非常清楚单击不会被执行。但这就是我挠头的地方?另外,为什么我们默认将事件对象作为参数传递给onClick处理程序?此外,我们不应该在render lifecycle方法中调用函数。但是我们在这里调用函数。请参阅为什么每次组件呈现时都调用我的函数?在官方的回应文件中。我仍然在寻找对这个问题的最佳解释。这正是我想要的。谢谢。现在让我详细阅读一下咖喱。你避免枯燥的例子让事情变得清晰而全面。这正是我想要的。谢谢。现在让我详细阅读一下咖喱。你的例子,以避免干燥的事情清楚和全面。