【问题标题】:React onClick callAll functions syntaxReact onClick callAll 函数语法
【发布时间】:2021-10-22 00:56:28
【问题描述】:

我最近开始更深入地学习 React,因为我无法理解这种语法(我知道是 ES6 的东西),所以有些东西触发了我

所以我得到了这个组件,让我们调用它,这个组件将接收一个 onClick 函数作为带有一个参数的道具,所以我们有 handleClick("clicked")}/>

这个组件,有一个callAll函数,是这样实现的

const callAll = (...fns) => (...args) => fns.forEach(fn => fn && fn(...args))

const Component = ({children: child}) => {
return React.cloneElement(child, {
    onClick: callAll(() => setIsOpen(true), child.props.onClick),
  })
}

我的问题是 ...args 是从哪里来的,'callAll' 的内部函数是如何通过键入 '...args' 神奇地接收每个特定函数的所有 args 的?

希望我自己解释一下,谢谢!

【问题讨论】:

    标签: javascript reactjs ecmascript-6


    【解决方案1】:

    const callAll... 语句创建一个箭头函数,当您调用它时会创建一个箭头函数。在传统的函数语法中,它看起来像这样:

    function callAll(...fns) {
        return function(...args) {
            fns.forEach(function(fn) {
                fn && fn(...args);
            });
        };
    }
    

    因此,您传递的参数callAll 是要调用的函数(它们被收集到fns 数组中)。当您调用它时,您会返回一个函数,该函数将使用任何调用它的参数(收集到 args 数组中)调用所有这些函数:

    const callLogAndError = callAll(console.log, console.error);
    // fns −−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^^^^^^^^^^^^^^^
    callLogAndError(1, 2, 3); 
    // args −−−−−−−−^^^^^^^
    

    活生生的例子:

    const callAll = (...fns) => (...args) => fns.forEach(fn => fn && fn(...args));
    
    const callLogAndError = callAll(console.log, console.error);
    // fns −−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^^^^^^^^^^^^^^^
    callLogAndError(1, 2, 3); 
    // args −−−−−−−−^^^^^^^

    所以稍后,在onclick

    callAll(() => setIsOpen(true), child.props.onClick)
    

    这将创建一个函数,该函数将使用它接收的参数调用这两个函数(对于onClick,这将只是事件的事件对象):

    1. () => setIsOpen(true)
    2. child.props.onClick

    如果没有callAllonClick 也可以这样写:

    onClick: (event) => {
        setIsOpen(true);
        child.props.onClick(event);
    }
    

    【讨论】:

    • 那么,如果我理解只有事件对象会被传递?如果我像我的示例中那样使用组件 handleClick("clicked")}/> ,则 callAll 将调用 handleClick 函数,但“clicked”参数会丢失吗?如果不是,我不明白的是 ...args 如何传播“提取”每个函数调用的参数
    • @SantiArias - 对callAll 的调用创建了一个函数。无论调用该函数是什么设置该函数看到的args。因此,如果您直接连接它 (onClick={theFunctionFromCallAll}),它将接收事件对象。如果您间接连接 (onClick={() => theFunctionFromCallAll("click");}),它将收到 "click"
    • 好的,我想我现在明白了,谢谢您的宝贵时间!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多